-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Split a commit
Иногда некоторые эээ участники нашей команды просят разбить коммит на несколько, чтобы разные файлы шли в разных коммитах. Это муторно, но не слишком сложно.
Сначала достаньте ветку, с которой делаете пул-реквест:
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