Как раздавить ваши коммиты, если не быть вашими последними

Казалось, легко раздавить ваши коммиты, если это ваши последние ( Squash мои последние X коммитов вместе с помощью Git)

Но что если я захочу раздавить несколько коммитов моего репо, которые не являются последними, скажем HEAD~3 в HEAD~6,

Есть ли способ сделать это?

3 ответа

Решение

Это можно сделать, выполнив интерактивную перебазировку.

Если у вас есть филиал master при совершении A, а потом вы создали ветку my-branch с коммитами B, C, D, E, а также F, Вы хотите сквош коммитов B, C, а также D в B',

Убедитесь, что ваша текущая ветка my-branchи начните интерактивную перебазировку:

git rebase -i master

Это откроет ваш редактор со списком коммитов, которые будут применены. Каждая строка представляет один коммит, а первое слово в этой строке говорит о команде, которую нужно выполнить с этим коммитом. Оставьте первый коммит (B) как pickи измените команды для следующих двух коммитов (C а также D) чтобы squash, Сохраните и закройте редактор.

После того, как git завершил обработку, фиксирует B, C, а также D, новый редактор откроется с сообщением коммита для нового коммита B', Он будет содержать комбинацию сообщений коммита от оригинальных коммитов, но вы можете изменить его на любое другое. Как только вы подтвердите сообщение о коммите, сохраните и закройте редактор.

Как только git завершит обработку остальных коммитов на ветке my-branch, направляет на my-branch будет B', E, а также F,

Обратите внимание, что вы должны делать перебазирование, только если вы не выдвинули свои коммиты. Перебазировка изменит хэши ваших коммитов, что вызовет проблемы, если кто-то уже вытащил оригинальные коммиты.

git rebase -i HEAD~6

Затем в интерактивном редакторе положите squash (Вы можете сократить до s) перед коммитами вы хотите раздавить и оставить остальных как pick,

Пример:

pick 043af87 message
s    8c0fa0e message
s    b6c7116 message
pick c5d91a3 message
pick f20898f message
pick edcbad2 message

Если вы не опубликовали ветку, вы можете переписать ее историю без каких-либо побочных эффектов.

Предположим, что история A-B-C-D-E-F-G-H-I и цель состоит в том, чтобы раздавить C-D-E-F-G,

git checkout -b squash_branch G
git reset C --soft
git commit
git cherry-pick H I

Новая история будет A-B-S-H'-I',

Другие вопросы по тегам