Gitブランチのコミット数をカウントする


184

私はすでにこの答えを見つけました:gitのブランチでのコミット数ですが 、ブランチがマスターから作成されたと想定しています。

その仮定に依存ずに、ブランチに沿ったコミット数をどのようにカウントできますか?

SVNではこれは取るに足らないことですが、何らかの理由でgitで理解するのは本当に困難です。


回答:


350

現在のブランチのコミットをカウントするには:

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
これらのどれも正しい数を示していません。たとえば、マスターとブランチ名は同じ数のコミットを示しています。
ボットボット2013年

コメントは実際にはコードを許可しませんが、これはコードが機能することを示しているはずです。==== $ 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に同意します。これらは実際には正確ではありません。たとえば、マージコミットを追加したり、プル/リベースしたりすると、上記のカウントが信頼できなくなることがわかります。
Wil Moore III

2
@wilmooreブランチをマージした後に追加のカウントを取得することを意味しますか?これは厳密にはコミットなので、カウントされます。ただし、これらのコミットをカウントしたくない場合は、-no-mergesを追加します。答えを更新します。
ピーターファンデルゼーズ

2
rev-list --countフラグはgit 1.7には存在しません。現時点では、以下の反対投票git logは、他のどの提案よりもうまく機能しています。
aaronbauman

60

上記のPeterが提案したように、コミットの総数を確認するには

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これらは各人のコミット数です。
Asnad Atta

39

比較的新しいバージョンのGitが必要になる場合がありますが、これは私にとってはうまく機能します。

git rev-list --count develop..HEAD

これにより、マスターをベースとする現在のブランチでのコミットの正確な数がわかります。

Peterの回答のコマンドには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に似ていますが、実際にはアップストリーム/マスター〜400をマージするだけで変更が生じます。使用すること--no-mergesはあまり良くありません、900のようになります。そして、このように〜800でマージし、rev-listカウントが1800である場合、〜790でマージすると、revのカウントが6〜28低くなります。 -リスト。
dlamblin

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 2013

3

するのが好きgit shortlog -s -n --allです。名前とコミット数の「リーダーボード」スタイルのリストを提供します。


2

これを行う1つの方法は、ブランチのログをリストし、行を数えることです。

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以降(そしてPeter van der Doesの回答よりも一見信頼性が高いようです)、そこに与えられた回答は他のブランチでも機能することを付け加えておきます。

正しく機能する:

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

最後のコマンドでは、ブランチを作成したばかりなので、期待どおりにコミットは行われません。前のコマンドは、開発ブランチでの実際のコミット数からマージコミットを差し引いたものです

正しく機能していません:

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 | wc -l

結果を取り戻す


1
これは信頼できません。たとえば、コミットメッセージに「commit」が2回あるコミットに一致します。
rdb 2017年

@rdbいいえ、そうではありません。「commit」という単語を含む行数のみを出力するため、1行が2回カウントされることはありません。
iBug 2018年

@iBug:ポイントが足りない。コミットメッセージに「commit」という単語が含まれている場合、git log出力の「commit a1b2c ...」行とは別の行に表示されるため、コミットは結果で2回カウントされます。コミットメッセージに2つの別々の行に「コミット」という単語が2回含まれる場合はさらに悪いことになります。
rdb 2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.