web-dev-qa-db-fra.com

Aplatissement de la fusion Git

Si je travaille dans plusieurs branches sur une seule fonctionnalité, j'utilise git pull branch1 branch2 branch3 pour insérer toutes les modifications dans ma branche principale. Cependant, tous les journaux de validation de chaque branche sont également copiés. Comment aplanir le journal de validation en un seul message?

41
Verhogen

Vous pouvez utiliser interactif rebase et "squash" les commits - voir aussi Git Ready Tutorial on squashing via rebase . Désolé de simplement vider un lien sur vous, mais c'est un tutoriel assez complet. Oh, et cela éliminera également très bien vos fusions.

25
Pat Notz

"git merge --squash" (après "git fetch"; "git pull" est juste fetch + merge, peut-être qu'il autorise également l'option --squash) pourrait sois qui tu veux.

De git-merge (1) :

--écraser

Produisez l'arborescence de travail et l'état d'index comme si une fusion réelle s'était produite, mais ne faites pas de commit ni ne déplacez le HEAD, ni n'enregistrez $GIT_DIR/MERGE_HEAD pour que la prochaine commande git commit crée un commit de fusion. Cela vous permet de créer un commit unique au-dessus de la branche actuelle dont l'effet est le même que la fusion d'une autre branche (ou plus dans le cas d'une pieuvre).

71
Jakub Narębski

Comme Brian White a commenté le problème avec git merge --squash est qu'il ne vous donne aucun lien visible, et donc aucune traçabilité vers la branche (ou les modifications individuelles) dans laquelle vous avez fusionné.

Visiblement (lorsqu'il est affiché sous forme de graphique git log --graph), une branche importante qui a été fusionnée ne ressemble pas à une branche expérimentale avec laquelle vous avez joué et que vous rejetteriez avec plaisir. Les deux sont juste suspendus là, sans lien avec rien. Personnellement, je veux savoir qu'une certaine branche a été fusionnée, je sais donc que le travail est fait.

Une solution qui fonctionne pour moi consiste à utiliser une fusion avec l'option no fastforward.

git merge --no-ff somebranch -m "my commit message"

Cela oblige git à créer un seul commit avec toutes les modifications de branche incluses, vous pouvez définir le message de commit vous-même (si vous le souhaitez) MAIS plus important encore, il relie le nouveau commit à la branche dans laquelle il vient d'être fusionné. Cela montre visiblement que le travail sur cette branche est terminée, mais vous permet également de remonter pour voir les détails des validations individuelles de la branche fusionnée.

Voici un exemple où des branches très simples avec respectivement un et deux commits ont été réintégrées dans master. J'ai ensuite supprimé les balises de branche sur les branches fusionnées, mais le nom de la branche est toujours visible sur le message de validation de fusion. Le nom de la branche doit résumer les modifications et si vous souhaitez connaître les modifications exactes contenues, vous pouvez le retracer jusqu'aux validations individuelles. Cette approche semble bien fonctionner pour des projets simples.

Remarque: j'ai dû dessiner manuellement l'un des connecteurs car il était si bleu foncé qu'il était à peine visible.

git log output

8
samaspin