Для начала давайте разберемся: что же это вообще такое — git squash
.
Git squash
— это прием, который помогает взять серию коммитов и уплотнить ее. Например, предположим: у вас есть серия из N коммитов и вы можете путем сжатия преобразовать ее в один-единственный коммит. Сжатие через git squash
в основном применяется, чтобы превратить большое число малозначимых коммитов в небольшое число значимых. Так становится легче отслеживать историю Git.
Также этот прием используется при объединении ветвей. Чаще всего вам будут советовать всегда сжимать коммиты и выполнять перебазирование с родительской ветвью (например, master
или develop
). В таком случае история главной ветки будет содержать только значимые коммиты, без ненужной детализации.
Возьмем для примера следующую историю Git:
Здесь видны последние три коммита. В сообщениях к ним поясняется, что мы добавили новый файл и какое-то содержимое. Лучше заменить их одним единственным коммитом о том, что произошло добавление нового файла с некоторым содержимым. Итак, давайте посмотрим, как сжать последние три коммита в один:
git rebase -i HEAD~3git rebase -i
— интерактивный инструмент, который помогает сжимать коммиты. У него много возможностей, но давайте сосредоточимся на git squash
.
Если вы не очень хорошо знакомы с перебазированием — не волнуйтесь. Сжатие коммитов — одна из самых простых операций, которые выполняются через интерактивный git-rebase (т.е. git rebase -i
). HEAD~3
означает, что мы берем последние три коммита.
Далее откроется редактор. Посмотрите, rebase -i
охватывает только последние три коммита, и обратите внимание на количество опций. Нас, однако, интересует только squash
. Давайте же приведем все к одному коммиту.
Как видите, для сжатия мы отметили последние два коммита с помощью команд squash
или s
.
В примере, приведенном выше, коммиты, предназначенные для сжатия, будут слиты с основным коммитом — тем, который отмечен командой pick
. Отметив коммиты, сохраните изменения в редакторе.
Далее rebase -i
снова откроет редактор для ввода сообщения о коммите, как на картинке ниже:
Отредактировав и сохранив сообщения, можете закрыть редактор. Обратите внимание: строки, которые начинаются с #
, будут проигнорированы. После этого журнал Git будет выглядеть следующим образом:
Здесь изменилось сообщение о коммите, и обратите внимание: три коммита “склеились” в один. Также изменился хэш коммита. Через git rebase
всегда создается новый коммит, содержащий соответствующие изменения.
Так что используйте этот инструмент с осторожностью.
Помните: сжатие коммитов меняет историю Git, поэтому не рекомендуется сжимать ветвь, если вы уже отправили ее в удаленный репозиторий. Всегда выполняйте сжатие до того, как отправить пуш с изменениями.
Для того, чтобы сжимать коммиты, также можно воспользоваться опцией fixup
. Это то же самое, что и squash
, только без возможности редактировать сообщение о коммите. Сообщение о коммите в таком случае будет целиком взято из “целевого” коммита — того, который был выбран с помощью pick
. Давайте посмотрим на примере:
Воспользуйтесь командой fixup
или f
, чтобы выбрать коммиты. После этого сохраните изменения в редакторе. Инструмент интерактивного перебазирования сохранит сообщение о коммите. В результате история Git будет выглядеть так:
Обратите внимание: хэш коммита также изменился, а сообщение о коммите берется из “основного” коммита, с которым были сжаты другие два.
Git также предоставляет возможность сжатия при объединении ветвей. Во многих случаях она может оказаться полезной. Чтобы добавить новый функционал или поправить какие-то баги, нам понадобится то и дело что-то изменять в ветвях. Поэтому, когда мы будем готовы слить эти изменения в основную ветвь (master
или develop
), для начала следует применить сжатие.
Давайте рассмотрим следующую команду:
git merge --squash target_branch_nameОна берет все коммиты из целевой ветви, сжимает их и сохраняет все изменения в текущей ветви. Затем вы можете зафиксировать все изменения в одном коммите. На примере это выглядит так:
Здесь мы провели слияние нашей ветви с develop с помощью --squash
. Git воспримет и сохранит сделанные таким образом изменения.
Возможность сжимать коммиты предоставляет и Github. Эта функция особенно полезна при пулл-реквесте.
Сначала производится сжатие, затем — слияние. Так что вместо пяти коммитов получится один.
Как видно на картинке, выполняется всего один коммит с соответствующим сообщением.
Спасибо за чтение! Надеюсь, вы почерпнули из статьи что-то новое ????
Перевод статьи Srebalaji Thirumalai, “How to squash git commits”
Комментарии