240

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

その仮定に依存せずに、ブランチに沿ったコミットの数をカウントするにはどうすればよいですか?

SVNではこれは些細なことですが、何らかの理由でgitで理解するのは非常に困難です。

4

12 に答える 12

446

現在のブランチのコミットをカウントするには、次のようにします。

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
于 2012-07-25T19:58:39.000 に答える
66

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
于 2013-03-05T13:53:13.400 に答える
44

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

git rev-list --count develop..HEAD

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

Peterの回答のコマンドにgit rev-list --count HEAD ^developは、さらに多くのコミットが含まれています。現在のプロジェクトでは678対97です。

私のコミット履歴はこのブランチでは線形なのでYMMVですが、「この機能ブランチでこれまでにいくつのコミットを追加しましたか?」という正確な答えが得られます。

于 2014-03-29T05:36:29.453 に答える
13

マージされたブランチからのコミットを除いて、履歴の開始以降に現在のブランチに対して行われたコミットの量:

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

ドキュメントからgitrev-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

'$refname-c$count-g$short$_dirty'に展開されるような形式でGitからバージョン改訂を取得するスクリプトを作成しましたmaster-c137-gabd32ef
スクリプト自体にヘルプが含まれています。

于 2018-03-30T03:01:05.677 に答える
5

どうですかgit log --pretty=oneline | wc -l

これにより、現在のブランチの観点からすべてのコミットがカウントされます。

于 2012-07-25T19:40:59.887 に答える
3

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

于 2017-09-20T16:44:15.843 に答える
3

UNIXシステムを使用している場合は、次のことができます。

git log|grep "Author"|wc -l
于 2020-06-22T08:56:01.450 に答える
2

これを行う1つの方法は、ブランチのログを一覧表示し、行を数えることです。

git log <branch_name> --oneline | wc -l
于 2012-07-25T19:43:19.377 に答える
2

ええと、あなたがあなたのブランチを不特定のブランチからフォークした場合(すなわち、そうでないmasterdevelop)、選択された答えは機能しません。

ここでは、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

詳細な分析については、私のブログをご覧ください

于 2017-11-06T09:35:09.887 に答える
2

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

どちらの場合も、開発ブランチとマスターのすべてのコミットの数を取得し、そこからブランチが(間接的に)派生します。

于 2019-04-01T13:41:29.740 に答える
0

git bash / unixでawkを使用するこのコマンドを使用して、コミット数を取得できます。

    git shortlog -s -n | awk '/Author/ { print $1 }'
于 2020-08-12T06:08:39.970 に答える
-2

gitlog|を実行することもできます grepコミット| wc -l

結果を取り戻します

于 2017-03-19T06:56:10.403 に答える