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

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

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

История Git

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

git log --oneline

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

Интерактивный rebase

Интерактивная перебазировка — мощный инструмент, который должны использовать люди, ясно понимающие, что они делают. Думайте об этом как о смертоносном оружии, которое не должно попасть к неправильному человеку. Однако интерактивная перебазировка — это именно то, что нам нужно в данной ситуации. Она позволяет вам манипулировать историей 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 

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