Почему Пользователи Git Редактируют Свои Коммиты?

В двух последних выпусках «Радио Т» ведущие пытались обсудить ГИТ.

Евгений (@Umputun) поинтересовался, зачем нужен rebase и очень удивился, когда я спросил, редактирует ли он коммиты.

На мой взгляд, чтобы понять GIT, достаточно углубиться в процесс разработки ядра Linux, поскольку оно создано именно для этой цели.

Посмотрим, как изменения попадают в основной репозиторий.

Разработчик клонирует git и приступает к разработке нового функционала.

В процессе разработки он пишет код, тестирует, находит ошибки и исправляет их.

Вероятно, делает определенное количество коммитов.

Когда фича готова, вы не можете просто отправить все эти коммиты в виде патчей, как не можете отправить все это в виде одного патча.

Следующая цель разработчика — разложить все изменения таким образом, чтобы это было понятно сопровождающему и другим членам команды.

В этом процессе есть несколько правил: каждый патч содержит только одно логическое изменение; каждый патч не должен быть деструктивным; Сообщение о коммите должно описывать изменения как можно подробнее.

Эта двойная работа имеет свою мотивацию.

Обзор патчей — не самое увлекательное и интересное занятие, поэтому каждый должен постараться максимально упростить этот процесс.

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

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

Чаще всего я создаю новую ветку, откатываю все коммиты (git reset) и начинаю ломать с помощью git commit --interactive. Эта команда позволяет вам выбрать, какие изменения будут переданы в какой коммит. Когда все будет готово, патчи можно сгенерировать с помощью команды git format-patch и отправить с помощью git send-email. Хорошо, если патчи были приняты сразу, но иногда кто-то находит в них ошибки и просит добавить комментарии или еще что-то исправить.

В этом случае нам понадобится git rebase --interactive, который позволит нам изменить порядок коммитов, объединить два или более коммита или остановиться на любом коммите, чтобы отредактировать его.

После исправления всех недочетов мы генерируем и отправляем патчи второй раз и так до тех пор, пока они не будут приняты.

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

Когда появляется следующее окно слияния, оно отправляет запрос на включение вышестоящему сопровождающему.

В идеале вы могли бы переносить каждое новое изменение индивидуально и иметь линейную историю.

Мы живем в реальном мире, где изменения могут конфликтовать друг с другом, и нет времени объединять каждое отдельное изменение.

Поэтому на помощь приходит git pull, в котором все изменения фиксируются одним куском, а конфликты фиксируются один раз, хотя в истории (git log) все выглядит линейно.

В подкасте также упоминался git bisect — инструмент для двоичного поиска коммита, который все сломал.

Допустим, вы знаете коммиты, где ошибки не было, а где ошибка уже есть.

Цель — найти коммит, в котором возникла эта ошибка, за минимальное количество шагов.

Откатываемся к коммиту, который находится ровно посередине.

Если на этом этапе ошибки нет, то проблемный коммит находится справа, в противном случае — слева.

Повторяем, пока не найдем.

Особенность git bisect в том, что он умеет корректно обрабатывать нелинейные куски истории, о которых мы говорили выше.

Теги: #git #ядро Linux #rebase #pull request #patch #merge #Umputun #Radio-T #bisect #open source #git

Вместе с данным постом часто просматривают: