44 votes

Git: Fusionner dans un seul commit

D'habitude, je travaille avec des branches dans Git, mais je n'aime pas voir des centaines de branches dans mon arbre de travail (historique de Git). Je me demande s’il existe une méthode dans Git pour "joindre" tous les commits d’une branche en un seul (dans l’idéal, avec un message de validation clair).

Quelque chose comme ça:

 git checkout -b branch
<some work>
git commit -a -m "commit 1"
<some work>
git commit -a -m "commit 2"
<some work>
git commit -a -m "commit 3"
git checkout master
git SUPER-JOIN branch -m "super commit"
 

Après cela, seul le "super commit" existera dans le journal git.

68voto

Greg Hewgill Points 356191

On dirait que vous êtes à la recherche pour le --squash option git-merge :

 git checkout master
git merge --squash branch -m "super commit"
 

41voto

tonio Points 5773

Ceci peut être fait en utilisant git rebase et squash, ou en utilisant git merge --squash , voir

Git fusionner aplatir

et

git: écraser mon commit?

14voto

Brian White Points 2493

Si vous êtes positif, vous souhaitez qu'une seule commettre et sont très bien avec la direction générale de ne jamais être marqué comme "fusionné" (peut-être parce que vous êtes sur le point de le supprimer avec git branch -D my-squash-merged-branch et ne veux plus jamais le voir encore une fois), utilisez ceci:

git checkout master
git merge --squash branch-to-merge
git commit -m "message for commit"

Cependant, après beaucoup d'essais, je crois que le meilleur moyen de fusionner la plupart des branches est:

git checkout master
git merge --no-ff branch-to-merge -m "message for commit"

Cela évite le "fast-forward" fusion qui n'autorise pas la spécification d'un -m "message" option pour de nombreuses fusions. Il n'a pas fait de fournir un seul s'engager en tant qu'origine de la demande, mais au moins, il est facile de voir le début/fin de la branche et ainsi de le rendre facile pour les annulations et les comme. Un git log montrera tous les commits qui ont fusionné...

commit a6672a4c3d90c35d5f39c45f307ef6b385660196
Merge: 015f8d6 f84e029
Author: Brian White <bcwhite@example.com>
Date:   Wed Jan 15 20:47:35 2014 -0500

    merged something trivial

commit f84e02915faa02afc9a31b8c93a6e7712420687d
Author: Brian White <bcwhite@example.com>
Date:   Wed Jan 15 20:47:12 2014 -0500

    added something also trivial

commit 904d5b5ff00d691d63104a77d2e2ca484732a5fb
Author: Brian White <bcwhite@example.com>
Date:   Wed Jan 15 20:46:26 2014 -0500

    added something trivial

commit 015f8d681bdaf65725067ee8058215cedb529dd6
Author: Brian White <bcwhite@example.com>
Date:   Wed Jan 15 20:23:31 2014 -0500

    optimizations to MyThing
...

... mais si vous regardez un graphique du journal (git log --graph), vous pouvez voir que git n'est en effet reconnaître comme une simple fusion.

*   commit a6672a4c3d90c35d5f39c45f307ef6b385660196
|\  Merge: 015f8d6 f84e029
| | Author: Brian White <bcwhite@example.com>
| | Date:   Wed Jan 15 20:47:35 2014 -0500
| |
| |     merged something trivial
| |
| * commit f84e02915faa02afc9a31b8c93a6e7712420687d
| | Author: Brian White <bcwhite@example.com>
| | Date:   Wed Jan 15 20:47:12 2014 -0500
| |
| |     added something also trivial
| |
| * commit 904d5b5ff00d691d63104a77d2e2ca484732a5fb
|/  Author: Brian White <bcwhite@example.com>
|   Date:   Wed Jan 15 20:46:26 2014 -0500
|
|       added something trivial
|
* commit 015f8d681bdaf65725067ee8058215cedb529dd6
| Author: Brian White <bcwhite@example.com>
| Date:   Wed Jan 15 20:23:31 2014 -0500
|
|     optimizations to MyThing
...

Si une validation ou une autre activité qui se passe sur la branche master, le graphique permet d'afficher la fusion de la branche de départ à la bonne place et de rejoindre le courant de la tête, mais bien sûr tous les commits seront toujours affichées dans le journal avec les commits de la branche être au top.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X