Jak porównać pliki z dwóch różnych gałęzi?

1537

Mam skrypt, który działa dobrze w jednej gałęzi, a jest uszkodzony w innej. Chcę spojrzeć na dwie wersje obok siebie i zobaczyć, co jest inne. Czy są na to jakieś sposoby?

Żeby było jasne , nie szukam narzędzia porównywania (używam Beyond Compare). Szukam polecenia git diff, które pozwoli mi porównać wersję główną z moją bieżącą wersją oddziału, aby zobaczyć, co się zmieniło. Nie jestem w trakcie fuzji ani nic takiego. Chcę tylko powiedzieć coś takiego

git diff mybranch/myfile.cs master/myfile.cs
Micheasz
źródło

Odpowiedzi:

2207

git diff może pokazać różnicę między dwoma zatwierdzeniami:

git diff mybranch master -- myfile.cs

Lub równoważnie:

git diff mybranch..master -- myfile.cs

Używając tej drugiej składni, jeśli którąkolwiek ze stron jest HEAD, można ją pominąć (np. master..Porównuje masterdo HEAD).

Możesz być także zainteresowany mybranch...master(z git diffdokumentów ):

Ten formularz służy do przeglądania zmian w gałęzi zawierającej i do drugiej <commit>, zaczynając od wspólnego przodka obu <commit>. git diff A...Bjest równoważne z git diff $(git-merge-base A B) B.

Innymi słowy, da to różnicę w zmianach, masterponieważ odbiegało mybranch(ale bez nowych zmian od tego czasu w mybranch).


We wszystkich przypadkach --separator przed nazwą pliku wskazuje koniec flag wiersza poleceń. Jest to opcjonalne, chyba że Git się pomyli, jeśli argument odnosi się do zatwierdzenia lub pliku, ale włączenie go nie jest złym nawykiem. Zobacz kilka przykładów na https://stackoverflow.com/a/13321491/54249


Te same argumenty mogą zostać przekazane, git difftooljeśli masz jeden skonfigurowany.

dahlbyk
źródło
44
A jeśli żadna z dwóch wersji, które chcesz porównać, nie jest drzewem roboczym, możesz użyć git diff branch1 branch2 myfile.cs. (Nie --powinno to już być konieczne, ponieważ może zająć tylko dwa argumenty rewizji.)
Cascabel,
8
Próbowałem każdej wersji tego i nic się nie dzieje. Mam skonfigurowany mój difftool (działa w celu scalenia). Mam plik o nazwie bd.ps1. Każda wersja wpisanego polecenia nic nie robi. Nie daje nawet błędu. WTH!?!?!
Micheasza
3
@Micah: Czy też próbujesz tego ze zwykłym diff? Czy poprawnie wpisujesz ścieżkę względem bieżącego katalogu? (Po cichu nie pokaże żadnej różnicy, jeśli plik nie istnieje, a ty używasz --. Powszechnego i łatwego błędu do popełnienia.)
Cascabel
5
Nie działało to dla mnie, chyba że podałem pełną ścieżkę do pliku, jak pokazano git diff --name-status branch1..branch2(prawdopodobnie oczywiste, ale pomyślałem, że wspomnę o tym na wypadek, gdyby ktoś miał takie same problemy).
hBrent
4
Ważna jest również kolejność mybranch i master. Plik w pierwszej gałęzi zostanie wyświetlony z prefiksem „-”, plik w drugiej gałęzi zostanie wyświetlony z prefiksem „+”.
timbo
413

Możesz to zrobić: git diff branch1:path/to/file branch2:path/to/file

Jeśli skonfigurowałeś difftool, możesz także: git difftool branch1:path/to/file branch2:path/to/file

Powiązane pytanie: Jak wyświetlić dane wyjściowe git diff za pomocą programu Visual Diff

Tim Henigan
źródło
4
Używanie dwukropków nie jest tak naprawdę świetnym sposobem - oznacza to, że odwołujesz się do plików poprzez obiekty drzewa, więc musisz wpisać pełną ścieżkę zamiast w stosunku do bieżącego katalogu.
Cascabel,
13
@Jefromi, to mogło się zmienić w nowszej wersji, ale przynajmniej teraz możesz używać ścieżek względnych (np branch1:./file.). Jest to również przydatne, jeśli plik znajduje się w oddzielnej lokalizacji między gałęziami (np git diff branch1:old/path/to/file branch2:new/path/to/file.).
redbmk
4
@redbmk Tak, to było między 2010 a teraz! Jeśli jednak jest to ten sam plik w obu gałęziach, nie musisz tego robić w ten sposób, po prostu git diff branch1 branch2 path/to/file.
Cascabel
3
@jefromi spoko, nie byłem pewien, czy oś czasu jest włączona, kiedy to zostało dodane. Tak, normalnie użyłbym składni, o której wspomniałeś, ale odpowiedź Tima pomogła mi wymyślić, jak porównać pliki z różnymi ścieżkami, nawet jeśli nie tak naprawdę zadawało to pytanie
redbmk
1
Chociaż podoba mi się ten pomysł, nie mogę uruchomić tej składni ani znaleźć żadnej wzmianki o nim w dokumentach git diff. czego mi brakuje? Dzięki!
yoyo
160

Bardziej nowoczesna składnia:

git diff ..master path/to/file

Prefiks z podwójną kropką oznacza „z bieżącego katalogu roboczego do”. Możesz też powiedzieć:

  • master.., tj. odwrotność powyższego. To jest to samo co master.
  • mybranch..master, wyraźnie odwołując się do stanu innego niż bieżące drzewo robocze.
  • v2.0.1..master, tj. odwoływanie się do tagu.
  • [refspec]..[refspec], w zasadzie wszystko, co można zidentyfikować jako stan kodu do git.
Joe Atzberger
źródło
33

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

  • Opcja 1: Jeśli chcesz porównać plik z konkretnej gałęzi z inną konkretną gałęzią:

    git diff branch1name branch2name path/to/file
    

    Przykład:

    git diff mybranch/myfile.cs mysecondbranch/myfile.cs
    

    W tym przykładzie porównujesz plik w gałęzi „mybranch” z plikiem w gałęzi „mysecondbranch”.

  • Opcja 2: Prosty sposób:

     git diff branch1:file branch2:file
    

    Przykład:

     git diff mybranch:myfile.cs mysecondbranch:myfile.cs
    

    Ten przykład jest podobny do opcji 1.

  • Opcja 3: Jeśli chcesz porównać bieżący katalog roboczy z jakimś oddziałem:

    git diff ..someBranch path/to/file
    

    Przykład:

    git diff ..master myfile.cs
    

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

Javier C.
źródło
12

Po prostu robię git diff branch1 branch2 path/to/file

Sprawdza to różnice między plikami. Zmiany w branch1byłyby na czerwono. Zmiany branch2będą w kolorze zielonym.

Zakłada się, że branch1to przeszłość i branch2przyszłość. Możesz to odwrócić, odwracając kolejność gałęzi w pliku różnicowym:git diff branch2 branch1

iGbanam
źródło
Która wersja git diff może to zrobić? Wydaje się, że nie jest obsługiwany w wersji, którą uruchamiam (2..9.2.windows.1).
Vince Bowdren,
9

Jeśli chcesz zrobić różnicę w stosunku do bieżącej gałęzi, możesz ją pominąć i użyć:

git diff $BRANCH -- path/to/file

w ten sposób będzie się różnić od bieżącej gałęzi do referencyjnej gałęzi ( $BRANCH).

Paulo Fidalgo
źródło
5

Zgadzam się z odpowiedzią sugerowaną przez @dahlbyk. Jeśli chcesz, aby diff został zapisany w pliku diff do recenzji kodu, użyj następującego polecenia.

git diff branch master -- filepath/filename.extension > filename.diff --cached
Azad
źródło
2

W moim przypadku używam poniższego polecenia:

git diff <branch name> -- <path + file name>

To polecenie może pomóc porównać ten sam plik w dwóch różnych gałęziach

SKT
źródło
1

Najlepszym sposobem na to jest użycie git diffnastępującego sposobu: git diff <source_branch> <target_branch> -- file_path

Sprawdzi różnicę między plikami w tych gałęziach. Przeczytaj ten artykuł, aby uzyskać więcej informacji na temat poleceń git i ich działania.

Nesha Zoric
źródło
1

Użyj skrótów zatwierdzania w następujący sposób:

git diff <hash1> <hash2> <filename>

gdzie hash1 może być dowolnym zatwierdzeniem z dowolnej gałęzi, to samo dla hash2 .

prometeu
źródło
1

Istnieją dwa scenariusze porównywania plików:

Scenariusz 1: Porównaj pliki w zdalnych oddziałach (obie gałęzie powinny istnieć w zdalnym repozytorium)

Scenariusz 2: Porównaj pliki lokalne (w lokalnej kopii obszaru roboczego) z plikami w zdalnym repozytorium.

Logika jest prosta. Jeśli podasz dwie nazwy gałęzi w celu porównania, zawsze porówna gałęzie zdalne, a jeśli podasz tylko jedną nazwę gałęzi, zawsze porówna lokalną kopię roboczą ze zdalnym repozytorium (tą, którą podałeś). Możesz użyć zakresu, aby zapewnić zdalne repozytoria.

np. kasy oddział

git checkout branch1
git diff branch2 [filename]

w takim przypadku, jeśli podasz nazwę pliku, porówna twoją lokalną kopię nazwy pliku ze zdalną gałęzią o nazwie „ gałąź2 ”.

git diff branch1 branch2 [filename]

w tym przypadku porówna nazwę pliku ze zdalnych gałęzi o nazwie „ gałąź 1 ” i „ gałąź 2

git diff ..branch2 [filename]

również w tym przypadku porówna nazwę pliku ze zdalnych gałęzi o nazwie „ gałąź 1 ” i „ gałąź 2 ”. Tak samo jak powyżej. Jeśli jednak właśnie utworzyłeś gałąź z innej gałęzi, powiedz „master”, a twoja obecna gałąź nie istnieje w zdalnym repozytorium, porówna ona zdalny „ master ” ze zdalnym „ branch2 ”.

Mam nadzieję, że się przyda.

Dharmender Rawat
źródło
0

Aby porównać dwa pliki w git bash, musisz użyć polecenia:

git diff <Branch name>..master -- Filename.extension   

To polecenie pokaże różnicę między dwoma plikami w samym bashu.

Rishav_SO
źródło