파일이 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.txt
git이 이름 바꾸기를 감지 할 수 있도록 추가 된 행)
git이 이름 변경을 감지하지 못하는 경우 를 사용하여 낮은 유사성 임계 값 ( -M[=n]
예 : 1 %)을 지정할 수 있습니다 .
git diff HEAD^ HEAD -M01 -- a.txt test/a.txt
에서 힘내은 diff 문서 :
-M [<n>]-이름 찾기 [= <n>]
이름 변경을 감지합니다. 경우
n
지정, 그것은 유사성 지수 임계 값 (파일의 크기에 비해 추가 / 삭제의 예 양)입니다. 예를 들어,-M90%
Git은 파일의 90 % 이상이 변경되지 않은 경우 삭제 / 추가 쌍을 이름 바꾸기로 간주해야합니다.%
부호가 없으면 숫자 앞에 소수점이있는 분수로 읽습니다. 즉,-M5
0.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