Wie vergleiche ich Dateien aus zwei verschiedenen Zweigen?

1538

Ich habe ein Skript, das in einem Zweig gut funktioniert und in einem anderen kaputt ist. Ich möchte die beiden Versionen nebeneinander betrachten und sehen, was unterschiedlich ist. Gibt es Möglichkeiten, dies zu tun?

Um klar zu sein, suche ich kein Vergleichstool (ich verwende Beyond Compare). Ich suche nach einem git diff-Befehl, mit dem ich die Master-Version mit meiner aktuellen Zweigversion vergleichen kann, um festzustellen, was sich geändert hat. Ich bin nicht mitten in einer Fusion oder so. Ich möchte nur so etwas sagen

git diff mybranch/myfile.cs master/myfile.cs
Micah
quelle

Antworten:

2208

git diff kann Ihnen den Unterschied zwischen zwei Commits zeigen:

git diff mybranch master -- myfile.cs

Oder äquivalent:

git diff mybranch..master -- myfile.cs

Wenn die letztere Syntax verwendet wird HEAD, kann sie weggelassen werden (z . B. im master..Vergleich masterzu HEAD).

Sie könnten auch interessiert sein an mybranch...master(aus git diffDokumenten ):

In diesem Formular werden die Änderungen in dem Zweig angezeigt, der bis zur Sekunde enthält <commit>, beginnend mit einem gemeinsamen Vorfahren von beiden <commit>. git diff A...Bist äquivalent zu git diff $(git-merge-base A B) B.

Mit anderen Worten, dies führt zu unterschiedlichen Änderungen, masterda es davon abweicht mybranch(jedoch ohne neue Änderungen seitdem mybranch).


In allen Fällen zeigt das --Trennzeichen vor dem Dateinamen das Ende der Befehlszeilenflags an. Dies ist optional, es sei denn, Git wird verwirrt, wenn sich das Argument auf ein Commit oder eine Datei bezieht, aber es ist keine schlechte Angewohnheit, sich darauf einzulassen. Einige Beispiele finden Sie unter https://stackoverflow.com/a/13321491/54249 .


Dieselben Argumente können übergeben werden, git difftoolwenn Sie eines konfiguriert haben.

Dahlbyk
quelle
44
Und wenn keine der beiden Versionen, die Sie vergleichen möchten, der Arbeitsbaum ist, können Sie ihn verwenden git diff branch1 branch2 myfile.cs. (Das --sollte nicht mehr nötig sein, da es nur bis zu zwei Revisionsargumente aufnehmen kann.)
Cascabel
8
Ich habe jede Version davon ausprobiert und nichts passiert. Ich habe mein Difftool konfiguriert (es funktioniert zum Zusammenführen). Ich habe eine Datei namens bd.ps1. Jede Version des Befehls, den ich eingebe, führt nichts aus. Gibt nicht einmal einen Fehler. WTH!?!?!
Micah
3
@Micah: Versuchst du es auch mit Plain Diff? Geben Sie den Pfad relativ zum aktuellen Verzeichnis richtig ein? (Es wird stillschweigend kein Unterschied angezeigt, wenn die Datei nicht vorhanden ist, und Sie verwenden den --. Häufigen und einfachen Fehler.)
Cascabel
5
Dies hat bei mir nicht funktioniert, es sei denn, ich habe den vollständigen Pfad zur Datei angegeben, wie gezeigt git diff --name-status branch1..branch2(wahrscheinlich offensichtlich, aber ich dachte, ich würde es erwähnen, falls jemand anderes die gleichen Probleme hat wie ich).
hBrent
4
Die Reihenfolge von Mybranch und Master ist ebenfalls wichtig. Die Datei im ersten Zweig wird mit den Präfixen '-' angezeigt, die Datei im zweiten Zweig mit den Präfixen '+'.
Timbo
414

Du kannst das: git diff branch1:path/to/file branch2:path/to/file

Wenn Sie Difftool konfiguriert haben, können Sie auch: git difftool branch1:path/to/file branch2:path/to/file

Verwandte Frage: Wie kann ich die Git-Diff-Ausgabe mit dem Visual-Diff-Programm anzeigen?

Tim Henigan
quelle
4
Die Verwendung der Doppelpunkte ist nicht wirklich eine gute Möglichkeit - es bedeutet, dass Sie die Dateien über die Baumobjekte referenzieren, sodass Sie den vollständigen Pfad anstatt relativ zu Ihrem aktuellen Verzeichnis eingeben müssen.
Cascabel
13
@Jefromi, dies hat sich möglicherweise in einer neueren Version geändert, aber zumindest können Sie jetzt relative Pfade verwenden (z branch1:./file. B. ). Dies ist auch nützlich, wenn sich die Datei an einem separaten Speicherort zwischen Zweigen befindet (z git diff branch1:old/path/to/file branch2:new/path/to/file. B. ).
Redbmk
4
@redbmk Ja, das war irgendwann zwischen 2010 und jetzt! Wenn es sich jedoch in beiden Zweigen um dieselbe Datei handelt, müssen Sie dies nicht einfach so tun git diff branch1 branch2 path/to/file.
Cascabel
3
@jefromi cool, ich war mir nicht sicher, wann die Timeline hinzugefügt wurde. Ja, ich würde normalerweise die von Ihnen erwähnte Syntax verwenden, aber Tims Antwort half mir herauszufinden, wie man Dateien mit verschiedenen Pfaden vergleicht, obwohl es nicht wirklich das ist, was die Frage stellte
redbmk
1
Obwohl ich diese Idee liebe, kann ich diese Syntax nicht zum Laufen bringen oder in den git diff-Dokumenten erwähnen. Was vermisse ich? Vielen Dank!
Yooy
160

Modernere Syntax:

git diff ..master path/to/file

Das Doppelpunktpräfix bedeutet "vom aktuellen Arbeitsverzeichnis nach". Du kannst auch sagen:

  • master..dh die Umkehrung von oben. Dies ist das gleiche wie master.
  • mybranch..masterund verweist explizit auf einen anderen Status als den aktuellen Arbeitsbaum.
  • v2.0.1..master, dh auf ein Tag verweisen.
  • [refspec]..[refspec], im Grunde alles, was als Code-Status für Git identifiziert werden kann.
Joe Atzberger
quelle
33

Es gibt viele Möglichkeiten, Dateien aus zwei verschiedenen Zweigen zu vergleichen:

  • Option 1: Wenn Sie die Datei von einem bestimmten Zweig mit einem anderen bestimmten Zweig vergleichen möchten:

    git diff branch1name branch2name path/to/file
    

    Beispiel:

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

    In diesem Beispiel vergleichen Sie die Datei im Zweig "mybranch" mit der Datei im Zweig "mysecondbranch".

  • Option 2: Einfacher Weg:

     git diff branch1:file branch2:file
    

    Beispiel:

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

    Dieses Beispiel ähnelt der Option 1.

  • Option 3: Wenn Sie Ihr aktuelles Arbeitsverzeichnis mit einem Zweig vergleichen möchten:

    git diff ..someBranch path/to/file
    

    Beispiel:

    git diff ..master myfile.cs
    

    In diesem Beispiel vergleichen Sie die Datei aus Ihrem tatsächlichen Zweig mit der Datei im Hauptzweig.

Javier C.
quelle
12

Ich mache es einfach git diff branch1 branch2 path/to/file

Dies prüft auf Unterschiede zwischen den Dateien. Änderungen in branch1wären rot. Änderungen in branch2wären grün.

Es wird angenommen, dass dies branch1die Vergangenheit und branch2die Zukunft ist. Sie können dies umkehren, indem Sie die Reihenfolge der Zweige im Diff umkehren:git diff branch2 branch1

iGbanam
quelle
Welche Version von git diff kann das? Es scheint in der von mir ausgeführten Version (2..9.2.windows.1) nicht unterstützt zu werden.
Vince Bowdren
9

Wenn Sie einen Unterschied zum aktuellen Zweig machen möchten, können Sie ihn weglassen und verwenden:

git diff $BRANCH -- path/to/file

Auf diese Weise unterscheidet es sich vom aktuellen Zweig zum referenzierten Zweig ( $BRANCH).

Paulo Fidalgo
quelle
5

Ich stimme der von @dahlbyk vorgeschlagenen Antwort zu. Wenn Sie möchten, dass das Diff für Codeüberprüfungen in eine Diff-Datei geschrieben wird, verwenden Sie den folgenden Befehl.

git diff branch master -- filepath/filename.extension > filename.diff --cached
Azad
quelle
2

In meinem Fall verwende ich den folgenden Befehl:

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

Mit diesem Befehl können Sie dieselbe Datei in zwei verschiedenen Zweigen vergleichen

SKT
quelle
1

Der beste Weg, dies zu tun, ist git diffdie folgende Verwendung: git diff <source_branch> <target_branch> -- file_path

Es wird der Unterschied zwischen Dateien in diesen Zweigen überprüft. In diesem Artikel finden Sie weitere Informationen zu Git-Befehlen und deren Funktionsweise.

Nesha Zoric
quelle
1

Verwenden Sie Commit-Hashes wie folgt:

git diff <hash1> <hash2> <filename>

wo hash1 sein kann begeht jeder von jedem Zweig, der gleich für hash2 .

prometeu
quelle
1

Es gibt zwei Szenarien zum Vergleichen von Dateien:

Szenario 1: Vergleichen Sie Dateien in Remote-Zweigen (beide Zweige sollten im Remote-Repository vorhanden sein).

Szenario 2: Vergleichen Sie lokale Dateien (bei Kopie des lokalen Arbeitsbereichs) mit den Dateien im Remote-Repository.

Die Logik ist einfach. Wenn Sie zwei zu unterscheidende Zweignamen angeben, werden immer die Remote-Zweige verglichen. Wenn Sie nur einen Zweignamen angeben, wird Ihre lokale Arbeitskopie immer mit dem Remote-Repo (dem von Ihnen angegebenen) verglichen. Sie können range verwenden, um Remote-Repositorys bereitzustellen.

zB Kasse einer Filiale

git checkout branch1
git diff branch2 [filename]

Wenn Sie in diesem Fall einen Dateinamen angeben , wird Ihre lokale Kopie des Dateinamens mit dem Remote-Zweig " branch2 " verglichen .

git diff branch1 branch2 [filename]

In diesem Fall wird der Dateiname von Remote-Zweigen mit dem Namen " branch1 " mit " branch2 " verglichen.

git diff ..branch2 [filename]

In diesem Fall wird auch der Dateiname von Remote-Zweigen mit dem Namen " branch1 " mit " branch2 " verglichen . Also, es ist das gleiche wie oben. Wenn Sie jedoch gerade einen Zweig aus einem anderen Zweig erstellt haben, z. B. "master", und Ihr aktueller Zweig nicht im Remote-Repository vorhanden ist, wird Remote " master " mit remote " branch2 " verglichen .

Hoffe es ist nützlich.

Dharmender Rawat
quelle
0

Um zwei Dateien in der Git-Bash zu vergleichen, müssen Sie den folgenden Befehl verwenden:

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

Dieser Befehl zeigt den Unterschied zwischen den beiden Dateien in der Bash selbst.

Rishav_SO
quelle