Git: объединить только один коммит - PullRequest
44 голосов
/ 05 января 2011

Обычно я работаю с ветками в 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"

После этого в журнале git будет существовать только "супер коммит".

Ответы [ 3 ]

68 голосов
/ 05 января 2011

Звучит так, будто вы ищете --squash вариант git-merge:

git checkout master
git merge --squash branch -m "super commit"
41 голосов
/ 05 января 2011

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

Git Merge Flatting

и

git: squash / fixup ранее коммит

14 голосов
/ 16 января 2014

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

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

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

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

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

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

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

...