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Ваш "постыдный" коммит был корректно объединён с оригинальной фичей. Это просто сокращение для того, что можно было бы сделать иначе, но я считаю его довольно удобным.
Вот и всё!