У меня есть файл 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
. Есть один?
Ответы:
Проблема с разницей между
HEAD^^
иHEAD
заключается в том, что у вас естьa.txt
коммиты в обоих, поэтому, просто учитывая эти два коммита (что и делает diff), переименования нет, есть копия и изменение.Для обнаружения копий вы можете использовать
-C
:Результат:
Между прочим, если вы ограничиваете свое различие только одним путем (как и в случае с
git diff HEAD^^ HEAD a.txt
вами, вы никогда не увидите переименований или копий, потому что вы исключили все, кроме одного пути, и переименовываете или копируете - по определению - включаете два пути.источник
-- <old-path> <new-path>
... см. Мой ответ.git show -C [commit]
и он распознал переименование файла и показал мне diff между файлами. Отлично.Чтобы различать переименование определенного файла, используйте
-M -- <old-path> <new-path>
(-C
также работает).Итак, если вы переименовали и изменили файл в последней фиксации, вы можете увидеть изменения с помощью:
Это производит:
(
// a.txt
добавлены строки, чтобы помочь git обнаружить переименование)Если git не обнаруживает переименование, вы можете указать низкий порог схожести
-M[=n]
, скажем, 1%:Из документации git diff :
источник
git diff HEAD^^ HEAD -M -- a.txt test/a.txt
Вы также можете:
git diff rev1:file1 rev2:file2
который, для вашего примера, будет
git diff HEAD^^:./a.txt HEAD:./test/a.txt
Обратите внимание на явный
./
- этот формат в противном случае предполагает, что пути будут относиться к корню репо. (Если вы находитесь в корне репо, вы, конечно, можете опустить это.)Это вообще не зависит от обнаружения переименования, поскольку пользователь явно указывает, что именно сравнивать. (Следовательно, это также может быть полезно в некоторых других обстоятельствах, например, при сравнении файлов между разными ветвями svn в среде git-svn.)
источник
Если ваша фиксация переименования поставлена, но еще не зафиксирована, вы можете использовать:
источник