Git 브랜치의 커밋 수 계산


184

나는이 대답을 이미 발견했다 : git의 브랜치 커밋 수는 브랜치가 마스터에서 생성되었다고 가정합니다.

그 가정에 의존 하지 않고 지점 따라 커밋 수를 어떻게 계산할 수 있습니까?

SVN에서 이것은 사소한 것이지만 어떤 이유로 git에서 알아내는 것이 실제로 어렵습니다.


답변:


349

현재 지점에 대한 커밋을 계산하려면

git rev-list --count HEAD

지점을 위해

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

브랜치를 만든 이후에 만들어진 브랜치에서 커밋을 계산하려면

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

이것은 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은 동일한 수의 커밋을 표시합니다.
botbot 2016 년

주석은 실제로 코드를 허용하지 않지만 이것이 작동한다는 것을 보여 주어야합니다. ==== $ 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 테스트 ==== $ 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 2016 년

5
@Ciastopiekarz 이들은 각자의 커밋 수입니다.
Asnad Atta 2016

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는 실제로 업스트림 / 마스터 ~ 400을 병합하는 것보다 큰 변화가 없을 때 1800과 같습니다. 사용하여 --no-merges더 나은, 900처럼 제공되지 그리고 난 ~ 800이 같은 병합을 수행하고 레브 - 목록 수 1800 인 경우, 다음 나는 회전에서 낮은 수를 6과 28 사이에 도착 ~ 790와 병합을 -명부.
dlamblin

7

병합 된 브랜치의 커밋을 계산하지 않고 히스토리 시작 이후 현재 브랜치에 대한 커밋의 양 :

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

문서에서 git rev-list --help :

--first-parent

병합 커밋을 볼 때 첫 번째 부모 커밋 만 따르십시오. 이 옵션은 특정 토픽 브랜치의 진화를 볼 때 더 나은 개요를 제공 할 수 있습니다. 토픽 브랜치로의 병합은 때때로 업스트림으로 업데이트되도록 조정하는 경향이 있기 때문에이 옵션을 사용하면 개별 커밋을 무시할 수 있습니다. 그러한 합병으로 당신의 역사. --bisect와 함께 사용할 수 없습니다.

참고 : 얕은 복제본은 기록 크기를 줄입니다. 예를 들어로 복제하면 --depth 11이 반환됩니다.

다른 커밋 이후에 수행 된 커밋 수 :

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

또는 동일 :

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

또는 다른 자식 참조를 사용하십시오 :

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 hooks 에서 사용하는 또 다른 방법을 제공합니다 .

# 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

마지막 명령은 방금 분기를 만든 이후 예상대로 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 | 화장실 -l

그리고 결과를 다시 얻을


1
이것은 신뢰할 수 없습니다. 예를 들어, 커밋 메시지에 "커밋"이있는 커밋과 일치합니다.
rdb

@rdb 아니요. 단어 "commit"을 포함하는 수만 출력 하므로 한 줄은 두 번 계산되지 않습니다.
iBug

@iBug : 당신은 요점을 놓치고 있습니다. 커밋 메시지에 "commit"이라는 단어가 포함되어 있으면 git log출력 의 "commit a1b2c ..."행과 별도의 줄에 나타나 므로 커밋이 결과에서 두 번 계산됩니다. 커밋 메시지에 두 개의 개별 줄에 "commit"이라는 단어가 두 번 포함되어 있으면 더 나쁩니다.
rdb
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.