git diff переименованный файл


у меня есть файл a.txt.

cat a.txt
> hello

содержание a.txt "привет".

я делаю коммит.

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

я тогда двигаюсь 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. Есть ли такой?

4 94

4 ответа:

проблема с разницей между HEAD^^ и HEAD это у вас есть a.txt в обоих коммитах, поэтому просто рассматривая эти два коммита (что и делает diff), нет переименования, есть копия и изменение.

для обнаружения копий можно использовать -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

С git diff docs:

- M[] -- найти-переименовать[=]

обнаружить переименовывает. Если n указывается, это порог по индексу подобия (т. е. количество добавлений / удалений по сравнению с размером файла). Например, -M90% означает, что Git должен считайте, что пара delete / add является переименованием, если более 90% файла ничего не изменилось. Без % знак, номер следует читать как дробь, с десятичной запятой перед ней. Т. е., -M5 становится 0.5, и таким образом, это то же самое, что -M50%. Точно так же,-M05 это то же самое, что -M5%. К ограничьте обнаружение точных переименований, используйте -M100%. Сходство по умолчанию индекс составляет 50%.

вы также можете сделать:

git diff rev1:file1 rev2:file2

который, например, будет

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

обратите внимание на явные ./ -- этот формат, в противном случае предполагается, что пути относительно корня репозитория. (Если вы находитесь в корне РЕПО, вы можете, конечно, опустить это.)

Это не зависит от обнаружения переименования вообще, так как пользователь явно указывает, что именно сравнивать. (Поэтому он также пригодится в некоторых другие обстоятельства, такие как сравнение файлов между различными ветвями svn в среде git-svn.)

Если ваша фиксация переименования является поэтапной, но еще не зафиксирована, вы можете использовать:

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