Сжатие коммитов git — это метод, полезный для работы с командами. В зависимости от вашего стиля работы, у вас может быть от 1 до 50 (или даже больше?) коммитов в локальной ветви функций. Если вы работаете с командой разработчиков, объединение всех этих коммитов в ветку master может оказаться бесполезным и может сделать историю коммитов проекта неприятно длинной.

Еще немного об этом. Идея функциональной ветки состоит в том, что она содержит код, реализующий определенную функцию. Поэтому к тому времени, когда вы закончите писать код и тестировать его в процессе разработки, имеет смысл объединить (или «сжать») все коммиты, которые вы сделали с момента ветвления из вышестоящей ветки (например, master), в один коммит.

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

Как раздавить коммиты git

Вас может удивить, что на самом деле нет команды с именем git squash. Чтобы раздавить коммиты, мы должны вместо этого использовать git rebase.

Допустим, у вас есть 3 коммита в ветке responsive-ui, и вы хотите объединить их в один коммит. Вот последовательность команд терминала для запуска с пояснениями между ними.

git rebase -i HEAD~3

Это вызовет интерактивную консоль в Терминале (это то, что означает флаг -i):

pick 3e7bcf6 add bootstrap and grid-ify all html
pick 2e5f39d fix bugs
pick ead1764 clean up for deployment

# Rebase 9d4818a..ead1764 onto 9d4818a (3 command(s))
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out

В интерактивной консоли, которая будет вашим редактором командной строки по умолчанию (у меня это Nano), вам нужно будет изменить все коммиты, кроме одного, на squash вместо pick:

pick 3e7bcf6 add bootstrap and grid-ify all html
squash 2e5f39d fix bugs
squash ead1764 clean up for deployment

Совет: Вы можете сэкономить время, заменив слово «сквош» буквой «с», как в s 2e5f39d fix bugs. Результат тот же.

Когда закончите, выйдите из интерфейса (для редактора Nano это Ctrl+X, затем Y, затем Enter). Это сохранит методы, которые вы решили перебазировать для каждого коммита. Это этап 1 из 2 интерактивной перебазировки. На втором этапе будет задействована вторая интерактивная консоль:

# This is a combination of 3 commits.
# The first commit's message is:
add bootstrap and grid-ify all html

# This is the 2nd commit message:

fix bugs

# This is the 3rd commit message:

clean up for deployment

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.

На этапе 2 вам предоставляется возможность отредактировать сообщение коммита для единственного оставшегося коммита. Обычно я предпочитаю, чтобы мое сообщение о коммите было кратким в одной строке, поэтому я удаляю все остальные посторонние сообщения о коммите:

# This is a combination of 3 commits.
# The first commit's message is:
add bootstrap and grid-ify all html

Но перед сохранением я исправляю сообщение фиксации, чтобы отразить функцию, которую эта ветка будет реализовывать после слияния, используя протокол, который мы используем внутри команды:

# This is a combination of 3 commits.
# The first commit's message is:
feat(UI): add bootstrap v4.0 for responsive grids

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

Другие короткие руководства, связанные с git:

Первоначально опубликовано на сайте Nick Ang.