November 17, 2019

[RUS] Git Rebase

Danger: Отсутсвие бэкапов может привести к лютому батхерту.

Кратко

$ git log # смотрим кол-во последних коммитов для объединения, например 2
$ git rebase -i HEAD~2 # оставляем верхний в pick, остальные в squash (кратко s), редактируем сообщение
$ git log # проверяем все ли как надо
$ git push --force # заливаем

Развернуто

1. Смотрим коммиты командой git log:

В нашем случае последние 2 коммита нужно объединить в один.

2. Пишем что хотим изменить

Пишем что хотим изменить 2 последних коммита от HEAD

git rebase -i HEAD~2

(проще запомнить так, но на самом деле это не изменение истории а перемещение и мы говорим что хотим работать с 3м коммитом сверху)

Открывается список коммитов в редакторе с возможность обозначить что вы хотите с ними сделать:

Сделать можно многое, в нашем случае мы просто их сливаем (уплотняем - squash), верхний всегда в pick:

3. Отредактировать объединенное сообщение

Следующим этапом нам дают отредактировать объединенное сообщение:

Не обращаем внимание на комментарии и оставляем единственное ценное сообщение:

4. Если все успешно

Если все успешно получаем сообщение такого вида:

5. Перепроверить

После я советую еще раз перепроверить историю командой git log, если все хорошо можно пушить:

6. Force push

В моем случае я уже запушил предыдущий коммит и теперь мне нужно перезаписать историю на сервере, поэтому я пишу git push --force:


Примечания

  • Пока вы не отточили навык, всегда создавайте резервную ветку что бы не потерять историю изменений, например git checkout -b feature/name-backup && git checkout feature/name
  • Если между коммитами которые вы хотите объединить был мерж другой ветки, то не стоит это делать, процесс становится намного сложнее.
  • Иногда лучше избежать rebase. Если вы делаете новый коммит сразу, то проще сделать "amend commit" (поставив галочку в ide или через косноль добавив --amend).
  • В случае если пуш был уже сделан, то делаете push --force (это разрешается в ветках feature/*), тем самым вы перезаписываете древо коммитов на сервере.
  • Если что-то пошло не так и rebase не выполняется всегда можно вернуться к началу командой git rebase --abort

Подробнее можно прочитать тут: https://git-scm.com/book/ru/v1/Инструменты-Git-Перезапись-истории#Изменение-сообщений-нескольких-коммитов