2011-01-05 1 views
43

Normalerweise arbeite ich mit Zweigen in Git, aber ich mag es nicht, Hunderte von Zweigen in meinem Arbeitsbaum (Git-Geschichte) zu sehen. Ich frage mich, ob es eine Methode in Git gibt, um alle Commits in einem Zweig in nur einem Commit zu verbinden (idealerweise mit einer Clear-Commit-Nachricht).Git: Zusammenführen in nur einem Commit

Etwas wie folgt aus:

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" 

Danach wird nur "Super begehen" im git log existieren.

Antwort

41

Dies kann mit git rebase und Squash oder mit git merge --squash erfolgen, siehe

Git merge flattening

und

git: squash/fixup earlier commit

+2

Git Merge - Squash ist erstaunlich. Ich wünschte, ich hätte das 2011 genauer gelesen;) +1 –

+6

Das Problem mit 'git merge --squash' ist, dass es eigentlich kein Merge-Commit erzeugt. GUIs wie GitHubs Netzwerk-Viewer zeigen die Zweige nicht wieder; man wird einfach abrupt enden, während der andere fortfährt. – Maxpm

66

Es klingt wie Sie für die --squash Option von git-merge suchen:

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

+1 Sexy Antwort! – JohnnyQ

+0

schönen danke! – Denis

+3

Das mag in der Vergangenheit funktioniert haben, aber es funktioniert nicht mehr. (git v1.7.9) Die Nachricht 'Fast-forward (kein Commit erstellt; -m Option ignoriert)' wird ausgegeben und es verbleibt eine nicht festgeschriebene Änderung. Die '--no-ff'-Option sah vielversprechend aus, schaffte aber dennoch eine Zusammenführung mit allen einzelnen Commits. –

13

Wenn Sie sich sicher sind, dass Sie nur einen einzigen Commit wünschen und der Zweig nie als "fusioniert" markiert ist (vielleicht weil Sie ihn mit git branch -D my-squash-merged-branch löschen wollen und ihn nie wieder sehen wollen), verwenden Sie Folgendes:

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

Doch nach viel getestet, ich glaube, der beste Weg, meisten Filialen zu verschmelzen ist:

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

Dies vermeidet die „vorspulen“ merge, die eine -m "message" Option für viele verweigert das Spezifizieren verschmilzt. Es ist nicht eigentlich bieten einen einzigen Commit wie ursprünglich angefordert, aber zumindest macht es einfach, den Beginn/Ende der Branche zu sehen und so für einfache Rückgaben und dergleichen zu machen. Ein git log zeigt alle einzelnen Commits, die ... verschmolzen wurden

commit a6672a4c3d90c35d5f39c45f307ef6b385660196 
Merge: 015f8d6 f84e029 
Author: Brian White <[email protected]> 
Date: Wed Jan 15 20:47:35 2014 -0500 

    merged something trivial 

commit f84e02915faa02afc9a31b8c93a6e7712420687d 
Author: Brian White <[email protected]> 
Date: Wed Jan 15 20:47:12 2014 -0500 

    added something also trivial 

commit 904d5b5ff00d691d63104a77d2e2ca484732a5fb 
Author: Brian White <[email protected]> 
Date: Wed Jan 15 20:46:26 2014 -0500 

    added something trivial 

commit 015f8d681bdaf65725067ee8058215cedb529dd6 
Author: Brian White <[email protected]> 
Date: Wed Jan 15 20:23:31 2014 -0500 

    optimizations to MyThing 
... 

... aber wenn Sie bei einem Diagramm sehen des log (git log --graph), können Sie, dass git sehen in der Tat es nicht erkennt als eine einzelne Zusammenführung.

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

Wenn begeht oder eine andere Aktivität geschieht auf dem Master-Zweig, wird die Kurve, die die fusionierte Zweig zeigt an der richtigen Stelle beginnt und bei dem aktuellen Kopf Beitritt aber natürlich alle Commits noch mit der im Protokoll angezeigt werden legt fest, dass der Zweig an der Spitze ist.

+0

Werke wie ich dachte 'git merge --squash' würde funktionieren. – r0hitsharma