Je travaille actuellement pour une entreprise qui utilise VSTS pour gérer le code git. La méthode "recommandée" de Microsoft pour fusionner une branche consiste à effectuer une "fusion de squash", ce qui signifie que toutes les validations pour cette branche sont écrasées dans une nouvelle validation incorporant toutes les modifications.
Le problème est, que se passe-t-il si je fais des changements dans une branche pour un élément de backlog, puis que je veux immédiatement commencer à faire des changements dans une autre branche pour un autre élément de backlog, et ces changements dépendent du jeu de changements de la première branche?
Je peux créer une branche pour cet élément de backlog et la baser sur la première branche. Jusqu'ici tout va bien. Cependant, quand vient le temps de créer une demande de tirage pour moi, la deuxième branche, la première branche a déjà été fusionnée dans master et parce que cela a été fait comme une fusion de squash, git signale un tas de conflits. C'est parce que git ne voit pas les validations d'origine sur lesquelles la deuxième branche était basée, il voit juste la fusion d'un seul gros squash et donc afin de fusionner la deuxième branche pour la maîtriser, il essaie de rejouer toutes les validations de la première branche dans sommet de la fusion de squash, provoquant de nombreux conflits.
Donc ma question est, existe-t-il un moyen de contourner cela (autre que de ne jamais baser une branche de fonctionnalité sur une autre, ce qui limite mon flux de travail) ou la fusion de squash brise-t-elle simplement l'algorithme de fusion de git?
feature1
sur le maître, puis souhaitez fusionnerfeature2
plus tard. Dans ce cas, la première approche n'entraînerait-elle pas de conflits alors que git essaie defeature1
réappliquer les validations au-dessus de la validation écrasée, tandis que la seconde permettrait à git de déterminer que ces validations n'ont pas besoin d'être fusionnées?git clone
ing le repo et en copiant mes fichiers modifiés!) Parce que j'ai ramifié à partir d'une branche puis le mainteneur a écrasé la première branche. À mon travail, ils font également des fusions de squash. Cela signifie que je ne peux pas travailler sur une fonctionnalitéb
qui dépend de la fonctionnalitéa
tant que la fonctionnalitéa
n'est pas fusionnée.La fusion de squash interrompt l'algorithme de fusion pour toutes les branches contenant des commits supprimés par le squash. Autrement dit, les rebases sont virales. Si vous rebase une branche, vous devez rebaser toutes les autres branches qui dépendent de cette branche. Si vous utilisez rerere , les conflits de fusion que vous avez résolus manuellement dans votre référentiel local n'auront plus besoin d'être résolus manuellement, mais cela n'aide pas les conflits résolus par d'autres personnes.
C'est pourquoi notre règle non écrite ici est qu'il est correct de squash tant que personne d'autre n'a jamais dépendu de votre branche de fonctionnalité, ce qui est peut-être le cas dans 90% des cas. Sinon, une fusion directe aide tout le monde à éviter les problèmes.
la source
feature-xyz
branche. Vous pouvez créer unefeature-xyz-squashed
branche commençant au même commit que lafeature-xyz
branche,git cherry-pick
les validations defeature-xyz
àfeature-xyz-squashed
, les écraser là et fusionnerfeature-xyz-squashed
versmaster
. Vous ne devriez pas fusionnerfeature-xyz
alors. Parfois, ce qui précède est logique (par exemple, vous ne voulez pas inclure les validations avec un mot de passe intégré), mais c'est une solution de contournement, à peine une meilleure pratique.