Как склеить коммиты в git
В этой небольшой заметке я расскажу о том, как склеивать (или сквошить) коммиты в 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
- Курс "Git для начинающих". Видеоуроки
- Git merge vs rebase для начинающих
- Git fork. Что такое форки и как с ними работать
- Как я перестал бояться и полюбил git
- Git bisect. Ищем баги с помощью гита
- 12 причин работать с гитом в командной строке
- Как склеить коммиты в git
- Мой набор команд при работе с git
- Как работать с git в Modx
- Как установить git в Linux Mint
- Визуализация истории git с помощью Gource
Истории из жизни айти и обсуждение кода.