Git: Jak porównać dwa różne pliki w różnych gałęziach?

170

Mam dwa różne pliki w różnych gałęziach. Jak mogę je porównać w jednym poleceniu?

Coś jak

# git diff branch1/foo.txt branch2/foo-another.txt

Mógłbym sprawdzić inny plik, porównać go i przywrócić, ale to dość brudne rozwiązanie.

Ondra Žižka
źródło
3
@EugenKonkov To nie jest duplikat, ponieważ to pytanie dotyczy porównania różnych plików w różnych gałęziach. Połączone pytanie dotyczy tylko tego, jak odróżnić ten sam plik w różnych gałęziach.
Steve

Odpowiedzi:

214
git diff branch1:full/path/to/foo.txt branch2:full/path/to/foo-another.txt

Możesz także użyć ścieżek względnych:

git diff branch1:./relative/path/to/foo.txt branch2:./relative/path/to/foo-another.txt
twaggs
źródło
9
Niesamowite! Z pewnością nie byłem w stanie tego wywnioskować git help diff. Nawiasem mówiąc, nie muszą to być nazwy gałęzi przed dwukropkami, ale mogą to być dowolne odniesienia do zatwierdzeń (np. Wartości SHA-1).
Steve Jorgensen
3
Ważna uwaga: Git w systemie Windows wymaga, aby pełna specyfikacja elementu była nazwą uniksową. tj. gałąź1: pełna \ ścieżka \ do \ foo.txt nie działa, podczas gdy gałąź1: pełna / ścieżka / do / foo.txt działa dobrze, podobnie jak pełna \ ścieżka \ do \ foo.txt (bez gałęzi)
Eris
użyj, git difftoola następnie upuść branch2:i, które pozwoli ci edytować plik w bieżącym drzewie roboczym (aby przenieść zmiany z branch1)
gMale
Wypróbowano na Linuksie z wersją git 1.8.3.1, dozwolone są tylko ścieżki względne.
Sola Yang
21

Uwaga dodatkowa: nie ma potrzeby stosowania pełnych ścieżek, możesz zacząć od ./ścieżek względnych. Czasami może się przydać.

git diff branch1:./relative/path/to/foo.txt branch2:./relative/path/to/foo-another.txt
Campa
źródło
2

Istnieje wiele sposobów porównywania plików z dwóch różnych gałęzi. Na przykład:

  • Jeśli nazwa jest taka sama lub inna:

     git diff branch1:file branch2:file
    

    Przykład:

     git diff branch1:full/path/to/foo.txt branch2:full/path/to/foo-another.txt
    
  • Tylko jeśli nazwa jest taka sama i chcesz porównać swój obecny katalog roboczy z jakąś gałęzią:

    git diff ..someBranch path/to/file
    

    Przykład:

    git diff ..branch2 full/path/to/foo.txt
    

    W tym przykładzie porównujesz plik z aktualnej gałęzi z plikiem w gałęzi głównej.

Możesz sprawdzić tę odpowiedź:

Porównaj plik z dwóch różnych gałęzi w Git

Javier C.
źródło
1

Odpowiedź nie na temat - zobacz komentarze

Dodając to, uważam, że jest to bardzo prosta składnia:

git diff <branch1> <branch2> <filepath>

Działa również z referencjami względnymi, takimi jak na przykład:

# compare the previous committed state from HEAD with the state branch1 was 3 commits ago
git diff HEAD^ <branch1>~3 <filepath>
RomainValeri
źródło
1
OP konkretnie poprosił o „różne pliki”. Twoja odpowiedź dotyczy porównania tego samego pliku w dwóch różnych gałęziach.
Etienne Miret
@EtienneMiret Masz całkowitą rację, przegapiłem ten ważny punkt. Odpowiedź nie na temat.
RomainValeri
-1

Możesz określić początek i zakres git diffdo zastosowania. Zakres jest oznaczony ..notacją.

branch1=somebranch
branch2=someotherbranch
git diff ${branch1}..${branch2} -- file_path
JCF
źródło
To jest tylko porównywanie tego samego pliku w dwóch gałęziach; pytanie dotyczyło dwóch różnych akt w dwóch oddziałach.
Piran