Anzeigen, welche Dateien sich zwischen zwei Revisionen geändert haben

2105

Ich möchte zwei Zweige zusammenführen, die für eine Weile getrennt wurden, und wollte wissen, welche Dateien geändert wurden.

Kam über diesen Link: http://linux.yyz.us/git-howto.html, was sehr nützlich war.

Die Tools zum Vergleichen von Zweigen, auf die ich gestoßen bin, sind:

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

Ich habe mich gefragt, ob es so etwas wie "git status master..branch" gibt, um nur die Dateien zu sehen, die sich zwischen den beiden Zweigen unterscheiden.

Ohne ein neues Tool zu erstellen, ist dies meiner Meinung nach das Beste, was Sie jetzt tun können (was natürlich Wiederholungen anzeigt, wenn eine Datei mehr als einmal geändert wurde):

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

Ich habe mich gefragt, ob ich etwas verpasst habe ...

johannix
quelle
12
Wie viele andere finden den Titel dieser Frage irreführend? Es geht eigentlich darum, die Dateiunterschiede zwischen zwei Zweigen zu finden. Was ich hier gesucht habe, war, wie man Dateiunterschiede zwischen zwei Revisionen in demselben Zweig erkennt. Oder bin ich der einzige?
Sandeepan Nath
4
@ SandeepanNath: Bei Git gibt es keinen Unterschied. Sie beziehen sich IMMER auf einzelne Commits.
Samuel O'Malley
@ SamuelO'Malley Ich bin neu in Git und denke über die scheinbar gemeinsame Verzweigungsstrategie nach, bei der alle Zweige schließlich mit dem Hauptzweig zusammengeführt werden und der Master schließlich ausgerollt wird. In Anbetracht des Ereignisses eines Rollouts, bei dem die Produktion bereits am Master ist, aber hinter dem Tipp (um eine Revision, wenn der letzte Rollout nach der letzten Master-Zusammenführung stattgefunden hat), würde ich gerne die Unterschiede zwischen diesen beiden Revisionen sehen, um Finden Sie heraus, was ausgerollt werden würde. Ich möchte nicht auf den Zweig schauen, der zuletzt zusammengeführt wurde. Korrigieren Sie mich, wenn ich falsch liege.
Sandeepan Nath
2
@SandeepanNath: Anstatt die Filialnamen zu verwenden, können Sie die folgenden Antworten verwenden und stattdessen nur die Commit-IDs angeben. Oder verweisen Sie die Commits sogar anhand ihrer Tag-Namen, wenn Sie beim Rollout Tags erstellen.
Samuel O'Malley
1
@SandeepanNath Sie können nicht 2 Zweige vergleichen, Sie müssen die Revision angeben. Wenn Sie also 2 Zweige vergleichen, werden 2 Revisionen verglichen.
Bastien Vandamme

Antworten:

2575

So vergleichen Sie den aktuellen Zweig mit dem masterZweig:

$ git diff --name-status master

So vergleichen Sie zwei beliebige Zweige:

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

Lesen Sie weiter git diffin der offiziellen Dokumentation .

JasonSmith
quelle
2
Was bedeuten die einzelnen Indizes auf der linken Seite (ich sehe viele Ms und Ds)?
Gogogadgetinternet
15
@ user446936 - Sie können sehen, was die Buchstaben auf der Manpage zum Git-Status bedeuten. @ kernel.org/pub/software/scm/git/docs/git-status.html - insbesondere M == geändert, D == gelöscht
James Manning
12
git diff --name-status your_branch...mastergibt die Änderungen aus, die auf dem Master aufgetreten sind, seit your_branch daraus erstellt wurde
Radu
1
Der Doppelpunktoperator ist hier überflüssig, da Unterschiede paarweise sind.
Jub0bs
2
Ich erhalte eine unbekannte Revision oder einen unbekannten Pfad, der nicht im Arbeitsbaum enthalten ist.
SuperUberDuper
408

Versuchen

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

Auf diese Weise erhalten Sie weitere Informationen zu jeder Änderung, während Sie immer noch die gleiche Anzahl von Zeilen verwenden.

Sie können auch die Zweige umdrehen, um ein noch klareres Bild des Unterschieds zu erhalten, wenn Sie in die andere Richtung zusammenführen:

$ git diff --stat --color branchName..master
Gerry
quelle
77
Wenn Sie (sehr empfohlen, imho) Git-Farbe aktiviert haben ( config --global color.ui true), können Sie die --color überspringen. (Ich habe lks - Lazy Keyboard-Syndrom.)
Art Swri
25
Ich bin mit dir auf Farbe! Übrigens wollte ich sagen git config --global color.ui true- vollständig sein.
Art Swri
2
Funktioniert nicht, wirft Fehler:fatal: ambiguous argument 'master..branchName': unknown revision or path not in the working tree.
Tomáš Zato - Monica am
7
@ TomášZato Entschuldigung, aber Sie müssen "branchName" mit dem Namen Ihrer Niederlassung tauschen.
Gerry
161

Denken Sie auch daran, dass Git eine billige und einfache Verzweigung hat. Wenn ich denke, dass eine Zusammenführung problematisch sein könnte, erstelle ich einen Zweig für die Zusammenführung. Wenn masteralso die Änderungen vorliegen, in die ich zusammenführen möchte, und bamein Zweig den Code vom Master benötigt, kann ich Folgendes tun:

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

Das Endergebnis ist, dass ich die Zusammenführung auf einem Wegwerfzweig ausprobieren muss, bevor ich mit meinem Zweig schraube. Wenn ich mich verheddere, kann ich einfach den ba-mergeZweig löschen und von vorne beginnen.

Eric Anderson
quelle
4
Genial. Ich habe nie daran gedacht, mich so zu verzweigen. Ich denke, dies sollte als Teil der "Best Practices" beim Zusammenführen betrachtet werden.
Egelev
Wenn Sie den Ba-Marge wieder in Ba zusammenführen, besteht dann nicht die Möglichkeit, die Konflikte erneut zu beheben?
Josef.B
2
@ EricAnderson Richtig, es ist eine Grafik. SVN klebt wie Kaugummi unter einer Schulbank. Danke.
Josef.B
1
Warum müssen Sie den letzten Schritt 'git merge master'
ausführen
Sie könnten es weglassen. Der einzige Grund, warum dies nützlich wäre, ist, wenn neue Inhalte eingehen, masterwährend Sie an der Überprüfung des Codes und der Behebung von Konflikten arbeiten.
Eric Anderson
58

Wenn jemand versucht, eine Diff-Datei aus zwei Zweigen zu generieren:

git diff master..otherbranch > myDiffFile.diff
Paulino III
quelle
2
Dies hat sich besonders bei großen Zweigen als nützlich erwiesen, die viele Unterschiede aufweisen.
Vandsh
Dies ist nützlich, wenn der Unterschied wirklich groß ist. Standardmäßig werden nicht alle Unterschiede in der Konsole angezeigt (ich habe mich gefragt, warum). In diesem Fall ist es die richtige Vorgehensweise, die Unterschiede an eine Datei zu übergeben.
Rotimi-Best
42

Es gibt auch eine GUI-basierte Methode.

Sie können gitk verwenden .

  1. Lauf:

    $ gitk --all
    
  2. Klicken Sie mit der rechten Maustaste auf ein Commit eines Zweigs und wählen Sie im Popup-Menü die Option Dieses Commit markieren.

  3. Klicken Sie mit der rechten Maustaste auf ein Commit eines anderen Zweigs und wählen Sie Diff this -> markiertes Commit oder Diff markiertes Commit -> this .

Dann gibt es eine Liste der geänderten Dateien im rechten unteren Bereich und Diff-Details im linken unteren Bereich.

Yantao Xie
quelle
3
@Orwellophile Ich lade ein Video hoch, um zu zeigen, wie es geht. Ich hoffe es wird dir helfen.
Yantao Xie
Wow, nur für mich fühle ich mich besonders. Ich habe es in köstliche.com als zukünftige Referenz und extra Google-Foo vorgemerkt.
Orwellophile
Stark unterschätzte Antwort. Vielen Dank!
Koshinae
36

Eine weitere Option, bei der in diesem Fall meld verwendet wird:

git difftool -d master otherbranch

Dies ermöglicht nicht nur das Erkennen der Unterschiede zwischen Dateien, sondern bietet auch eine einfache Möglichkeit, auf eine bestimmte Datei zu zeigen und darauf zu klicken.

rsilva4
quelle
6
Vielleicht möchten Sie meld als Standard-Difftool festlegen: git config --global diff.tool meld
bwv549
1
Dies ist mein Favorit, da es jedes von Ihnen konfigurierte Difftool verwendet.
Josiah
Wird unter OSX nicht unterstützt. :-(
Mike S.
@ MikeS. Bitte überprüfen Sie diese Antwort stackoverflow.com/a/12815806/151918 enthält Anweisungen für OSX. Es funktioniert zumindest für mich, hoffe es hilft.
Rsilva4
Nett. Aber wofür ist die -dOption?
Scotty.NET
29

Beachten Sie, dass Git es einfach macht, die Zusammenführung auszuprobieren und Probleme zu vermeiden, wenn Ihnen das Ergebnis nicht gefällt. Es könnte einfacher sein, als im Voraus nach potenziellen Problemen zu suchen.

David Plumpton
quelle
10
David, das ist ein guter Punkt, obwohl es schön wäre zu wissen, was vorher los ist ...
Johannes
18

Und wenn Sie nur nach Änderungen für bestimmte Dateien suchen, dann:

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

Zweig1 ist optional und Ihr aktueller Zweig (der Zweig, in dem Sie sich befinden) wird standardmäßig berücksichtigt, wenn Zweig1 nicht angegeben ist. z.B:

git diff master -- controller/index.js
Mannu
quelle
15

Wenn Sie zusammenarbeiten oder an mehreren Funktionen gleichzeitig arbeiten, enthält der Upstream oder sogar Ihr Master häufig Arbeiten, die nicht in Ihrem Zweig enthalten sind und in grundlegenden Unterschieden fälschlicherweise angezeigt werden.

Wenn Ihr Upstream möglicherweise umgezogen ist, sollten Sie Folgendes tun:

git fetch
git diff origin/master...

Allein die Verwendung von git diff master kann relevante Änderungen einschließen oder nicht einschließen.

Alex Brown
quelle
8

Es gibt zwei Zweige, sagen wir mal

  • A (Zweig, an dem Sie arbeiten)
  • B (Ein weiterer Zweig, mit dem Sie vergleichen möchten)

In Zweig A können Sie tippen

git diff --color B

dann erhalten Sie eine Ausgabe von

Geben Sie hier die Bildbeschreibung ein

Der wichtige Punkt dabei ist

  1. Text in Grün ist in Zweig A vorhanden

  2. Text in Rot ist in Zweig B vorhanden

selftaught91
quelle
8

Hier gibt es viele Antworten, aber ich wollte etwas hinzufügen, das ich üblicherweise benutze. Wenn Sie sich in einem der Zweige befinden, die Sie vergleichen möchten, mache ich normalerweise einen der folgenden Schritte. Um dieser Antwort willen werden wir sagen, dass wir uns in unserem sekundären Zweig befinden. Je nachdem, welche Ansicht Sie gerade benötigen, hängt es davon ab, welche Sie auswählen. Meistens verwende ich jedoch die zweite der beiden Optionen. Die erste Option kann nützlich sein, wenn Sie versuchen, zu einer Originalkopie zurückzukehren - in beiden Fällen erledigen beide die Aufgabe!

Dadurch wird der Master mit dem Zweig verglichen, in dem wir uns befinden (der sekundär ist), und der ursprüngliche Code sind die hinzugefügten Zeilen, und der neue Code wird als entfernte Zeilen betrachtet

git diff ..master

ODER

Dadurch wird auch der Master mit dem Zweig verglichen, in dem wir uns befinden (der sekundär ist), und der ursprüngliche Code sind die alten Zeilen und der neue Code sind die neuen Zeilen

git diff master..
TheCodenator
quelle
1

Wenn Sie Github / Github Enterprise verwenden, können Sie die Web-Benutzeroberfläche verwenden, indem Sie auf die URL /compareIhres Repository-Pfads klicken , z. B. https://github.com/http4s/http4s/compare . Sie können den Zweig / Commit / Tag auswählen, den Sie vergleichen möchten: Github Screenshot vergleichen

Und der Unterschied wird auf die URL in der Github - Schnittstelle präsentiert werden , /compare/{x1}...{x2}wo sind x2und x1sind der Zweig / commit / Tag , das Sie vergleichen möchten, zum Beispiel: https://github.com/http4s/http4s/compare/release-0.18.x ...Meister

Sie können mehr im Github Doc sehen .

Valy Dia
quelle
0

Für Leute, die nach einer GUI-Lösung suchen, hat Git Cola einen sehr schönen "Branch Diff Viewer" ( Diff -> Branches .. ).

kerner1000
quelle
-1
git diff revision_n revision_m

Wenn revision_nund revision_maufeinanderfolgende Commits sind, wird dieselbe Ausgabe wie ausgeführt git show revision_m

Jovo Skorupan
quelle
-2

Wenn Sie die grafische Benutzeroberfläche mögen und Windows verwenden, ist dies ein einfacher Weg.

  1. Laden Sie WinMerge herunter
  2. Überprüfen Sie die beiden Zweige in verschiedenen Ordnern
  3. Vergleichen Sie Ordner für Ordner mit WinMerge. Sie können auch problemlos Änderungen vornehmen, wenn einer der Zweige derjenige ist, an dem Sie arbeiten.
Marius Matioc
quelle
Es ist nicht der einfachste Weg, es besteht tatsächlich keine Notwendigkeit, Repos herunterzuladen, um zwischen Zweigen zu unterscheiden.
Stefgosselin
Es ist in der Tat nicht der einfachste Weg, aber es ist der GUI-Weg, der oft viel einfacher ist, insbesondere um die Unterschiede in allen Dateien zu sehen
Marius Matioc
-3

Sie können auch Zweige für geänderte Dateien leicht vergleichen, indem Sie beispielsweise TortoiseGit verwenden . Klicken Sie einfach auf Referenzen durchsuchen und wählen Sie die Zweige aus, die Sie vergleichen möchten.

Wenn Sie beispielsweise Ihren Zweig mit dem Master vergleichen, erhalten Sie als Ergebnis eine Liste der Dateien, die im Master geändert werden, wenn Sie Ihren Zweig mit dem Master zusammenführen .

Denken Sie daran, dass Sie ein anderes Ergebnis erzielen, wenn Sie den Master mit Ihrem Zweig und Ihren Zweig mit dem Master vergleichen .

Piotr
quelle
1
Die Frage scheint über native Git Utility zu sein
Vladimir Hraban