web-dev-qa-db-fra.com

Pourquoi mon histoire git ressemble à un arbre de Noël?

En faisant git log --decorate --oneline --graph dans l'un de nos dépôts peu avant Noël, nous avons constaté que la structure suivante était apparue (tournée pour souligner le thème festif ténu):

redacted git log output, rotated to look like a Christmas tree

Comment ce modèle dans le graphique de validation est-il apparu?

C'est délibérément un peu idiot, bien sûr, mais il y a un point intéressant ici - il est souvent difficile de voir comment interpréter des modèles particuliers dans le graphique de validation lorsque vous les voyez dans votre navigateur d'historique git.

69
Mark Longair

Dans ce cas, la situation était qu'il y avait un commit non poussé à l'extrémité de la branche master dans un clone du référentiel. Ensuite git pull a été exécuté plusieurs fois dans le même référentiel, sur une période de temps où de nombreux nouveaux travaux étaient effectués en amont. (Dans ce cas, cela s'est produit à cause d'un script automatisé, mais la même chose peut se produire si un développeur tire simplement à plusieurs reprises dans une branche afin de la garder à jour, plutôt que, disons, de rebaser.)

Chaque pull quand il y avait de nouvelles validations en amont créait une nouvelle validation de fusion, car il y avait toujours une validation dans master qui n'était pas dans master en amont.

Finalement, l'historique de la branche principale de ce référentiel a été poussé en amont, de sorte que d'autres développeurs ont vu cette structure dans le graphique de validation apparaître soudainement lors de leur prochaine extraction du référentiel en amont.

Si vous avez un historique avec une structure similaire et que vous voulez savoir quel commit/développeur est à l'origine de ce problème, vous pouvez simplement regarder la ligne avec les étoiles (essentiellement en suivant le premier parent de chaque fusion) jusqu'à ce que vous arriviez à le premier commit sans fusion. Dans le cas de l'image, c'était b275805 - le commit qui aurait dû être poussé plus tôt.

C'est une des raisons pour lesquelles les gens préfèrent souvent utiliser git pull --rebase - il garde votre histoire non poussée simple.

Pour rendre hommage à son dû, mon collègue Matthew Somerville l'a repéré et a déterminé ce qui se passait.

36
Mark Longair