[git] git diff 이름이 변경된 파일

파일이 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. 하나있어?



답변

차이의 문제 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단일 경로를 제외한 모든 항목을 제외하고 이름을 변경하거나 복사하는 경우 정의에 따라 두 가지가 포함되므로 이름이 변경되거나 복사본이 표시되지 않습니다. 경로.


답변

특정 파일의 이름을 바꾸려면 -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 rev1:file1 rev2:file2

예를 들어,

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

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

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


답변

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

git diff --cached -M -- file.txt renamed_file.txt


답변