Подсчитайте количество коммитов на ветке Git

185

Я уже нашел этот ответ: количество коммитов на ветке в git, но это предполагает, что ветка была создана из master.

Как я могу посчитать количество коммитов на ветке, не полагаясь на это предположение?

В SVN это тривиально, но по какой-то причине действительно сложно разобраться в git.

aaronbauman
источник
1
возможный дубликат числа
коммитов

Ответы:

351

Чтобы подсчитать коммиты для вашей ветки:

git rev-list --count HEAD

для филиала

git rev-list --count <branch-name>

Если вы хотите сосчитать коммиты на ветке, которые были сделаны с момента создания ветки

git rev-list --count HEAD ^<branch-name>

Это будет учитывать все когда-либо сделанные коммиты, которые также не указаны в имени ветки.

Примеры

git checkout master
git checkout -b test
<We do 3 commits>
git rev-list --count HEAD ^master

Результат: 3

Если ваша ветка имеет ветку с именем develop:

git checkout develop
git checkout -b test
<We do 3 commits>
git rev-list --count HEAD ^develop

Результат: 3

Игнорирование слияний

Если вы объединяете другую ветку с текущей веткой без ускоренной перемотки и выполняете вышеуказанные действия, слияние также считается. Это потому, что для git слияние - это коммит.

Если вы не хотите считать эти коммиты, добавьте --no-merges:

git rev-list --no-merges --count HEAD ^develop
Питер ван дер ли
источник
7
ни один из них не показывает правильное число, например, master и branchname показывают одинаковое количество коммитов.
ботбот
Комментарии не позволяют код, но это должно показать, что он работает. ==== $ git init ==== $ touch test.txt ==== $ git add. ==== $ git commit -a ==== $ git rev-list --count HEAD => 1 ==== $ git rev-list --count master => 1 ==== $ git checkout -b test ==== $ git rev-list --count test => 1 ==== $ git rev-list --count HEAD ^ master => 0 ==== $ touch test2.txt ==== $ git Добавить . ==== $ git commit -a ==== $ git rev-list --count master => 1 ==== $ git rev-list --count test => 2 ==== $ git rev-list --count HEAD ^ master => 1 ====
Питер ван дер ли
1
Я согласен с @botbot. Это не совсем точно. Например, попробуйте добавить несколько коммитов слияния или pull / rebase и заметьте, что показанные выше цифры начинают становиться ненадежными.
Уил Мур III
2
@wilmoore Вы имеете в виду, что вы получаете дополнительный счет после слияния ветви? Технически это коммит, и поэтому он считается. но если вы не хотите считать эти коммиты, добавьте --no-merges. Я обновлю ответ.
Питер ван дер
2
флаг rev-list --count не существует в git 1.7. Прямо сейчас нижеперечисленные предложения, используемые ниже git log, работают лучше, чем любые другие предложения.
Аарон Бауман
60

Чтобы увидеть общее количество коммитов, вы можете сделать, как Питер предложил выше

git rev-list --count HEAD

И если вы хотите увидеть количество коммитов, сделанных каждым человеком, попробуйте эту строку

git shortlog -s -n

будет генерировать вывод, как это

135  Tom Preston-Werner
15  Jack Danger Canty
10  Chris Van Pelt
7  Mark Reid
6  remi
Аснад Атта
источник
3
что это за числа перед именами? Вы можете объяснить ?
Ciasto piekarz
5
@Ciastopiekarz это количество коммитов каждого человека.
Аснад Атта
39

Это может потребовать относительно недавней версии Git, но это хорошо работает для меня:

git rev-list --count develop..HEAD

Это дает мне точное количество коммитов в текущей ветке, основанной на master.

Команда в ответе Питера git rev-list --count HEAD ^developвключает в себя еще много коммитов, 678 против 97 в моем текущем проекте.

Моя история коммитов в этой ветке линейная, поэтому YMMV, но она дает мне точный ответ, который я хотел, а именно: «Сколько коммитов я добавил к этой ветке функций?».

scanny
источник
Должно быть так же. В документах говорят так . A special notation "<commit1>..<commit2>" can be used as a short-hand for "^'<commit1>' <commit2>". For example, either of the following may be used interchangeably: $ git rev-list origin..HEAD $ git rev-list HEAD ^origin
dosentmatter
Я в замешательстве: git fetch upstream; BEHIND=$(git rev-list --count HEAD..upstream/master); git merge --ff-only upstream/master~$BEHIND;не выстраивается. BEHIND похож на 1800 год, когда на самом деле ничто иное, как слияние upstream / master ~ 400, не приводит к изменениям. использование --no-mergesне намного лучше, дает как 900. И если я делаю слияние как это с ~ 800, и счетчик списка оборотов равен 1800, то я делаю слияние с ~ 790, я получаю между 6 и 28 меньшим количеством оборотов -список.
Дламблин
7

Сколько коммитов было сделано в текущей ветви с начала истории, не считая коммитов из объединенных ветвей:

git rev-list HEAD --count --first-parent

Из документации git rev-list --help :

--first-parent

Следите только за первым родительским коммитом, увидев коммит слияния. Эта опция может дать лучший обзор при просмотре эволюции конкретной ветки темы, потому что слияния с веткой темы имеют тенденцию только к адаптации к обновленным апстримам время от времени, и эта опция позволяет вам игнорировать отдельные коммиты, внесенные в Ваша история таким слиянием. Не может сочетаться с --bisect.

Примечание: мелкий клон уменьшит размер истории. Например, если вы клонируете --depth 1, вернет 1.

количество коммитов, выполненных после некоторого другого коммита:

git rev-list HEAD abc0923f --count --first-parent

или то же самое:

git rev-list abc0923f.. --count --first-parent

или используйте любую другую ссылку на git :

git rev-list master tag-v20 --count --first-parent

Подсчет совершенных с 2018 года

git rev-list HEAD --count --first-parent --since=2018-01-01

01-01-2018, 01.01.2018, 2018.01.01 также работает.


git rev-label

Я написал скрипт для получения ревизии версии из Git в таком формате, '$refname-c$count-g$short$_dirty'который расширяется до master-c137-gabd32ef.
Помощь включена в сам скрипт.

KYB
источник
git rev-list abc0923f .. --count --first-parent дает правильные результаты для моей ветви, но первая команда дает большое значение
Jiss Raphel
5

Как насчет git log --pretty=oneline | wc -l

Это должно подсчитать все коммиты с точки зрения вашей текущей ветки.

Remear
источник
Какой столбец вы считаете? Это первый?
Hengjie
3

Мне нравится делать git shortlog -s -n --all. Дает вам список имен и количество коммитов в стиле «списка лидеров».

inorganik
источник
2

Один из способов сделать это - перечислить журнал для вашей ветви и подсчитать количество строк.

git log <branch_name> --oneline | wc -l
kjw0188
источник
1

Хорошо, выбранный ответ не будет работать, если вы разветвляли свою ветку из неопределенной ветви (то есть, нет masterили develop).

Здесь я предлагаю другой способ, которым я пользуюсь в своих pre-pushgit-хуках.

# Run production build before push
echo "[INFO] run .git/hooks/pre-push"

echo "[INFO] Check if only one commit"

# file .git/hooks/pre-push
currentBranch=$(git symbolic-ref HEAD | sed -e 's,.*/\(.*\),\1,')

gitLog=$(git log --graph --abbrev-commit --decorate  --first-parent HEAD)

commitCountOfCurrentBranch=0
startCountCommit=""
baseBranch=""

while read -r line; do

    # if git log line started with something like "* commit aaface7 (origin/BRANCH_NAME)" or "commit ae4f131 (HEAD -> BRANCH_NAME)"
    # that means it's on our branch BRANCH_NAME

    matchedCommitSubstring="$( [[ $line =~ \*[[:space:]]commit[[:space:]].*\((.*)\) ]] && echo ${BASH_REMATCH[1]} )"

    if [[ ! -z ${matchedCommitSubstring} ]];then

      if [[  $line =~ $currentBranch ]];then
        startCountCommit="true"
      else
        startCountCommit=""

        if [[ -z ${baseBranch} ]];then
          baseBranch=$( [[ ${matchedCommitSubstring} =~ (.*)\, ]] && echo ${BASH_REMATCH[1]} || echo ${matchedCommitSubstring} )

        fi

      fi

    fi


    if [[ ! -z ${startCountCommit} && $line =~ ^\*[[:space:]]commit[[:space:]] ]];then
      ((commitCountOfCurrentBranch++))
    fi


done <<< "$gitLog"

if [[ -z ${baseBranch} ]];then

  baseBranch="origin/master"

else

  baseBranch=$( [[ ${baseBranch} =~ ^(.*)\, ]] && echo ${BASH_REMATCH[1]} || echo ${baseBranch} )

fi


echo "[INFO] Current commit count of the branch ${currentBranch}:  ${commitCountOfCurrentBranch}"

if [[ ${commitCountOfCurrentBranch} -gt 1 ]];then
  echo "[ERROR] Only a commit per branch is allowed. Try run 'git rebase -i ${baseBranch}'"
  exit 1
fi

Для более подробного анализа, пожалуйста, посетите мой блог

Пол Лан
источник
1

Поскольку OP ссылается на число коммитов на ветке в git, я хочу добавить, что данные ответы там также работают с любой другой веткой, по крайней мере, начиная с git версии 2.17.1 (и, похоже, более надежно, чем ответ Питера ван дер Доу):

работает правильно:

git checkout current-development-branch
git rev-list --no-merges --count master..
62
git checkout -b testbranch_2
git rev-list --no-merges --count current-development-branch..
0

Последняя команда дает нулевые коммиты, как и ожидалось, так как я только что создал ветку. Команда before дает мне реальное количество коммитов в моей ветке разработки минус merge-commit (s)

не работает правильно:

git checkout current-development-branch
git rev-list --no-merges --count HEAD
361
git checkout -b testbranch_1
git rev-list --no-merges --count HEAD
361

В обоих случаях я получаю количество всех коммитов в ветке разработки и мастер, с которого ветки (косвенно) спускаются.

sdoe
источник
1

Если вы используете систему UNIX, вы можете сделать

git log|grep "Author"|wc -l
около
источник
-2

Вы также можете сделать git log | grep commit | туалет

и получить результат обратно

Джеймс
источник
1
Это не надежно. Например, он будет соответствовать коммитам, которые имеют «commit» в сообщении коммита дважды.
rdb
@rdb Нет, не будет. Он будет выводить только количество строк, содержащих слово "commit", поэтому одна строка никогда не будет учитываться дважды.
iBug
@iBug: вы упускаете суть. Если сообщение commit содержит слово «commit», оно появляется на отдельной строке от строки «commit a1b2c ...» в git logвыводе, так что коммит будет засчитан дважды в результате. Еще хуже, если сообщение коммита будет содержать слово «коммит» дважды в двух отдельных строках.
мая