Несколько правил, чтобы держать Git приличном виде.

Одна задача — один коммит. Слияние ветки происходит только через squash, другие методы запрещены.

В сообщении к коммиту указан только номер задачи и ее заголовок, например [FOOBAR-123] Make some crap. Иная графомания нежелательна — идите за ней в задачу.

Перед слиянием коммиты переносят наверх с помощью rebase относительно родителя. Так вы лишний раз убедитесь, что все в порядке.

После слияния ветка удаляется автоматом.

У каждого PR есть expire. Висит две недели — значит никому не нужен и удаляется автоматом. В следующий раз команда будет расторопней.

Чем больше веток — тем хуже. В идеале это master с тегами релизов и feature-ветки. И больше ничего.

Пуш в мастер запрещен всем, кроме одного человека (техдиректора).

Слияние без апрува запрещено (а лучше двух).

Kdiff3 — пожалуй, лучшее средство разрешения конфликтов:

 > brew install --cask kdiff3

# ~/.gitconfig

[merge]
  tool = kdiff3
[diff]
  tool = kdiff3
[mergetool "kdiff3"]
  path = /Applications/kdiff3.app/Contents/MacOS/kdiff3
[difftool "kdiff3"]
  path = /Applications/kdiff3.app/Contents/MacOS/kdiff3

UPD Ограничение на один коммит не касается локальной ветки, в которой вы пилите задачу. Их может быть хоть два, хоть двести. Важно, что при слиянии методом squash они объединяются, и в главной ветке остается один коммит с номером задачи.

Бывает, коллега делает задачу неделями и после аппрува жмет “Merge”. В истории оказывается 50+ коммитов с подписями “working”, “fix tests”, “fix linter”, “updated” и так далее. Спрашивается, зачем это команде? В своей ветке делай что хочешь, а в общей соблюдай приличия.