2017-01-26 28 views
0

Это казалось легко раздавить ваши коммиты, если это ваш недавний (Squash my last X commits together using Git)Как сквош ваших коммитов, когда не ваш недавние

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

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

+0

Ответ в точности такой же, как и в вопросе, который вы цитируете: –

+0

Вы правы @ChrisMaes, не осознавали этого, спасибо – vaskort

ответ

2

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

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

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

git rebase -i master 

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

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

После того, как мерзавец закончит обработку остальных фиксаций на ветке my-branch, совершающий на my-branch будет B', E и F.

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

+0

, который был чистым помощником, спасибо – vaskort

0

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

Предпочитаете историю 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'.

1
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