Как раздавить ваши коммиты, если не быть вашими последними
Казалось, легко раздавить ваши коммиты, если это ваши последние ( 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'
,