Я всегда считал, что в процессе разработки проекта стоит осуществлять один
commit
для одного задания. Этот процесс приблизительно выглядит вот так:
- Для нового задания создаем новую ветку на основе нашей тематической ветки
git checkout -b new_issue
.
- Осуществляем все
commit
в эту ветку.
- Когда разработка закончена, можно применить
squash
для этих commit
, сжать их в один и сделать rebase
в нашу тематическую ветку.
- Если что-то пошло не так, мы можем откатить этот
commit
и все станет по прежнему. Найти баг, исправить его и накатить сверху исправление. (Историю удаленного репозитория мы не изменяем).
Но возможен и такой подход:
- Для нового задания создаем новую ветку на основе нашей тематической ветки
git checkout -b new_issue
.
- Осуществляем все
commit
в эту ветку.
- Потом
merge
этой ветки в тематическую ветку с флагом--no-ff
, в этом случае у нас будет commit-слияние, который, если что-то пошло не так, мы тоже можем откатить, исправить и снова совершить commit
.
- Но тут у нас есть один плюс, мы можем использовать команду
git bisect
для того, чтобы найти какой именно commit
поломал все.
Используя подход 1, мы будем иметь хорошую историю в git,
commit
будет атомарной единицей, но при нахождении ошибки нам иногда придется пересмотреть кучу файлов.
В подходе 2, мы будем иметь страшную историю, она будет длинной и запутанной, состоять из кучи commit-слияний. Но в этом случае мы сможем использовать магию
git bisect
, что позволит найти баг быстрее. (Возможно этот способ стоит использовать при исправлении legacy кода или рефакторинге).
Я понимаю, что возможно, это вопрос больше о персональных предпочтениях, но хотелось бы узнать, какую практику предпочитаете вы? Какие ещё могут быть проблемы при таких подходах? Возможно вы можете предложит что-то другое?
UPD: Друзья, предпочитающие делать много коммитов. Вам действительно легче находить баги в таком случае или это только плацебо для вас? Как вам это помогает? Пользуется ли кто-то реально
git bisect
?