Задать вопрос

Как вы осуществляете commit в git?

Я всегда считал, что в процессе разработки проекта стоит осуществлять один 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?
  • Вопрос задан
  • 16949 просмотров
Подписаться 16 Оценить Комментировать
Ответ пользователя Mithgol К ответам на вопрос (10)
Mithgol
@Mithgol
Предпочитаю второй подход, потому что считаю полезною подробную историю и ясно видные места слияний.

Знаю несколько проектов, в которых предпочитают первый подход, когда в истории каждое изменение является единственным и атомарным (неделимым) коммитом, а реальное ветвление скрывается перебазированием веток. Поклонники такого подхода утверждают, что он экономит их время, которое в противном случае непродуктивно затрачивалось бы на просмотр более подробной и более ветвистой истории.

К числу таких проектов относится, например, Node.
Ответ написан
Комментировать