Skip to content

Split a commit

Ilya Zverev edited this page Mar 17, 2016 · 1 revision

Иногда некоторые эээ участники нашей команды просят разбить коммит на несколько, чтобы разные файлы шли в разных коммитах. Это муторно, но не слишком сложно.

Сначала достаньте ветку, с которой делаете пул-реквест:

git checkout super_pr

Проверьте историю коммитов:

git log --oneline | head

Если нужно поправить только последний коммит, переходите сразу к git reset. Иначе нужно делать интерактивный рибейз. Здесь число — это количество коммитов с конца, которые нужно поправить. Будьте осторожны, не зацепите чужие коммиты.

git rebase -i HEAD~2

Прежде всего, на любом этапе рибейза можно откатить правки командой git rebase --abort. После верхней команды откроется редактор, где нужно напротив коммитов, что разбиваем, заменить pick на e (от edit). Сохраняем и выходим. Рибейзер будет останавливаться на каждом отмеченном коммите.

Для каждого файла, что нужно вытащить из коммита, выполняем:

git reset HEAD~ path/to/filename.ext

Затем сохраняем коммит без вытащенных файлов:

git commit --amend

И делаем коммит с новыми файлами (если нужно):

git add path/to/filename.ext
git commit -m "A super descriptive comment"

В противном случае файлы нужно восстановить (если изменения важны, сохраните их где-нибудь в другом месте):

git checkout -- path/to/filename.ext

Наконец, продолжаем рибейз до победного:

git rebase --continue

Когда дошли до конца, форспушим в свою ветку. Внимание: в замёрженную ветку форспушить нельзя! В мастер форспушить нельзя!

git push --force origin super_pr
Clone this wiki locally