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


185

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

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

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


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, но она дает мне точный ответ, который я хотел, а именно: «Сколько коммитов я добавил к этой ветке функций?».


Должно быть так же. В документах говорят так . 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.
Помощь включена в сам скрипт.


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

5

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

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


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

3

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


2

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

git log <branch_name> --oneline | wc -l

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

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


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выводе, так что коммит будет засчитан дважды в результате. Еще хуже, если сообщение коммита будет содержать слово «коммит» дважды в двух отдельных строках.
— мая
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.