Git-стории

Git для знакомства с проектом, коллегами и их привычками

Ветка — она как отдельная параллельная вселенная внутри одного репозитория! Познакомится со всеми ними и последними комментариями заодно — отличный способ начать.

git branch --all --verbose

Список всех веток с последними комментариями

Если сообщения наблюдаются в совершенно различных стилях, как будто бы каждый говорит: "Эй! Моё сообщение лучше! Не собираюсь даже меняться!" — значит вам крупно повезло оказаться в окружении суперзвёзд.

Сейчас задача обнаружить стратегию ветвления. Обратите внимание на названия веток, постарайтесь заметить какие-либо закономерности в них.

Идём дальше:

git rev-list --count origin/master
git rev-list --count --no-merges origin/master
git rev-list --count --merges origin/master

Все эти команды покажут количество коммитов в указанную ветку. Опция --no-merge отбросит те из них, которые являются слияниями, а --merge выведет как раз таки только число слияний. В примере ниже, почти 25% всех изменений — это слияния. Хорошо это или плохо? Ну, во-первых, это может быть индикатором какой-либо автоматической стратегии ветвления. Так что страшного тут ничего нет. С другой стороны, всегда стоит помнить о том, что слияние появляется в результате конфликта двух вселенных, разрешение которого может запросто породить не одну занятную багулю. С этой точки зрения, меньше слияний — лучше.

Около 25% всех коммитов это слияния веток

Хорошо. git for-each-ref и unix-way помогут избавиться от повторок и вывести ту же информацию, но уже по каждой ветке:

git for-each-ref \
  --sort=-committerdate \
  --shell \
  --format='"%(refname:short)' \
  refs/remotes/ \
| xargs -I REF sh -c 'printf "%-40s %10s %10s\n" "REF" `git rev-list --count REF` `git rev-list --count --merges REF`'

Ветки и соответствующее количество коммитов и слияний в них

Следующая полезняшка покажет дату последнего коммита и его автора для каждой ветки. Удобно для выявления просрочки.

git for-each-ref \
  --sort=-committerdate \
  --format='%(align:35)%(refname:short)%(end) %(committerdate:short) %(align:20)%(authorname)%(end) %(objectname:short)' \
  refs/remotes

Просрочка

Теперь можно и с коллегами познакомиться. Число изменений внесённых каждым автором поможет узнать git shortlog -sne. Можно добавить --no-merges. Можно и не добавлять.

Кто и сколько

Копаем глубже. Найдём теперь те файлы, которые чаще других претерпевают изменения. Чтобы ограничить временные рамки поиска не чурайтесь опций --since, --after, --before команды git log. Например, --since="4 weeks 3 days 2 hours 1 minutes" или даже --after="2020-02-02".

git log --pretty=format: --name-only | sort | uniq -c | sort -r | head -30

Чаще всего трогают вот здесь

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

Обратите внимание на первый файл со 154 изменениями. Может быть это Fat Controller — разновидность God Object? Если так, то возможно стоит рассказать немного окружающим об OOAD. И всё же, быть может так и должно быть. Регулярность изменений может быть вызвана тем, что это, например, был прототип навыброс или генерируемый IDE код при всяком сохранении файла. Глянуть в него не займёт много времени.

Следующий способ раскроет привычки и обычаи коллег даже лучше предыдущего. Берём любой из списка и проследите за его развитием. Ухоженная история поможет осознать назначение и направление каждого весённого изменения. В свалке же кроме неразберихи вряд ли что найдётся. Ниже пример истории из реального коммерческого проекта.

История изменений одного файла

Красивенько вывести логи можно добавив алиас в .gitconfig:

# ~/.gitconfig

[alias]
lg = log --all --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative

Вот такие вот премудрости помогут понять окружающих и обнаружить их культурные особенности даже не вставая с места.