git에서 두 커밋간에 변경된 줄 수를 어떻게 계산할 수 있습니까?


746

git에서 두 커밋간에 변경된 줄 수를 계산하는 쉬운 방법이 있습니까?

나는 내가 할 git diff수 있고 줄을 세는 것을 알고 있지만 지루한 것 같습니다. 또한 줄 수에 내 커밋 만 포함 하여이 작업을 수행하는 방법을 알고 싶습니다.


3
BitBucket을 봅니다.
Alex78191

답변:


1112

--stat옵션을 원 git diff하거나 스크립트에서 구문 분석 하려는 경우 옵션입니다 --numstat.

git diff --stat <commit-ish> <commit-ish>

--stat병합 후 보는 데 익숙한 사람이 읽을 수있는 출력을 생성합니다. --numstat스크립트가 쉽게 해석 할 수있는 멋진 테이블 레이아웃을 생성합니다.

어떻게 든 여러 커밋에서 동시에이 작업을 수행하려고한다고 생각했습니다 git log. Ron DeVera가 이에 대해 설명하지만 실제로 언급 한 것보다 더 많은 작업을 수행 할 수 있습니다. git log요청 된 정보를 인쇄하기 위해 내부적으로 diff 기계를 호출 하므로 , diff 통계 옵션 중 하나만 제공 할 수 있습니다 --shortstat. 당신이 사용하고 싶은 것은 :

git log --author="Your name" --stat <commit1>..<commit2>

하지만 당신은 사용할 수 있습니다 --numstat또는 --shortstat뿐만 아니라. git log또한 다양한 다른 방법으로 커밋을 선택할 수 있습니다 . 문서를 살펴보십시오 . 당신은 같은 일에 관심이있을 수 있습니다 --since(오히려 범위를 커밋 지정하는 대신, 지난 주 이후 커밋 선택) 및 --no-merges(병합 커밋이 실제로 변화를 도입하지 않음)뿐만 아니라 예쁜 출력 옵션 ( --pretty=oneline, short, medium, full...).

다음은 git log에서 커밋 당 변경 사항 대신 전체 변경 사항을 얻는 한 줄짜리 줄입니다 (커밋 선택 옵션을 원하는대로 변경하십시오-커밋 1에서 커밋 2로 커밋합니다).

git log --numstat --pretty="%H" --author="Your Name" commit1..commit2 | awk 'NF==3 {plus+=$1; minus+=$2} END {printf("+%d, -%d\n", plus, minus)}'

(git 커밋에 커밋에 대한 식별 정보를 인쇄하도록해야합니다. 나는 임의로 해시를 선택한 다음 awk를 사용하여 통계 정보가있는 필드 3 개가있는 행만 선택했습니다)


2
이것은 "변경된 줄"에 관한 원래의 질문에 대한 답변이 아닙니다. 한 줄 변경은 삽입 된 라인과 삭제 된 라인 모두로 계산됩니다. 변경된 줄 수를 계산하려면 여기에 설명 된 것보다 더 많은 작업이 필요합니다.
Ville Laitila

12
@VilleLaitila :이 작업은 터무니없는 노력없이 얻을 수있는 한 가까우며 OP 및 15 명에게는 충분했습니다. (변경된 선이 추가 된 선과 삭제 된 선이되는 시점을 어떻게 정의합니까?-와 + 선 사이의 거리를 선 길이의 일부로 편집하면 변경이 두 배가된다는 것을 모두 알고 있습니다.) 우리는 이것을 유용한 변화량의 척도라고 부르고 우리의 삶으로 나아갈 수 있습니다.
Cascabel

188
git diff --shortstat <commit1> <commit2>내가 원했던 것입니다.
Kim

9
참고로, 날짜 형식 --since--until: 같은 것입니다 yesterday, 1 month 2 weeks 3 days 1 hour 1 second ago또는1979-02-26 18:30:00
juanmirocks

4
@Bryson 예, 그 라인이 말하는 이유입니다. 리터럴 커밋, 분기, 태그 및 일반적으로 참조를 포함하여 커밋 <commit-ish>나타내는 모든 항목에서 작동합니다 . 또한 참조 stackoverflow.com/questions/23303549/...
Cascabel

193

게으른 경우을 사용하십시오 git log --stat.


14
나는 이것이 유용하다는 것을 알았고 -10이전 10 개의 커밋을 보여주기 위해를 추가했다 .
Choylton B. Higginbottom

2
커밋 히스토리보기를 완료 Q하면 터미널로 돌아 가기 위해 입력 하십시오.
Stevoisiak

180
git diff --shortstat

변경 및 추가 된 행 수만 제공합니다. 이것은 비 단계적 변경에서만 작동합니다. 브랜치와 비교하려면 :

git diff --shortstat some-branch

3
멋있는! 그러나 .. 이것은 비
단계적

3
로 변경 사항을 준비했다면 다음 git add을 수행하십시오.git diff --shortstat --cached
TomNash

2463 파일 변경, 39745 삽입 (+), 21383 삭제 (-) 지난 달에 실제로 약 5k에서 10k를 삭제했습니다. 내가 물건을 옮기는 것과 별개로 내가하고있는 거의 모든 것입니다. 뭔가 잘못되었다. 제거 된 파일이나 무언가를 포함하지 않습니까?
jgmjgm 19

46
git diff --stat commit1 commit2

편집 : 커밋도 지정해야합니다 (매개 변수없이 작업 디렉토리와 색인을 비교합니다). 예 :

git diff --stat HEAD^ HEAD

HEAD와 부모를 비교합니다 HEAD.


1
실제로 사용할 필요는 없습니다 diff-index. diff프론트 엔드가 모든 것을 처리 할 수 ​​있습니다. 의 경우는 diff-index에 의해 보호됩니다 --cached/--staged. (그리고 diff-indexOP가 요청한대로 두 개의 임의 커밋을 비교 하는 방법은 없습니다 .)
Cascabel

이것의 결과는 아무것도 아닙니다.
Mike

@ 마이크 : 캐럿을 떠났습니까? 가장 최근의 커밋이 병합 커밋입니까? git에 diff가 없다고 말하면 diff가 없기 때문입니다.
Cascabel

6
또는 커밋되지 않은 경우git diff --stat HEAD
wieczorek1990

1
또한, 사용하여 단지 부모보다 더 뒤로 비교할 수 있습니다 HEAD~n어디에, n다시 가고 싶은 얼마나 멀리이다. git diff --stat HEAD~5 HEADHEAD와 관련된 마지막 5 개의 커밋에 대한 합계 통계가 표시됩니다.
Nathan Beck

18

abcd123 (첫 번째 커밋)과 wxyz789 (마지막 커밋) 사이의 커밋을 모두 비교한다고 가정합니다.

git log wxyz789^..abcd123 --oneline --shortstat --author="Mike Surname"

이것은 다음과 같은 간결한 출력을 제공합니다.

abcd123 Made things better
 3 files changed, 14 insertions(+), 159 deletions(-)
wxyz789 Made things more betterer
 26 files changed, 53 insertions(+), 58 deletions(-)

이것의 결과는 나에게 아무것도 아닙니다 (커밋을하고 확인했습니다-저자는 git log와 함께 사용하고 다른 인수는 없습니다).
Mike

이것은 나에게도 일어났다. 두 커밋의 순서가 잘못되어 문제가 해결되었습니다.
bob esponja

1
커밋 순서를 업데이트하고 두 SHA가 무엇을 나타내는 지 설명했습니다. 그것을 잡아 주셔서 감사합니다 :)
Ron DeVera

3
--shortstat플래그는 함께 작동, 굉장 git diff하지만 (하지 git log).
lucke84

그것들을 요약하는 방법?
xpto

13

지정된 기간 동안 모든 변경 로그를 얻는 다른 방법

git log --author="Tri Nguyen" --oneline --shortstat --before="2017-03-20" --after="2017-03-10"

산출:

2637cc736 Revert changed code
 1 file changed, 5 insertions(+), 5 deletions(-)
ba8d29402 Fix review
 2 files changed, 4 insertions(+), 11 deletions(-)

출력 내용이 길면 파일로 내 보내서 읽을 수 있습니다.

git log --author="Tri Nguyen" --oneline --shortstat --before="2017-03-20" --after="2017-03-10" > /mnt/MyChangeLog.txt

2

위의 모든 대답은 정확하지만 마지막 아래의 커밋 횟수가 필요한 경우 아래 중 하나를 사용하면 편리합니다.

아래는 마지막 5 개의 커밋을 얻는 것입니다.

git diff $(git log -5 --pretty=format:"%h" | tail -1) --shortstat

최근 10 개의 커밋 수

git diff $(git log -10 --pretty=format:"%h" | tail -1) --shortstat

generic-필요한 많은 커밋 수로 N을 변경하십시오.

git diff $(git log -N --pretty=format:"%h" | tail -1) --shortstat

시작 이후 모든 커밋 수를 가져옵니다.

git diff $(git log --pretty=format:"%h" | tail -1) --shortstat


"꼬리"는 내부 또는 외부 명령, 실행 가능한 프로그램 또는 배치 파일로 인식되지 않습니다. "
Charles Roddie


1

방금이 문제를 스스로 해결 했으므로 내가 생각해 낸 것을 공유 할 것입니다. 최종 결과는 다음과 같습니다.

> git summary --since=yesterday
total: 114 file changes, 13800 insertions(+) 638 deletions(-)

기본 명령은 다음과 같습니다.

git log --numstat --format="" "$@" | awk '{files += 1}{ins += $1}{del += $2} END{print "total: "files" files, "ins" insertions(+) "del" deletions(-)"}'

노트 $@당신의 인수에 같은 전달 로그 명령을 --author="Brian"또는 --since=yesterday.

awk를 git alias에 넣는 것을 어지럽히는 대신 지저분해서 대신 내 경로 ( ~/bin/git-stat-sum) 의 실행 가능한 스크립트에 넣은 다음 my의 별칭에 스크립트를 사용했습니다 .gitconfig.

[alias]
    summary = !git-stat-sum \"$@\"

그리고 그것은 정말 잘 작동합니다. 마지막으로 주목해야 할 것은 file changes변경된 고유 파일의 수가 아니라 파일의 변경 횟수입니다. 그것이 내가 찾던 것이지만, 당신이 기대하는 것이 아닐 수도 있습니다.

여기 또 다른 예가 있습니다

git summary --author=brian
git summary master..dev
# combine them as you like
git summary --author=brian master..dev
git summary --all

실제로 모든 git log명령을 로 바꿀 수 있어야합니다 git summary.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.