Ветка — она как отдельная параллельная вселенная внутри одного репозитория! Познакомится со всеми ними и последними комментариями заодно — отличный способ начать.
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% всех изменений — это слияния. Хорошо это или плохо? Ну, во-первых, это может быть индикатором какой-либо автоматической стратегии ветвления. Так что страшного тут ничего нет. С другой стороны, всегда стоит помнить о том, что слияние появляется в результате конфликта двух вселенных, разрешение которого может запросто породить не одну занятную багулю. С этой точки зрения, меньше слияний — лучше.
Хорошо. 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
Вот такие вот премудрости помогут понять окружающих и обнаружить их культурные особенности даже не вставая с места.