Подтвердить что ты не робот

Сгладить фиксации на ветке

Можно ли конденсировать коммиты на ветке в одну фиксацию до слияния с основной? Я думал, что это будет довольно распространенный сценарий, но, возможно, я не использую правильные условия поиска.

Я объясню сценарий более подробно. Часто я хотел бы сделать много локальных коммитов, работая над изменением в филиале, чтобы убедиться, что у меня есть полная история изменений. Но однажды с изменениями в ветке, когда я схожу к основному, я хотел бы уменьшить коммиты на ветке до одного, а затем объединить его в 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. Если я ошибаюсь в использовании терминов, я извиняюсь.

4b9b3361

Ответ 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