240

我已经找到了这个答案:git 中分支上的提交数, 但假设分支是从 master 创建的。

如何在依赖该假设的情况下计算分支的提交次数?

在 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

这为我提供了基于 master 的当前分支中提交的准确计数。

彼得回答中的命令git rev-list --count HEAD ^develop包括更多提交,在我当前的项目中是 678 对 97。

我的提交历史在这个分支上是线性的,所以 YMMV,但它给了我想要的确切答案,即“到目前为止,我在这个特性分支上添加了多少次提交?”。

于 2014-03-29T05:36:29.453 回答
13

自历史开始以来对当前分支完成了多少提交,不包括来自合并分支的提交:

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.
脚本本身包含帮助。

于 2018-03-30T03:01:05.677 回答
5

怎么样git log --pretty=oneline | wc -l

从当前分支的角度来看,这应该计算所有提交。

于 2012-07-25T19:40:59.887 回答
3

如果您使用的是 UNIX 系统,您可以这样做

git log|grep "Author"|wc -l
于 2020-06-22T08:56:01.450 回答
3

我喜欢做git shortlog -s -n --all。为您提供名称和提交次数的“排行榜”样式列表。

于 2017-09-20T16:44:15.843 回答
2

一种方法是列出您的分支的日志并计算行数。

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

master好吧,如果您将分支从非特定分支(即 not or 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

更多分析请访问我的博客

于 2017-11-06T09:35:09.887 回答
2

作为 OP 引用Number of commits on branch in git我想补充一点,那里的给定答案也适用于任何其他分支,至少从 git 版本 2.17.1 开始(并且似乎比 Peter van der 的答案更可靠):

正常工作:

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

你也可以做 git log | grep 提交 | wc -l

并取回结果

于 2017-03-19T06:56:10.403 回答