줄 번호와 변경된 파일 이름 만 'git diff'로 만들 수 있습니까?


276

이 질문은 "행 번호"를 요구합니다. 출력의 행 번호에 신경 쓰지 않으면 이 질문과 답변을 참조하십시오 .


기본적으로 변경된 내용, 파일 이름 및 줄 번호를보고 싶지 않습니다.


궁금합니다. 코드없이 줄 번호가 정말 유용한가요? 아니면 줄 수를 변경 하시겠습니까?
앤드류 마샬

글쎄, 특히는 아니지만 코드를 변경 한 곳을 북마크에 추가해야합니다.
wei

1
커밋의 새 코드 나 수정 된 코드가 테스트에 포함되는지 여부를 평가하기 위해 정보를 코드 적용 범위 보고서와 결합하는 것이 한 가지 용도입니다.
AntonyG

@AntonyG 나는 정확히 똑같은 일을하는 유틸리티 (커버리지 대 변경된 라인)를 만들려고 하면서이 질문을 발견했습니다. 보고서를 작성 했습니까? 그렇다면 어디서나 게시 했습니까?
Andrew Newdigate

@AndrewNewdigate 멋진 도구 일 것입니다.하지만 결코 만들지 않았습니다. 이 질문을
접했을

답변:


70

참고 : 변경된 파일 의 이름찾고있는 경우 (변경 된 줄 번호 없이 ) 쉽게 할 수 있습니다 . 여기에서 다른 답변 링크를 클릭하십시오 .


아무 이것에 대한 옵션을 내장하지 (그리고 나는 모든 중 유용한 것을 생각하지 않습니다)하지만 입니다 "외부 DIFF"스크립트의 도움으로, 자식에서이 작업을 수행 할 수.

여기 꽤 엉뚱한 것이 있습니다. 출력을 원하는 방식으로 수정하는 것은 사용자의 몫입니다.

#! /bin/sh
#
# run this with:
#    GIT_EXTERNAL_DIFF=<name of script> git diff ...
#
case $# in
1) "unmerged file $@, can't show you line numbers"; exit 1;;
7) ;;
*) echo "I don't know what to do, help!"; exit 1;;
esac

path=$1
old_file=$2
old_hex=$3
old_mode=$4
new_file=$5
new_hex=$6
new_mode=$7

printf '%s: ' $path
diff $old_file $new_file | grep -v '^[<>-]'

"외부 diff"에 대한 자세한 내용 GIT_EXTERNAL_DIFFgit 매뉴얼 페이지 의 설명을 참조하십시오 .


1
감사. 나는 이것에 대한 내장 옵션이 없다는 것을 확인한 후에 실제로 비슷한 스크립트를 작성했습니다. :)
wei

| grep -o '^[0-9]*'오른쪽에 신경 쓰지 않는다고 가정하면 파이핑을 하면 숫자 만 제공됩니다.
GKFX

1
@DylanYoung 예; 추가 표시된 파일을 제한하기 --diff-filter=...를 Where ...: 부분은 당신이보고 싶은 변화의 종류 M, 수정을 위해 A, 추가 된 D당 삭제를 위해, 그리고 다른 git diff문서.
torek

@Sventies : 내 대답의 맨 위에 언급했듯이 OP가 요청한 것이 아닙니다. 그는 파일 이름 만 원하지 않습니다 . 그는 줄 번호를 가진 이름 원합니다 .
torek

충분히 충분히 @torek :)
Sventies

831

너무 쉽게:

git diff --name-only

가서 diff!


88
이것은 대부분의 사람들이이 페이지를 볼 때 찾고있는 대답 일 수 있습니다. 그러나 행 번호를 구체적으로 언급하는 원래 질문에 대답하지 않습니다.
Pieter Müller

12
이것은 문제의 절반 만 해결하므로 허용되는 대답이 아니어야합니다. 변경된 파일 (각 파일에 대해)을 여전히 출력해야합니다.
adamwong246

그게 다야! 이 스위치를 정확히 찾고있었습니다!
Adam Arold

왜 "git status"를 사용하지 않습니까? 또한 추적되지 않은 파일을 알려줍니다.
Naveen Paul

1
때때로 당신은 이미 커밋했기 때문에 @JimmyPaul. 예를 들어, 마스터와 현재 고급 브랜치간에 변경된 파일을 나열해야합니다.git diff --name-only master..HEAD
Hettomei

68

변경된 줄 수 또는 변경 사항을 포함하는 실제 줄 번호와 같은 줄 번호? 변경된 줄 수를 원하면을 사용하십시오 git diff --stat. 이것은 다음과 같은 디스플레이를 제공합니다.

[me@somehost:~/newsite:master]> git diff --stat
 whatever/views/gallery.py |    8 ++++++++
 1 files changed, 8 insertions(+), 0 deletions(-)

변경 사항 자체의 줄 번호를 가져 오는 옵션은 없습니다.


1
실제 줄 번호를 생각하고있었습니다. 그래도 고마워.
wei

나는 그가 이것을 위해 GUI 도구를 원한다고 의심한다.
ThiefMaster

30

git diff master --compact-summary

출력은 다음과 같습니다

 src/app/components/common/sidebar/toolbar/toolbar.component.html   |  2 +-
 src/app/components/common/sidebar/toolbar/toolbar.component.scss   |  2 --

이것이 바로 당신이 필요로하는 것입니다. 커밋을 만들거나 원격에서 새 커밋을 가져올 때와 같은 형식입니다.

추신 : 아무도이 방법으로 대답하지 않은 것으로 유선.


1
지정되지 않았습니다. 1 년 전에 출시 된 2.18부터 작동합니다.
Seitbekir Seidametov

완전한. 이것은 나를 위해 일했고 응답은 완벽합니다.
빅터

15

1) 내가 좋아하는 것 :

git diff --name-status

파일 상태 앞에 붙습니다. 예 :

A   new_file.txt
M   modified_file.txt 
D   deleted_file.txt

2) 통계를 원하면 다음을 수행하십시오.

git diff --stat

다음과 같은 내용이 표시됩니다.

new_file.txt         |  50 +
modified_file.txt    | 100 +-
deleted_file         |  40 -

3) 마지막으로 파일 이름 만 정말로 원한다면 :

git diff --name-only

단순히 보여줄 것이다 :

new_file.txt
modified_file.txt
deleted_file

4

지금과 지정된 커밋 사이에서 각 파일에서 변경된 파일 이름과 행 수 / 숫자를 표시합니다.

git diff --stat <commit-hash>

2

나는 이것이 오래된 질문이라는 것을 알고 있지만 Windows에서는 파일에 대한 git 출력과 변경된 줄 번호를 필터링합니다.

(git diff -p --stat) | findstr "@@ --git"

diff --git a/dir1/dir2/file.cpp b/dir1/dir2/file.cpp
@@ -47,6 +47,7 @@ <some function name>
@@ -97,7 +98,7 @@ <another functon name>

파일과 변경된 줄을 추출하는 것이 약간 더 많은 작업입니다.

for /f "tokens=3,4* delims=-+ " %f in ('^(git diff -p --stat .^) ^| findstr ^"@@ --git^"') do @echo %f

a/dir1/dir2/file.cpp
47,7
98,7

1

가장 깨끗한 출력, 즉 파일 이름 / 경로 만

git diff-tree --no-commit-id --name-only -r

HTH


0

git version 2.17.1, 내장 플래그하지가 이 목적을 달성하기 위해.

통합 diff에서 파일 이름과 줄 번호를 필터링하는 명령 예는 다음과 같습니다.

git diff --unified=0 | grep -Po '^diff --cc \K.*|^@@@( -[0-9]+,[0-9]+){2} \+\K[0-9]+(?=(,[0-9]+)? @@@)' | paste -s -d':'

예를 들어, 통합 된 차이점은 다음과 같습니다.

$ git diff --unified=0
diff --cc foobar
index b436f31,df63c58..0000000
--- a/foobar
+++ b/foobar
@@@ -1,2 -1,2 +1,6 @@@ Line abov
++<<<<<<< HEAD
 +bar
++=======
+ foo
++>>>>>>> Commit message

결과는 다음과 같습니다.

❯ git diff --unified=0 | grep -Po '^diff --cc \K.*|^@@@( -[0-9]+,[0-9]+){2} \+\K[0-9]+(?=(,[0-9]+)? @@@)' | paste -s -d':'
foobar:1

공통 grep 일치 결과에서 명령 출력을 일치 시키려면 다음을 수행하십시오.

$ git diff --unified=0 | grep -Po '^diff --cc \K.*|^@@@( -[0-9]+,[0-9]+){2} \+\K[0-9]+(?=(,[0-9]+)? )| @@@.*' | sed -e '0~3{s/ @@@[ ]\?//}' | sed '2~3 s/$/\n1/g' | sed "N;N;N;s/\n/:/g"
foobar:1:1:Line abov
  1. grep -Po '^diff --cc \K.*|^@@@( -[0-9]+,[0-9]+){2} \+\K[0-9]+(?=(,[0-9]+)? ): diff --cc <filename>OR 에서 파일 이름 일치 OR 에서 줄 번호 @@@ <from-file-range> <from-file-range> <to-file-range>일치 이후의 나머지 텍스트와 일치 @@@시킵니다.
  2. sed -e '0~3{s/ @@@[ ]\?//}': @@@[ ]\?모든 세 번째 줄에서 제거 하여 선택 사항 인 한 줄 컨텍스트를 이전에 얻습니다 ++<<<<<<< HEAD.
  3. sed '2~3 s/$/\n1/g': \n1열 번호의 두 번째 줄과 세 번째 줄 사이에 세 줄을 모두 추가합니다.
  4. sed "N;N;N;s/\n/:/g":로 3 줄마다 연결하십시오 :.

0

나는 grep순진한 해결책으로 사용 합니다.

$ git diff | grep -A2 -- '---'

출력 예 :

--- a/fileA.txt
+++ b/fileA.txt
@@ -0,0 +1,132 @@
--
--- a/B/fileC.txt
+++ b/B/fileC.txt
@@ -33663,3 +33663,68800 @@ word_38077.png,Latin
--
--- a/D/fileE.txt
+++ b/D/fileE.txt
@@ -17998,3 +17998,84465 @@ word_23979.png,Latin
--
--- a/F
+++ b/F
@@ -1 +1 @@

컬러 출력이 표시 될 수 있습니다. 출력을 쉽게 읽을 수 있도록 도와줍니다.

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