Сгладить фиксации на ветке
Можно ли конденсировать коммиты на ветке в одну фиксацию до слияния с основной? Я думал, что это будет довольно распространенный сценарий, но, возможно, я не использую правильные условия поиска.
Я объясню сценарий более подробно. Часто я хотел бы сделать много локальных коммитов, работая над изменением в филиале, чтобы убедиться, что у меня есть полная история изменений. Но однажды с изменениями в ветке, когда я схожу к основному, я хотел бы уменьшить коммиты на ветке до одного, а затем объединить его в main. Я понимаю, что коммиты недороги в Git, но в некоторых ситуациях я могу просто предпочесть сделать это.
* merge to main
|\
* | commit 2 on main
* | commit 1 on main
| * commit 2 on branch
| * commit 1 on branch
|/
* branch from main
чтобы выглядеть как
* merge to main
|\
* | commit 2 on main
* | commit 1 on main
| * commit on branch (branch commits flattened to one)
|/
* branch from main
Я начинаю, когда дело доходит до git. Если я ошибаюсь в использовании терминов, я извиняюсь.
Ответы
Ответ 1
Используйте интерактивную перезагрузку. Найдите фиксацию, в которой ваша ветвь отклонилась от ведущего (может использоваться git merge-base
, позвоните в commit <diverge>
), затем
git rebase -i <diverge>
и появится редактор, позволяющий вам переписать историю в интерактивном режиме. Вы захотите совершить сквош.
Ответ 2
Я бы посоветовал учиться использовать интерактивную rebase, но в случае, если вам кажется слишком сложным, вы можете просто использовать
git reset --soft <diverging-commit>
чтобы отменить все фиксации до точки расхождения без изменения индекса, и
git commit -s
чтобы сделать единую фиксацию всех изменений.
Ответ 3
Вы также можете использовать git merge --squash <branch>
для объединения ветки без каких-либо фиксаций:
$ git checkout master
$ git merge --squash mybranch
...
Squash commit -- not updating HEAD
Automatic merge went well; stopped before committing as requested
$ git commit
Конечно, вы должны противостоять желанию сделать это, если сможете это сделать. См. Не лгать: git переформатировать, изменить, сквош и другую ложь для обсуждения того, почему.
Ответ 4
Посмотрите git rebase
. Опция -i
дает вам возможность редактировать, сквош (то, что вы хотите) или даже удалять, совершает.
Например, способ, которым я его использую, обычно таков:
git rebase -i origin/master
....
git push