Pokazuje, które pliki zmieniły się między dwiema wersjami

2105

Chcę scalić dwie gałęzie, które zostały oddzielone na jakiś czas i chciałem wiedzieć, które pliki zostały zmodyfikowane.

Przeszedłem przez ten link: http://linux.yyz.us/git-howto.html, co było dość przydatne.

Narzędzia do porównywania gałęzi, na które natrafiłem, to:

  • git diff master..branch
  • git log master..branch
  • git shortlog master..branch

Zastanawiałem się, czy istnieje coś takiego jak „git status master..branch”, aby zobaczyć tylko te pliki, które różnią się między dwiema gałęziami.

Bez tworzenia nowego narzędzia, myślę, że jest to najbliższe, co możesz zrobić teraz (co oczywiście pokaże powtórzenia, jeśli plik został zmodyfikowany więcej niż raz):

  • git diff master..branch | grep "^diff"

Zastanawiałem się, czy coś mi umknęło ...

johannix
źródło
12
Ilu innych uważa, że ​​tytuł tego pytania jest mylący? W rzeczywistości chodzi o znalezienie różnic w plikach między dwiema gałęziami. Poszedłem tutaj, aby zobaczyć różnice w plikach między dwiema wersjami tego samego oddziału. A może jestem jedyny?
Sandeepan Nath,
4
@SandeepanNath: z git nie ma różnicy. ZAWSZE masz na myśli indywidualne zobowiązania.
Samuel O'Malley
@ SamuelO'Malley Jestem nowy w git i rozważam pozornie powszechną strategię rozgałęziania, w której wszystkie gałęzie są ostatecznie łączone z gałęzią główną i ostatecznie master jest wdrażany. Teraz, biorąc pod uwagę przypadek wdrożenia, w którym produkcja jest już na etapie głównym, ale za wskazówką (o jedną wersję, jeśli ostatnie wdrożenie miało miejsce po ostatnim scaleniu głównym), chciałbym zobaczyć różnice między tymi dwiema wersjami, aby dowiedz się, co zostanie wdrożone. Nie chciałbym patrzeć na gałąź, która została ostatnio scalona. Popraw mnie, jeśli się mylę.
Sandeepan Nath,
2
@ SandeepanNath: zamiast używać nazw gałęzi, możesz wziąć poniższe odpowiedzi i po prostu podać identyfikatory zatwierdzenia. Lub nawet odsyłaj commity według ich nazw, jeśli tworzysz tagi podczas wdrażania.
Samuel O'Malley
1
@ SandeepanNath Nie można porównać 2 gałęzi, należy określić wersję. Porównując 2 gałęzie, porównujemy 2 wersje.
Bastien Vandamme,

Odpowiedzi:

2573

Aby porównać bieżący oddział z masteroddziałem:

$ git diff --name-status master

Aby porównać dowolne dwie gałęzie:

$ git diff --name-status firstbranch..yourBranchName

Przeczytaj git diffw oficjalnej dokumentacji .

JasonSmith
źródło
2
Co oznaczają poszczególne wskaźniki po lewej stronie (widzę dużo liter M i D)?
gogogadgetinternet
15
@ user446936 - możesz zobaczyć, co oznaczają litery na stronie man statusu git @ kernel.org/pub/software/scm/git/docs/git-status.html - w szczególności M == zmodyfikowany, D == usunięty
James Manning
12
git diff --name-status your_branch...masterwypisuje zmiany, które zaszły w Master, odkąd twoja twoja gałąź została utworzona z niego
Radu,
1
Operator podwójnej kropki jest tutaj zbędny, ponieważ różnice są parami.
jub0bs,
2
Dostaję nieznaną wersję lub ścieżkę spoza działającego drzewa.
SuperUberDuper
408

Próbować

$ git diff --stat --color master..branchName

To da ci więcej informacji o każdej zmianie, przy jednoczesnym użyciu tej samej liczby linii.

Możesz także obrócić gałęzie, aby uzyskać jeszcze wyraźniejszy obraz różnicy, jeśli połączysz w drugą stronę:

$ git diff --stat --color branchName..master
Gerry
źródło
77
Jeśli masz (wysoce zalecane, imho) git kolor włączony ( config --global color.ui true), możesz pominąć --color. (Mam lks - syndrom leniwej klawiatury.)
Art Swri,
25
Jestem z tobą w kolorze! BTW chciałem powiedzieć git config --global color.ui true- aby być kompletnym.
Art Swri,
2
Nie działa, generuje błędy:fatal: ambiguous argument 'master..branchName': unknown revision or path not in the working tree.
Tomáš Zato - Przywróć Monikę
7
@ TomášZato przepraszam, ale musisz zamienić „branchName” na nazwę swojego oddziału.
Gerry
161

Pamiętaj również, że git ma tanie i łatwe rozgałęzianie. Jeśli myślę, że scalenie może być problematyczne, tworzę gałąź dla scalenia. Więc jeśli mastermam zmiany, które chcę scalić i bajest to moja gałąź, która potrzebuje kodu z mastera, mogę wykonać następujące czynności:

git checkout ba
git checkout -b ba-merge
git merge master
.... review new code and fix conflicts....
git commit
git checkout ba
git merge ba-merge
git branch -d ba-merge
git merge master

Efektem końcowym jest to, że muszę wypróbować scalenie na gałęzi wyrzucanej przed wkręceniem mojej gałęzi. Jeśli się zaplątam, mogę po prostu usunąć ba-mergegałąź i zacząć od nowa.

Eric Anderson
źródło
4
Niesamowite. Nigdy nie myślałem o rozgałęzieniu w ten sposób. Uważam, że należy to uwzględnić w ramach „najlepszych praktyk” podczas łączenia.
egelev
Kiedy połączysz ba-marge z powrotem w ba, nie ma możliwości, aby ponownie rozwiązać konflikty?
Josef.B
2
@EricAnderson Racja, to wykres. SVN wbija się jak guma pod szkolne biurko. dzięki.
Josef.B
1
Dlaczego musisz zrobić ostatni krok 'git merge master', jeśli ba-merge już miał master
qwebek
Możesz to przerwać. Jedynym powodem, dla którego przydałoby się to, jest pojawienie się nowych rzeczy masterpodczas pracy nad przeglądaniem kodu i rozwiązywaniem konfliktów.
Eric Anderson
58

Jeśli ktoś próbuje wygenerować plik różnicowy z dwóch gałęzi:

git diff master..otherbranch > myDiffFile.diff
Paulino III
źródło
2
Przydało się to zwłaszcza w przypadku dużych gałęzi zawierających wiele różnic.
vandsh
Jest to przydatne, gdy różnica jest naprawdę duża. Domyślnie nie wyświetlałby wszystkich różnic w konsoli (zastanawiałem się dlaczego), w takim przypadku należy przekazać różnicę do pliku.
rotimi-best
42

Istnieje również metoda oparta na GUI.

Możesz użyć gitk .

  1. Biegać:

    $ gitk --all
    
  2. Kliknij prawym przyciskiem myszy na zatwierdzenie oddziału i wybierz Oznacz to zatwierdzenie z wyskakującego menu.

  3. Kliknij prawym przyciskiem myszy na zatwierdzenie innej gałęzi i wybierz Zróżnicuj to -> oznaczone zatwierdzenie lub Zróżnicowane zaznaczenie -> to .

Następnie pojawi się lista zmienionych plików w prawym dolnym panelu i szczegóły różnic w lewym dolnym panelu.

Yantao Xie
źródło
3
@Orwellophile Przesyłam film, aby pokazać, jak to zrobić. Mam nadzieję, że ci to pomoże.
Yantao Xie,
Wow, tylko dla mnie czuję się wyjątkowo. Dodałem go do zakładek w delicious.com w celu późniejszego wykorzystania i dodatkowego google-foo.
Orwellophile,
Bardzo niedoceniana odpowiedź. Dzięki!
Koshinae
36

Jeszcze jedna opcja, w tym przypadku za pomocą meldowania:

git difftool -d master otherbranch

Pozwala to nie tylko zobaczyć różnice między plikami, ale także zapewnia łatwy sposób wskazywania i klikania określonego pliku.

rsilva4
źródło
6
Może chcesz ustawić Meld jako domyślny difftool: git config --global diff.tool meld
bwv549
1
Jest to mój ulubiony, ponieważ użyje dowolnego skonfigurowanego difftool.
Josiah
Nieobsługiwany w OSX. :-(
Mike S.
@MikeS. sprawdź tę odpowiedź stackoverflow.com/a/12815806/151918 zawiera instrukcje dla OSX. Działa mi przynajmniej, mam nadzieję, że to pomoże.
rsilva4
Miły. Ale jaka jest -dopcja?
Scotty.NET,
29

Zauważ, że git ułatwia wypróbowanie scalenia i uniknięcie problemów, jeśli nie podoba ci się wynik. Może to być łatwiejsze niż wcześniejsze wyszukiwanie potencjalnych problemów.

David Plumpton
źródło
10
David, to dobra uwaga, chociaż byłoby miło wiedzieć, co się dzieje wcześniej ...
johannix
18

A jeśli szukasz zmian tylko w niektórych plikach, to:

git diff branch1 branch2 -- myfile1.js myfile2.js

oddział 1 jest opcjonalny, a obecny oddział (oddział, w którym się znajdujesz) będzie domyślnie brany pod uwagę, jeśli oddział 1 nie zostanie podany. na przykład:

git diff master -- controller/index.js
Mannu
źródło
15

Podczas pracy zespołowej lub nad wieloma funkcjami jednocześnie powszechne jest, że nadrzędny, a nawet twój master zawiera prace, które nie są zawarte w twojej gałęzi i będą niepoprawnie pojawiać się w podstawowych różnicach.

Jeśli Twój Upstream mógł się przenieść, powinieneś to zrobić:

git fetch
git diff origin/master...

Samo użycie git diff master może zawierać lub nie zawierać odpowiednich zmian.

Alex Brown
źródło
8

Powiedzmy, że są dwie gałęzie

  • A (Oddział, nad którym pracujesz)
  • B (Kolejna gałąź, z którą chcesz porównać)

Będąc w oddziale A możesz pisać

git diff --color B

to da ci wynik

wprowadź opis zdjęcia tutaj

Ważną kwestią jest to

  1. Tekst w kolorze zielonym znajduje się wewnątrz w Oddziale A

  2. Tekst w kolorze czerwonym jest obecny w Oddziale B

selftaught91
źródło
8

Tutaj jest wiele odpowiedzi, ale chciałem dodać coś, z czego często korzystam. JEŻELI jesteś w jednej z gałęzi, którą chcesz porównać, zazwyczaj wykonuję jedną z następujących czynności. Ze względu na tę odpowiedź powiemy, że jesteśmy w naszej drugiej gałęzi. W zależności od tego, jaki widok potrzebujesz w danym momencie, będzie zależeć od tego, który wybierzesz, ale przez większość czasu używam drugiej opcji z tych dwóch. Pierwsza opcja może się przydać, jeśli próbujesz przywrócić oryginalną kopię - w obu przypadkach zadanie zostanie wykonane!

Spowoduje to porównanie wzorca do gałęzi, w której się znajdujemy (która jest drugorzędna), a oryginalny kod będzie dodanymi wierszami, a nowy kod będzie uważany za usunięte wiersze

git diff ..master

LUB

Spowoduje to również porównanie mastera do gałęzi, w której się znajdujemy (która jest drugorzędna), a oryginalny kod będzie starymi liniami, a nowy kod będzie nowymi liniami

git diff master..
TheCodenator
źródło
1

Jeśli korzystasz z Github / Github Enterprise, możesz korzystać z internetowego interfejsu użytkownika, klikając adres URL /compareścieżki do repozytorium, na przykład https://github.com/http4s/http4s/compare . Możesz wybrać gałąź / zatwierdzenie / tag, który chcesz porównać: Zrzut ekranowy porównania Github

I diff zostanie zaprezentowany w interfejsie github pod adresem URL, /compare/{x1}...{x2}gdzie są x2i x1są gałęzią / zatwierdzeniem / znacznikiem, który chcesz porównać, na przykład: https://github.com/http4s/http4s/compare/release-0.18.x ...mistrz

Możesz zobaczyć więcej w Github Doc .

Valy Dia
źródło
0

Dla osób, które szukają rozwiązania GUI, Git Cola ma bardzo przyjemną „Branch Diff Viewer ( Diff -> Branch .. ).

kerner1000
źródło
-1
git diff revision_n revision_m

jeśli revision_ni revision_msą kolejnymi zatwierdzeniami, to wypisuje to samo co git show revision_m

Jovo Skorupan
źródło
-2

Jeśli podoba Ci się GUI i korzystasz z systemu Windows, oto prosty sposób.

  1. Pobierz WinMerge
  2. Sprawdź dwie gałęzie w różnych folderach
  3. Wykonaj porównanie folderów według folderów za pomocą WinMerge. Możesz także łatwo modyfikować, jeśli pracujesz nad jedną z gałęzi.
Marius Matioc
źródło
To nie jest najprostszy sposób, w rzeczywistości nie ma potrzeby pobierania repozytoriów, aby różnicować się między gałęziami.
stefgosselin
To rzeczywiście nie jest najprostszy sposób, ale jest to sposób GUI, który często jest o wiele łatwiejszy, zwłaszcza gdy widzi się różnice we wszystkich plikach
Marius Matioc
-3

Możesz również łatwo porównać gałęzie dla zmienionych plików, używając na przykład TortoiseGit . Wystarczy kliknąć Przeglądaj referencje i wybrać gałęzie, które chcesz porównać.

Na przykład, jeśli porównasz swoją gałąź z master , otrzymasz w wyniku listę plików, które zostaną zmienione w master, jeśli zdecydujesz się połączyć swoją gałąź z master .

Pamiętaj, że uzyskasz inny wynik, jeśli porównasz master z gałęzią i twoją gałąź z kapitanem .

Piotr
źródło
1
pytanie wydaje się dotyczyć rodzimej użyteczności git
Vladimir Hraban