Как склеить коммиты в git

октябрь 5 , 2016
Предыдущая статья

В этой небольшой заметке я расскажу о том, как склеивать (или сквошить) коммиты в git. Также совсем немного затрону тему работы в vim.

Склеивание коммитов бывает необходимо по разным причинам, будь то объединение небольших правок или подготовка мерджреквеста в репозиторий, за который ответственна другая команда или вообще другая компания. Так или иначе собирать коммиты в один иногда приходится.

Многие IDE предоставляют такую возможность средствами GUI, но мы, как трушные программисты, сделаем это в терминале. Да и так просто удобнее - не нужно завязываться на конкретную среду разработки. Для примера возьмем тот же небольшой пример, что и в статье Изучаем git. merge vs rebase. Добавим в мастер еще несколько коммитов. Получится вот так.

origin/master у нас выделена синим, сверху имеем 3 мелких коммита с правками стилей и хотим их склеить перед пушем на сервер. Выполняем в терминале

    git rebase -i HEAD~3

Этим мы говорим, что хотим обработать в интерактивном режиме 3 последних коммита. Если Вы не задавали специально текстовый редактор в git, то скорее всего откроется vim.

Как известно, в мире есть 2 страшные вещи: сунуть лампочку в рот и случайно войти в vim. Сделать легко, а вот разделать обратно - это сложнее. Хорошо, если Вы с vim уже знакомы, а может, и вообще привыкли в нем работать. Для всех остальных же постараюсь расписать последовательность действий в нем, чтобы хотя бы закончить сквош коммитов. Без лишних подробностей.

Итак, набрали команду выше и нажали . Откроется что-то подобное

git скажет нам, какие коммиты мы собираемся обработать и даст подсказку, каким команды доступны. Нас интересует squash. Двигаем курсор к первым строчкам и вместо второго и третьего pick пишем squash. Этим мы говорим гиту, чтобы он взял первый коммит из списка и приклеил к нему второй и третий.

Если в процессе набора курсор начнет непредсказуемо скакать по строкам и Вам захочется в панике сбежать из этого ада, нажмите i. Этим Вы переключите vim в режим набора буков и сможете спокойно написать-таки squash в нужных местах. Главное, следите, чтобы случайно не затереть хэши коммитов. После того, как набрали нужные 2 squash-и, надо сохранить результат. Делается это волшебной комбинацией клавиш

    [Esc]:wq[Enter]
wq - значит, write + quit. Если Вы не хотите сохранять, а просто выйти из vim, то набирайте без w

    [Esc]:q[Enter]

Далее откроется еще одно окно, где будет предложено поправить общее сообщение к коммиту. По умолчанию это будет комбинация сообщений из трех оригинальных коммитов, но Вы можете исправить их. Мы ничего править не будем, а сохраним и выйдем из vim. В терминале увидим примерно этакое

Коммиты успешно склеились в один. Чтобы в этом убедиться, можем открыть log в редакторе (у меня на скриншоте phpStorm)

А чтобы удостовериться, что сообщения к коммиту не пропали, наберем git log в терминале и увидим следующее

Все, можно пушить аккуратный коммит на сервер, не загружая Ваших коллег лишней информацией о том, сколько локальных правок Вы сделали для выполнения одной логической задачи.

Все статьи о git

Предыдущая статья
Заходите в группу в контакте - https://vk.com/webdevkin
Анонсы статей, обсуждения интернет-магазинов, vue, фронтенда, php, гита.
Истории из жизни айти и обсуждение кода.
Как Вам статья? Оцените!