2011-01-05 2 views
43

Обычно я работаю с ветвями в Git, но мне не нравится видеть сотни ветвей в моем рабочем дереве (история Git). Мне интересно, есть ли в Git метод «присоединить» все коммиты в ветви только в одном коммите (в идеале с четким сообщением о коммите).Git: Объединить только одну фиксацию

Что-то вроде этого:

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" 

После этого, только «супер совершить» будет существовать в журнале мерзавца.

ответ

41

Это может быть сделано с помощью git rebase и сквош, или с помощью git merge --squash см

Git merge flattening

и

git: squash/fixup earlier commit

+2

git merge --squash поразительно. Хотелось бы, чтобы я более внимательно прочитал это в 2011 году;) +1 –

+6

Проблема с 'git merge -squash' заключается в том, что она фактически не создает слияние. Графические интерфейсы, такие как сетевой просмотрщик GitHub, не будут отображать ветви, воссоединившиеся; один просто закончится внезапно, а другой продолжит. – Maxpm

66

Это звучит, как вы ищете --squash варианта git-merge:

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

+1 Сексуальный ответ! – JohnnyQ

+0

красивый спасибо! – Denis

+3

Возможно, это работало в прошлом, но это не работает. (git v1.7.9) Сообщение «Fast-forward (no commit created; -m option ignored)» выводится, и я оставляю незафиксированное изменение. Опция '--no-ff' выглядела многообещающей, но все же создавала слияние со всеми отдельными коммитами. –

13

Если вы уверены, что хотите получить только одно коммит и отлично с веткой, которая никогда не будет помечена как «слитая» (возможно, потому, что вы собираетесь удалить ее с помощью git branch -D my-squash-merged-branch и никогда не захотите ее видеть), используйте это:

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

Однако, после долгих испытаний, я считаю, что лучший способ объединить наиболее ветвей:

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

Это позволяет избежать «быстро вперед» объединить, что запрещает задающий -m "message" вариант для многих сливается. Это не Фактически обеспечивает единую фиксацию, как первоначально запрошено, но, по крайней мере, позволяет легко увидеть начало/конец ветви и, таким образом, сделать легкие реверты и т. П. git log покажет все отдельные коммиты, которые были слиты ...

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 
... 

... но если вы посмотрите на графе бревна (git log --graph), вы можете увидеть, что мерзавец действительно признает его единственное слияние.

* 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 
... 

Если совершает или другая деятельность происходит на главной ветви, график будет показывать слита ветвь, начиная с правильным местом и соединение в текущей голове, но, конечно, все коммиты все равно будут отображаться в журнале с совершает переход от ветви наверху.

+0

Работает, как я думал, 'git merge -squash' будет работать. – r0hitsharma