Git: Поддерживайте чистоту ветви с помощью fixup и autosquash
git commit --fixup
и git rebase --autosquash
. С их помощью можно легко объединить небольшие исправления с оригинальной фичей и сохранить ветвь чистой.Желательно не использовать их в ветви stable
или master
, потому что rebase
переписывает историю и может создать большой беспорядок, особенно если в проекте несколько разработчиков. Это скорее помогает очистить ветвь разработки перед тем, как слить её в master
.
--fixup и --autosquash
git commit --fixup <commit>
автоматически помечает ваш коммит как исправление предыдущего коммита.git rebase -i --autosquash
автоматически организует слияние этих fixup-коммитов и связанных с ними нормальных коммитов
Пример
Возьмём репозиторий git с ветвью dev
. Вы собираетесь закоммитить фичи A и B:
$ (dev) git add featureA
$ (dev) git commit -m "Feature A is done"
[dev fb2f677] Feature A is done
$ (dev) git add featureB
$ (dev) git commit -m "Feature B is done"
[dev 733e2ff] Feature B is done
В процессе работы вы обнаружили незначительные ошибки в "Feature A": самое время использовать опцию --fixup
!
$ (dev) git add featureA # вы удалили pdb: постыдный коммит
$ (dev) git commit --fixup fb2f677
[dev c5069d5] fixup! Feature A is done
Здесь вы видите, что GIT автоматически извлёк сообщение коммита featureA
с префиксом fixup
!
Работа выполнена, давайте посмотрим лог:
$ (dev) git log --oneline
c5069d5 fixup! Feature A is done
733e2ff Feature B is done
fb2f677 Feature A is done
ac5db87 Previous commit
Теперь вы можете очистить вашу ветвь перед слиянием: пришло время использовать опцию --autosquash
! git rebase i <после-этого-коммита>
должен быть запущен с аргументом последнего коммита, который вы хотите сохранить как есть, а не первого, который вы хотите изменить. В данном случае это Previous commit
с хэшем начинающимся с ac5db87
:
$ (dev) git rebase -i --autosquash ac5db87
pick fb2f677 Feature A is done
fixup c5069d5 fixup! Feature A is done
fixup c9e138f fixup! Feature A is done
pick 733e2ff Feature B is done
Эта команда открыла ваш редактор со строками указанными выше. Просто сохраните и выйдите из редактора и …:
$ (dev) git log --oneline
ff4de2a Feature B is done
5478cee Feature A is done
ac5db87 Previous commit
Ваш "постыдный" коммит был корректно объединён с оригинальной фичей. Это просто сокращение для того, что можно было бы сделать иначе, но я считаю его довольно удобным.
Вот и всё!