Главная Категории Контакты Поиск

Как отформатировать feature ветки с помощью git rebase -i

Узнай, как можно почистить feature ветки от ненужных коммитов с помощью `git rebase -i`.

Git·16.07.2019·читать 2 мин 🤓·Автор: Alexey Myzgin

Существует хорошая практика - пока работаем над своей веткой, коммиты делаем как можно чаще. Это помогает отслеживать все наши изменения, а также иметь резервную копию для перехода, на случай, если что-то пойдет не так, как надо. Однако, такие ветки с десятками коммитов (которые могут не иметь смысла) трудно объединить и просмотреть. Поэтому, мы можем использовать interactive rebase для настройки нашей истории git.

Например, мы работаем над веткой, следуя лучшей практике, которая заключается в том, чтобы коммиты делаем как можно чаще. Это действительно полезно. Таким образом, у нас всегда есть резервная копия на случай, если что-то пойдет не так. Мы всегда можем вернуться назад и возобновить работу.

Однако, коммитов много и они плохо за-документированы.

Если мы хотим отправить наши изменения на рассмотрение, потому что наша разработка закончена, мы не хотим помещать все это в pull request. Коллеги, должны будут пройти через все эти комментарии, которые в конце концов даже не имеют смысла.

Перед merge или перед отправкой на рецензирование, стоит очистить нашу ветку от ненужных сообщений, от тех которые не имеют смысла.

Проведем рефакторинг до нужного нам коммита. Для этого копируем идентификатор комментария, например: 75a4839. Затем можем сделать rebase interactive с -i.

Для того что бы посмотреть все коммит сообщения и информацию о них, нужно выполнить git log или git lg, подробнее тут.

git rebase -i 75a4839

Теперь мы получаем представление всех комментариев, которые произошли, начиная от этого хэша. Мы можем увидеть ключевые слова pick, которые сообщают Git, что делать с соответствующим комментарием. Ниже видим различные комманды.

Давай очистим нашу историю. Например, первый коммит мы хотим перефразировать. Используем r - reword: берём коммит, но редактируем коммит сообщения.

В следующих 2х коммитах мы хотим удалить коммит сообщения, но при этом сохранить изменения, которые произошли. Используем fixup или f. Он похож на squash, который использует комментарий, но смешивает его с предыдущим комментарием. fixup убирает лог-сообщение комментария.

r b0cd0a3 add intro section text
f 1cb9b9b wip: intro section
f 1972a3a ..

# Rebase 75a4839..1972a3a onto 75a4839 (3 commands)
#
# Commands:
# p, pick <commit> = use
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup <commit> = like "squash", but discard this commit's log message
# x, exec <command> = run command (the rest of the line) using shell
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]

Далее закрываем наш редактор, используя :wq. Теперь мы автоматически переходим к интерактивному перебазированию первого комментария. Это происходит потому, что мы указали r - reword. Здесь мы просто меняем сообщение коммита. Что бы внести изменения нужно нажать клавишу i.

сообщение_коммита

# Пожалуйста, введите сообщение коммита для ваших изменений. Строки,
# начинающиеся с «#» будут проигнорированы, а пустое сообщение
# отменяет процесс коммита.
#
#
# интерактивное перемещение в процессе; над 75a4839
# Последняя команда выполнена (1 команда выполнена):
#    reword b0cd0a3 add intro section text
# Следующая команда для выполнения (2 команды осталось):
#    fixup 1cb9b9b wip: intro section
#    fixup 1972a3a ..
# Вы сейчас редактируете коммит при перемещении ветки  «имя_ветки» над «75a4839».
#
# Изменения, которые будут включены в коммит:

Затем мы сохраняемся через :wq. Все остальные комментарии будут просто объединены поверх него.

Website, name & logo
Copyright © 2022. Alex Myzgin