Mam plik a.txt
.
cat a.txt
> hello
Treść a.txt
to „cześć”.
Zobowiązuję się.
git add a.txt
git commit -m "first commit"
Następnie przenoszę a.txt
się do test
reż.
mkdir test
mv a.txt test
Następnie wykonuję drugie zobowiązanie.
git add -A
git commit -m "second commit"
Na koniec edytuję, a.txt
aby zamiast tego powiedzieć „do widzenia”.
cat a.txt
> goodbye
Robię ostatnie zobowiązanie.
git add a.txt
git commit -m "final commit"
Oto moje pytanie:
Jak odróżnić zawartość a.txt
między moim ostatnim zatwierdzeniem a pierwszym zatwierdzeniem?
Próbowałem:
git diff HEAD^^..HEAD -M a.txt
ale to nie zadziałało. git log --follow a.txt
poprawnie wykrywa zmianę nazwy, ale nie mogę znaleźć odpowiednika dla git diff
. Czy jest jeden?
Odpowiedzi:
Problem z różnicą między
HEAD^^
iHEAD
polega na tym, że masza.txt
oba zatwierdzenia, więc biorąc pod uwagę te dwa zatwierdzenia (co robi diff), nie ma zmiany nazwy, jest kopia i zmiana.Aby wykryć kopie, możesz użyć
-C
:Wynik:
Nawiasem mówiąc, jeśli ograniczysz swoją różnicę tylko do jednej ścieżki (tak jak w przypadku
git diff HEAD^^ HEAD a.txt
, nie zobaczysz zmian nazw ani kopii, ponieważ wykluczyłeś wszystko oprócz pojedynczej ścieżki, a zmiany nazw lub kopii - z definicji - obejmują dwa ścieżki.źródło
-- <old-path> <new-path>
... zobacz moją odpowiedź.git show -C [commit]
i rozpoznałem zmianę nazwy pliku i pokazał mi różnica między plikami. Idealny.Aby porównać zmianę nazwy określonego pliku, użyj
-M -- <old-path> <new-path>
(-C
również działa).Więc jeśli zarówno zmieniliście nazwę, jak i zmieniliście plik w ostatnim zatwierdzeniu, możesz zobaczyć zmiany za pomocą:
To daje:
(
// a.txt
dodano wiersze, aby pomóc gitowi wykryć zmianę nazwy)Jeśli git nie wykrywa zmiany nazwy, możesz określić niski próg podobieństwa
-M[=n]
, powiedzmy 1%:Z dokumentacji git diff :
źródło
git diff HEAD^^ HEAD -M -- a.txt test/a.txt
Możesz też:
git diff rev1:file1 rev2:file2
co, na przykład, byłoby
git diff HEAD^^:./a.txt HEAD:./test/a.txt
Zwróć uwagę na jawne
./
- w przeciwnym razie ten format zakłada, że ścieżki są względne w stosunku do katalogu głównego repozytorium. (Jeśli jesteś w katalogu głównym repozytorium, możesz oczywiście to pominąć).W ogóle nie zależy to od wykrywania zmiany nazwy, ponieważ użytkownik wyraźnie określa, co dokładnie porównać. (Dlatego przydaje się również w innych okolicznościach, takich jak porównywanie plików między różnymi gałęziami svn w środowisku git-svn).
źródło
Jeśli zmiana nazwy jest przygotowana, ale jeszcze nie została zatwierdzona, możesz użyć:
źródło