Ответ 1
Это можно сделать, используя git rebase
и squash, или используя git merge --squash
, см.
и
Обычно я работаю с ветвями в Git, но мне не нравится видеть сотни ветвей в рабочем дереве (Git history). Мне интересно, существует ли метод в 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 будет существовать только "супер-фиксация".
Это можно сделать, используя git rebase
и squash, или используя git merge --squash
, см.
и
Похоже, вы ищете опцию --squash
git-merge
:
git checkout master
git merge --squash branch -m "super commit"
Если вы уверены, что хотите только одно коммитирование и отлично с ветвью, которая никогда не будет помечена как "слитая" (возможно, потому, что вы собираетесь удалить ее с помощью 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"
Это позволяет избежать слияния "fast-forward", которое запрещает задание параметра -m "message"
для многих слияний. На самом деле, он не обеспечивает отдельную фиксацию, как первоначально запрашивалось, но, по крайней мере, позволяет легко видеть начало/конец ветки и, таким образом, упрощает процесс возврата и т.п. A 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
), вы увидите, что git действительно распознает его как одно слияние.
* 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
...
Если на главной ветке происходят коммиты или другие действия, на графике будет отображаться объединенная ветка, начиная с правильного места и соединяющейся с текущей головой, но, конечно, все фиксации все равно будут отображаться в журнале с фиксацией из ветки находясь наверху.