Odpowiedzi:
Musisz użyć -M, aby umożliwić gitowi automatyczne wykrycie przeniesionego pliku podczas porównywania. Używanie tak, git diff
jak wspomniano knittl, nie działa dla mnie.
Po prostu: git diff -M
powinien to zrobić.
Dokumentacja tego przełącznika to:
-M[<n>], --find-renames[=<n>]
Detect renames. If n is specified, it is a threshold on the similarity index
(i.e. amount of addition/deletions compared to the file’s size). For example,
-M90% means git should consider a delete/add pair to be a rename if more than
90% of the file hasn’t changed.
~/.gitconfig
?
git diff
. Uruchomienie git diff -M
na jednym pliku (o zmienionej nazwie) nie zgłasza zmiany nazwy.
git log --follow -- file_after_move.txt
działa dobrze. Pokazuje całą historię, także przed przeprowadzką. Jakieś pomysły? Biegnę git version 2.11.0.windows.1
.
-C
Możliwość wykrywania kopii jest użyteczne i podobne. Użyłem go -M
do przeglądania pliku różnicowego, w którym refaktoryzowałem jeden plik na dwa (bez nazwy pasującej do oryginału).
Oprócz tego, co napisał knittl , zawsze możesz użyć:
git diff HEAD:./oldfilename newfilename
gdzie HEAD:./oldfilename
oznacza starą nazwę pliku w ostatnim zatwierdzeniu (w HEAD), względem bieżącego katalogu.
Jeśli nie masz wystarczająco nowego gita, musisz zamiast tego użyć:
git diff HEAD:path/to/oldfilename newfilename
git diff 39fa7c77e85c51d43ea0cf30d33aec8721812e9e:./oldfilename newfilename
git diff branch:old/filen.name newfilename
cd
do katalogu nie dodajesz --
przed commit:path
parą. Git wydaje się być bardzo wybredny w kwestii składni.
<commit-ish>:<pathname>
Składnia to identyfikator obiektu, coś Git-ish; po tym, jak --
Git oczekuje tylko nazw plików.
Dzięki git 2.9 (czerwiec 2016) nie będziesz już musiał dodawać -M
. git diff
używa -M
domyślnie.
Zobacz zatwierdzenie 5404c11 , zatwierdzenie 9501d19 , zatwierdzenie a9276a6 , zatwierdzenie f07fc9e , zatwierdzenie 62df1e6 (25 lutego 2016) autorstwa Matthieu Moy ( moy
) .
(Scalone przez Junio C Hamano - gitster
- w zatwierdzeniu 5d2a30d , 03 kwietnia 2016)
diff
: aktywujdiff.renames
domyślnieWykrywanie zmiany nazwy to bardzo wygodna funkcja, a nowi użytkownicy nie powinni musieć kopać w dokumentacji, aby z niej skorzystać.
Potencjalne zastrzeżenia co do aktywacji wykrywania zmian nazwy są takie, że czasami kończy się niepowodzeniem, a czasami jest powolne. Jednak wykrywanie zmiany nazwy jest już domyślnie aktywowane w kilku przypadkach, takich jak „
git status
” i „git merge
”, więc aktywacjadiff.renames
nie zmienia zasadniczo sytuacji. Gdy wykrywanie zmiany nazwy nie powiedzie się, teraz kończy się niepowodzeniem między znakami „git diff
” i „git status
”.To ustawienie nie ma wpływu na polecenia dotyczące instalacji wodociągowych, dlatego nie ma to wpływu na dobrze napisane skrypty.
git diff -M
aktywuje wykrywanie zmiany nazwy, jak powiedzieli inni (i jak zauważył @VonC, jest domyślnie aktywowany od git 2.9). Ale jeśli masz duży zestaw zmian, wykrywanie niedokładnych zmian nazwy może nadal zostać wyłączone. Git wyświetli ostrzeżenie podobne do poniższego, które łatwo przeoczyć pośród przeglądanych różnic:
warning: inexact rename detection was skipped due to too many files.
warning: you may want to set your diff.renameLimit variable to at least 450 and retry the command.
W takim przypadku ustaw opcję konfiguracyjną tak, jak sugeruje na przykład git
git config diff.renamelimit 450
i ponownie uruchom polecenie diff.
Z jakiegoś powodu użycie HEAD:./oldfilename
(lub ścieżki absolutnej) nie zadziałało dla mnie, ale zadziałało HEAD:oldfilename
(dzięki cmn):
git diff HEAD:oldfilename newfilename
git diff 2a80f45:oldfilename f65f3b3:newfilename
HTH
HEAD:./oldfilename
?
po prostu uruchom git diff
bez żadnych argumentów lub git diff -- newfilename
. git jest wystarczająco inteligentny, aby porównać właściwe pliki / treści (tj. oryginalną zawartość przed zmianą nazwy ze zmienioną treścią po zmianie nazwy)
git mv
sprawdzenie pojedynczego pliku, a następnie porównanie stanu pomostowego z inną identyczną gałęzią spowoduje powstanie różnicy „wszystko zostało usunięte i odtworzone”, chyba że -M
zostanie użyta.
git diff -- yourRenamedFile
. Zobacz moją odpowiedź poniżej