git diff 이름이 변경된 파일


105

파일이 a.txt있습니다.

cat a.txt
> hello

의 내용 a.txt은 "안녕하세요"입니다.

나는 커밋합니다.

git add a.txt
git commit -m "first commit"

그런 다음 dir 로 이동 a.txt합니다 test.

mkdir test
mv a.txt test

그런 다음 두 번째 커밋을합니다.

git add -A
git commit -m "second commit"

마지막으로 a.txt대신 "안녕"이라고 편집 합니다.

cat a.txt
> goodbye

마지막 커밋을합니다.

git add a.txt
git commit -m "final commit"

이제 여기 내 질문이 있습니다.

a.txt마지막 커밋과 첫 커밋 사이 의 내용을 어떻게 비교 합니까?

시도해 보았지만 git diff HEAD^^..HEAD -M a.txt작동하지 않았습니다. git log --follow a.txt이름을 제대로 감지하지만 git diff. 하나있어?


나는 당신이 'git mv a.txt test'를했다면 똑같을 것이라고 생각합니까? IE를 하위 디렉토리로 이동하는 대신 파일 이름을 변경했습니다.
Max Waterman

답변:


107

차이의 문제 HEAD^^와는 HEAD당신이 가지고있다 a.txt사본 및 변화가 어떤 이름 바꾸기가 없다, 그래서 그냥 (차이는 무엇 인) 두 커밋을 고려, 모두 커밋에 있습니다.

복사본을 감지하려면 다음을 사용할 수 있습니다 -C.

git diff -C HEAD^^ HEAD

결과:

index ce01362..dd7e1c6 100644
--- a/a.txt
+++ b/a.txt
@@ -1 +1 @@
-hello
+goodbye
diff --git a/a.txt b/test/a.txt
similarity index 100%
copy from a.txt
copy to test/a.txt

덧붙여서, diff를 하나의 경로로 제한하는 경우 ( git diff HEAD^^ HEAD a.txt단일 경로를 제외한 모든 항목을 제외하고 이름을 변경하거나 복사하는 경우 정의에 따라 두 가지가 포함되므로 이름이 변경되거나 복사본이 표시되지 않습니다. 경로.


2
커밋에 여러 파일 변경 사항이 포함되어 있다고 가정 해 보겠습니다. 단일 파일의 차이점으로 어떻게 좁힐 수 있습니까?
Ken Hirakawa

3
@KenHirakawa 사용 -- <old-path> <new-path>... 내 대답을 참조하십시오.
놀란 에이미

제 경우에는 파일 이름이 변경된 커밋의 세부 정보를 표시하고 싶었지만 파일이 삭제되고 파일이 추가되었음을 표시하는 것뿐입니다. 실행 git show -C [commit]하고 파일 이름 변경을 인식하고 파일 간의 차이. 완전한.
Jason

83

특정 파일의 이름을 바꾸려면 -M -- <old-path> <new-path>( -C도 작동 함)을 사용하십시오.

따라서 마지막 커밋에서 파일의 이름 변경 하고 변경 한 경우 다음을 사용 하여 변경 사항을 볼 수 있습니다.

git diff HEAD^ HEAD -M -- a.txt test/a.txt

이것은 다음을 생성합니다.

diff --git a/a.txt b/test/a.txt
similarity index 55%
rename from a.txt
rename to test/a.txt
index 3f855b5..949dd15 100644
--- a/a.txt
+++ b/test/a.txt
@@ -1,3 +1,3 @@
 // a.txt

-hello
+goodbye

( // a.txtgit이 이름 바꾸기를 감지 할 수 있도록 추가 된 행)


git이 이름 변경을 감지하지 못하는 경우 를 사용하여 낮은 유사성 임계 값 ( -M[=n]예 : 1 %)을 지정할 수 있습니다 .

git diff HEAD^ HEAD -M01 -- a.txt test/a.txt

에서 힘내은 diff 문서 :

-M [<n>]-이름 찾기 [= <n>]

이름 변경을 감지합니다. 경우 n지정, 그것은 유사성 지수 임계 값 (파일의 크기에 비해 추가 / 삭제의 예 양)입니다. 예를 들어, -M90%Git은 파일의 90 % 이상이 변경되지 않은 경우 삭제 / 추가 쌍을 이름 바꾸기로 간주해야합니다. %부호가 없으면 숫자 앞에 소수점이있는 분수로 읽습니다. 즉, -M50.5가되므로 -M50%. 마찬가지로 -M05동일하다 -M5%. 정확한 이름 변경으로 검색을 제한하려면 -M100%. 기본 유사성 지수는 50 %입니다.


... 물론 원래 예제에서와 같이 변경 및 이름 변경이 별도의 커밋에있을 때도 작동합니다.git diff HEAD^^ HEAD -M -- a.txt test/a.txt
Nolan Amy

1
diff가 유사성 색인을 얻을 수있을만큼 파일의 내용이 충분히 가까울 때만. 두 옵션 (-M 및 -C)을 사용하면 이름이 변경되고 완전히 변경된 파일 (들여 쓰기 포함)에서 / dev / null에서 / dev / null에 대한 차이점이 표시됩니다. 무시할 때도 잡히지 않습니다. 공백.
DavidG 2013-04-12

37

다음을 수행 할 수도 있습니다.

git diff rev1:file1 rev2:file2

예를 들어,

git diff HEAD^^:./a.txt HEAD:./test/a.txt

명시 적에 유의하십시오. ./그렇지 않으면이 형식은 경로가 저장소의 루트에 상대적인 것으로 가정합니다. (repo의 루트에 있다면 물론 생략 할 수 있습니다.)

사용자가 비교할 대상을 명시 적으로 명시하기 때문에 이는 이름 변경 감지에 전혀 의존하지 않습니다. (따라서 git-svn 환경에서 서로 다른 svn 브랜치 간의 파일 비교와 같은 다른 상황에서도 유용합니다.)


1
오, 이거 좋다!
Nolan Amy

병합을 통해 가져온 추가 파일 변경 사항으로 이름을 바꾸려면 이것이 저에게 도움이 된 유일한 대답입니다. 감사!
Lane Rettig

1

이름 바꾸기 커밋이 준비되었지만 아직 커밋되지 않은 경우 다음을 사용할 수 있습니다.

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