[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-Перезапись-истории#Изменение-сообщений-нескольких-коммитов