Git: Поддерживайте чистоту ветви с помощью fixup и autosquash

Источник: «GIT tip : Keep your branch clean with fixup and autosquash»
Кто не устал от коммитов "Remove pdb" или "Fix a typo" через несколько минут или часов после коммита чистой фичи? Несколько лет назад я обнаружил в GIT две полезные опции, которые работают вместе: git commit --fixup и git rebase --autosquash. С их помощью можно легко объединить небольшие исправления с оригинальной фичей и сохранить ветвь чистой.

Желательно не использовать их в ветви stable или master, потому что rebase переписывает историю и может создать большой беспорядок, особенно если в проекте несколько разработчиков. Это скорее помогает очистить ветвь разработки перед тем, как слить её в master.

--fixup и --autosquash

Пример

Возьмём репозиторий 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

Ваш "постыдный" коммит был корректно объединён с оригинальной фичей. Это просто сокращение для того, что можно было бы сделать иначе, но я считаю его довольно удобным.

Вот и всё!

Дополнительные материалы

Предыдущая Статья

Создание меню "вне холста" с <dialog> и веб-компонентами

Следующая Статья

Почему не HTMX