Сжатие коммитов 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:
- Как использовать git stash (и когда его не использовать)
- Как полностью заменить код ветки git кодом другой ветки
Первоначально опубликовано на сайте Nick Ang.