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 ответа:
проблема с разницей между
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
- 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.)