Как объединить несколько коммитов в один Git

Узнайте, как объединить несколько коммитов в один в Git с помощью интерактивного перебазирования (interactive rebase), Git Bash и Vim. В прошлый раз я показывал вам как вы можете удалить коммит в Git, чтобы он больше не отображался в истории Git. Здесь мы рассмотрим аналогичный подход, чтобы объединить разные небольшие коммиты в один больший коммит.

В некоторых случаях вам может понадобиться поменять историю Git. Чистая история помогает вашим коллегам понять, что происходит с вашим кодом. Напротив, беспорядочный журнал Git заставит ваших коллег ломать голову над тем, что вы сделали, и может даже привести к разочарованию и негативным чувствам и мыслям. Поэтому всегда лучше вести чистую и краткую историю Git, понятную каждому разработчику. В данном конкретном случае мы рассмотрим, как объединить два коммита меньшего размера в один в Git. Возможно, вы пытались добавить новую функцию, но выполнили только половину работы в первом коммите и завершили работу во втором. Пока вы выполняли эту работу, это, вероятно, выглядело хорошей идеей, но теперь, когда вы думаете об этом, это больше не имеет смысла, и вам хочется сохранить все в одном коммите. Что ж, у меня для вас хорошие новости! Вы можете легко объединить несколько коммитов в Git, используя командную строку Git и vim. Через минуту я покажу вам, как это сделать, а сейчас давайте кратко освежим некоторые термины, которые мы собираемся использовать ниже. Если хотите, можете пропустить его, но я бы предпочел оставить его здесь для справки.

История Git

История Git, это история ваших коммитов. Самый простой способ увидеть графическое представление ваших коммитов — запустить в Git bash следующую команду:

git log --oneline

Эта команда предоставит вам список коммитов в данной ветке, начиная с самых новых и заканчивая самыми старыми.

Интерактивный ребейз

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

Vim

Vim — текстовый редактор по умолчанию в Git bash. В этом руководстве предполагается, что вы используете Vim в качестве редактора Git bash. Если по какой-то причине вы его не используете, самое время начать это делать:

git config --global core.editor "vim" 

Примечание: Vim — это доисторический инструмент, текстовый редактор, по крайней мере такой же мощный, как и метод rebase (а может, и намного больше). Он очень старый и неинтуитивный, но хорошо работает в этой ситуации (как и во многих других, учитывая тот факт, что вы знаете, что делаете). Вы были предупреждены.

Объединение коммитов в Git

После того, как вы проверили свою историю Git с помощью команды log и определили коммиты, которые хотите сжать (допустим, у вас всего три коммита, и вы хотите объединить второй и третий самые последние коммиты) Откройте Git bash и добавьте следующую команду:

git rebase -i HEAD~3 

Это запустит редактор vim и отобразит три последних коммита в данной ветке.

Изображение 1: Интерактивное перебазирование в Vim

Чтобы объединить коммиты, заканчивающиеся на 283 и 706, нажмите i, а затем удалите текст «pick» из второго коммита и измените его на «s»:

Изображение 2. Объединить коммитов в Vim

Это объединит второй коммит с третьим, чтобы объединить два коммита в один. Чтобы выполнить сквош, выйдите из визуального режима, нажав esc, а затем введите :wq, чтобы сохранить изменения и выйти из Vim.

Это приведет вас к последнему экрану Vim, который сообщит вам, что два коммита будут объединены, и даст вам возможность изменить текст сообщения о коммите. Если вас устраивает текущее сообщение, вы можете выйти из экрана, нажав :q Рисунок 3. Редактирование сообщения коммита в Vim. Вот и все. Вы успешно объединили коммиты 8cac706 и b159283 в один. Не забудьте внести изменения следующей командой:

git push origin +{branch} 

Замените {branch} названием вашей ветки. Вам нужно применить силу, поскольку вы успешно манипулировали историей git в своей локальной ветке.

PS: Вы всегда можете отменить перебазирование, используя следующую команду, если по какой-то причине перебазирование пойдет не так как вам хотелось:

git rebase --abort 

Приятного кодирования!