Wie vergleiche ich einen lokalen Git-Zweig mit seinem Remote-Zweig?

1050

Wie kann ich das diffzwischen einem lokalen Zweig und einem entfernten Zweig sehen?

mrblah
quelle
5
Diese Frage wurde später erneut gestellt. Es hat eine schöne Antwort: stackoverflow.com/questions/11935633/…
rustybeanstalk
3
Beispiel: Git Diff Master Origin / Master (wobei Master der lokale Master-Zweig und Origin / Master der Remote-Master-Zweig ist).
Mist
@klyngbaek, diese Antwort insbesondere ;-)
Ich habe ursprünglich versucht, git diff HEAD origin/HEADwas auf einen anderen entfernten Zweig als den von mir beabsichtigten zu verweisen scheint. Die Verwendung des vollständigen Zweignamens funktioniert wie erwartet.
Deanna

Antworten:

592

Um Remote-Tracking-Zweige zu aktualisieren, müssen Sie zuerst Folgendes eingeben git fetchund dann:

git diff <masterbranch_path> <remotebranch_path>

Sie können git branch -aalle Zweige (lokal und remote) auflisten und dann den Namen des Zweigs aus der Liste auswählen (einfach entfernen)remotes/ aus dem Namen des entfernten Zweigs .

Beispiel: git diff master origin/master(wobei "master" ein lokaler Hauptzweig und "origin / master" ein entfernter Zweig ist, nämlich Ursprung und Hauptzweig.)

meder omuraliev
quelle
23
Er kann einen Abruf vor ( git fetch)
Houssem Badri
Das zeigt nur einen Einblick in die Änderungen in Bash. Gibt es eine Möglichkeit, alle Änderungen in einer IDE wie VS-Code zu öffnen?
Harter Phoujdar
@Harsh Phoujdar Fügen Sie den folgenden Code in Ihre .git / .gitconfig-Datei ein. Stellen [diff] tool = vscode [difftool] prompt = false [difftool "vscode"] cmd = \"C:\\Program Files (x86)\\Microsoft VS Code\\Code.exe\" \"$LOCAL\" \"$REMOTE\" --diff --wait trustExitCode = falseSie sicher, dass Ihr Pfad zur Datei code.exe korrekt ist.
Aman
1307
git diff <local branch> <remote>/<remote branch>

Zum Beispiel git diff master origin/masterodergit diff featureA origin/next

Um diesen Remote-Tracking-Zweig zu haben , müssen Sie natürlich zuerst; und Sie benötigen aktuelle Informationen zu Zweigen im Remote-Repository.git fetch

Jakub Narębski
quelle
98
um genauer zu sein: git diff <
lokalzweig
38
Normalerweise mache ich, um git diff <remote>/<remote branch> <local branch>zu sehen, was mein Push für das Remote-Repo bewirkt.
Michał Tatarynowicz
76
Die noch kürzere git diff originist ausreichend, wenn Sie nur mit Ihrer vorgelagerten Niederlassung vergleichen.
Ludder
12
Bitte fügen Sie git fetcham Anfang hinzu, es verursacht Ärger für Neulinge wie mich
Saif
1
Hey, sollte es nicht sein git diff <remote>/<remote branch> <local branch>? Andernfalls werden die Hinzufügungen und Löschungen auf meinem Computer aktiviert (Git-Version 2.7.0.windows.2)
Martín Coll
183

Erster Typ

git branch -a

um die Liste der verfügbaren Filialen zu erhalten. Auf der Ausgabe sehen Sie möglicherweise so etwas

* master
  remotes/main/master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
  remotes/origin/mt
  remotes/upstream/master
  remotes/upstream/mt

Dann zeigen Sie den Diff

git diff --stat --color remotes/main/master..origin/master
git diff remotes/main/master..origin/master
YSN
quelle
1
sollte es nicht ...eher sein als ..?
Eliran Malka
9
Ich hätte dies definitiv als Antwort gewählt. Nach Ihren Anweisungen konnte ich die Unterschiede zwischen einem lokalen Zweig und einem entfernten Zweig anzeigen. Vielen Dank!
Tass
1
Normalerweise mache git log origin/my_branch..ich das HEADals lokalen Schiedsrichter, was meistens das ist, was du meinst.
Rudie
4
+1 für die beste Antwort meiner bescheidenen Meinung nach. Wäre +2 wert, wenn Sie "fetch" erwähnen würden, um das "remote" -Image der geklonten Quelle zu synchronisieren. Der Schritt Statistik- / Farbübersicht ist besonders hilfreich.
bvj
3
Vielen Dank für die eine Antwort, die sich schließlich aus den sieben oder acht "Antworten" ergab, die kaum mehr als fatal: bad revisionoder ergaben fatal: ambiguous argument. Ich wollte nur den Unterschied in derselben Datei aus einem anderen Zweig sehen. War das zu viel verlangt? Ja, ja, das war es. :-) git diff remotes/origin/<base branch> <current branch> -- <filename>funktioniert super auf Git 1.8.3.1
Steve Bonds
143

Wenn Sie sich in einem bestimmten Zweig befinden und diesen mit einem von Ihnen verfolgten Upstream-Zweig vergleichen möchten, verwenden Sie

git diff @{upstream}

wenn dein Upstream nicht eingestellt ist ( normalerweise der Fall, danke Arijoon in den Kommentaren)

git diff @{push}

Mit freundlicher Genehmigung dieser Antwort enthält die Git-Dokumentation zur Angabe von Revisionen :

<branchname>@{upstream}, Zum Beispiel master@{upstream}, @{u}
Das Suffix @{upstream}an eine branch (Kurzform <branchname>@{u}) an den Zweig bezieht sich , daß die Verzweigung spezifiziert durch branchnamezu bauen auf der Oberseite (konfiguriert mit gesetzt ist branch.<name>.remoteund branch.<name>.merge). Ein fehlender branchnameStandardwert ist der aktuelle.

Andrew Grimm
quelle
10
Sehr gute Antwort, nur ein kleines Teil fehlt. Ändern Sie die Zeile in git diff @ @{upstream}. Das Extra @ist HEAD, wo Sie jetzt sind, also vergleichen Sie HEADmit dem Upstream, den Ihre Niederlassung verfolgt. Sie können @{push}anstelle von Upstream verwenden, um Unterschiede zwischen den Zweigen zu erhalten, auf die Sie pushen
möchten
3
Beste Antwort: Sie müssen die Fernbedienung nicht abrufen. braucht mehr Upvotes!
jcomeau_ictx
3
In Fischschale habe ich Ergebnis bekommen : fatal: ambiguous argument '@upstream': unknown revision or path not in the working tree. Musste git diff @\{upstream\}stattdessen verwenden. 😥
Landon Kuhn
Sie müssen git fetchzuerst, sonst tut dies nichts, zeigt keine Ausgabe; getestet durch Löschen einer Datei im Repo-Ursprung und Ausführen dieses Befehls lokal. ..wirkt erst nach dem holen.
Da die angegebene Antwort auch lokale Änderungen enthält. manchmal ist dies erwünscht, manchmal nicht.
Deanna
44

Ich verstehe die Ausgabe von viel besser:

git diff <remote-tracking branch> <local branch>

Das zeigt mir, was gelöscht wird und was hinzugefügt wird, wenn ich den lokalen Zweig drücke. Natürlich ist es das Gleiche, nur das Gegenteil, aber für mich ist es besser lesbar und ich bin komfortabler, wenn ich sehe, was passieren wird.

manfer
quelle
Ich erhalte genau das gleiche Ergebnis mit: git diff <lokaler Zweig> <Remote-Tracking-Zweig> oder git diff <Remote-Tracking-Zweig> <lokaler Zweig>
user2928048
32

Der einfache Weg:

git fetch
git log -p HEAD..FETCH_HEAD

Dadurch werden zuerst die Änderungen von Ihrer Standardfernbedienung (Ursprung) abgerufen. Dies wird automatisch erstellt, wenn Sie ein Repo klonen. Sie können auch explizit sein : git fetch origin master.

Dann wird das Git-Protokoll verwendet, um Ihren aktuellen Zweig mit dem gerade abgerufenen zu vergleichen. (Die -pOption (Patch generieren) zeigt die Unterschiede .)

Brent Faust
quelle
14

So mache ich es.

#To update your local.
git fetch --all

Dadurch wird alles von der Fernbedienung abgerufen. Wenn Sie also den Unterschied überprüfen, wird der Unterschied mit dem Remote-Zweig verglichen.

#to list all branches
git branch -a

Mit dem obigen Befehl werden alle Zweige angezeigt.

#to go to the branch you want to check difference
git checkout <branch_name>
#to check on which branch you are in, use
git branch
    (or)
git status

Jetzt können Sie den Unterschied wie folgt überprüfen.

git diff origin/<branch_name>

Dadurch wird Ihre lokale Niederlassung mit der Remote-Niederlassung verglichen

Sahith Vibudhi
quelle
2
git fetch --all ruft alles von ALLEN Fernbedienungen ab. Git Fetch sollte ausreichen, wenn Sie die Standard-Ursprungsfernbedienung verwenden.
Christophe Keller
Erstaunlich, dass wir nach 8 Jahren eine vollständige Antwort erhalten, die die Schritte richtig erklärt. Wir können eine --help machen, um die Befehle zu bekommen. Bei SO geht es darum, sie zu verstehen.
GDBJ
11

Lassen Sie Ihren Arbeitszweig Entwicklung sein und möchten Sie zwischen lokalem Entwicklungszweig und Remoteentwicklungszweig unterscheiden. In diesem Fall sollte die Syntax wie git diff remotes/origin/development..development
oder sein

git fetch origin git diff origin/development

Ratna Halder
quelle
11

tl; dr :git diff <local branch> <remote branch>

Wenn ich Git auf der Schale benutze, orientiere ich mich gerne zuerst, indem ich mich umsehe. Hier ist ein Befehl, um alle Zweige anzuzeigen

$ git branch -a  # (or git branch --all) 
* my-branch
  master
  remotes/origin/some-branch
  remotes/origin/HEAD -> origin/master
  remotes/origin/my-branch
  remotes/origin/some-other-branch
  remotes/origin/master

Hier habe ich zwei Ortsvereine haben ( my-branchund master) und 4 - Fernbedienung ( some-branch, some-other-branch, masterund my-branch).

Das Sternchen neben my-branchsignalisiert außerdem, dass ich mich derzeit in diesem Zweig befinde (das würden Sie auch wissen, wenn Sie den Befehl verwenden git status, der ausgegeben wird :) On branch my-branch..

Hinweis: Die entfernten Zweige in der Git-Bash-Shell werden rot angezeigt, während die lokalen Zweige grün angezeigt werden.

Wenn Sie nur entfernte Zweige anzeigen möchten :

$ git branch -r # (or git branch --remotes)
  origin/some-branch
  origin/HEAD -> origin/master
  origin/my-branch
  origin/some-other-branch
  origin/master

Um nur lokale Zweige anzuzeigen, könnten Sie versucht sein, dies zu verwenden, git branch -laber das ist ein völlig anderer Befehl. Um lokale Zweige anzuzeigen, verwenden Sie git branchohne Optionen

$ git branch
* my-branch 
  master

Um eine Überprüfung der grundlegenden Verzweigungsoptionen abzuschließen, gibt es das --list, was entgegen Ihrer Erwartung eine Filterung ermöglicht . Verwenden Sie es mit einem Muster wie diesem:

$ git branch --list 'my*'
* my-branch

Sie können auch --listmit den Optionen kombinieren -aund -rIhr Muster entsprechend anpassen ( denken Sie daran: Remote-Zweige beginnen mit "Fernbedienungen" ). Beispiel:

# this will show all branches (local & remote) that start with my
$ git branch --list 'my*' -a
* my-branch

# better: the pattern includes the remote
$ git branch --list '*my*' -a
* my-branch
  remotes/origin/my-branch

Dokumente: https://git-scm.com/docs/git-branch

Jetzt können Sie zwei beliebige Zweige von allen verfügbaren vergleichen (Sie können auch zwei Einheimische oder zwei Fernbedienungen vergleichen).

Hier vergleiche ich die lokale mit der Fernbedienung my-branch, sie sind synchronisiert, damit ich keine Ausgabe bekomme:

$ git diff my-branch remotes/origin/my-branch

Hinweis: Sie müssen die vollständigen Namen der Zweige ohne Anführungszeichen angeben.

Ich kann auch die lokale my-branchmit der Fernbedienung vergleichen master. Hier bekomme ich etwas Ausgabe, weil die Fernbedienung my-branchnicht in den Hauptzweig zusammengeführt wurde.

$ git diff my-branch remotes/origin/master
diff --git a/src/controllers/call.controller.js b/src/controllers/call.controller.js
index fd79b98..df3d798 100644
--- a/src/controllers/call.controller.js
+++ b/src/controllers/call.controller.js
@@ -261,7 +261,7 @@ function callController() {
   /*
    *  Function: doCall
[ . . . ]
user2314737
quelle
11

Wenn Sie den Unterschied sehen möchten, wenn nur die Namen der Dateien geändert werden, verwenden Sie :

git diff --name-status <remote-branch> <local-branch>,

andernfalls werden alle Unterschiede zwischen den beiden Zweigen angezeigt:

git diff <remote-branch> <local-branch>

Sarvesh Kesharwani
quelle
9

Hier ist eine kurze Antwort, wenn Sie Ihren aktuellen Zweig mit etwas vergleichen, das Sie möchten git pull.

git fetch
git diff FETCH_HEAD

Der erste Befehl ermittelt, welcher Remote-Zweig Ihrem aktuellen Zweig entspricht. Ein Artefakt dieser Berechnung in der FETCH_HEADReferenz. Dann verwendet der zweite Befehl diesen Referenzvergleich mit dem, was Ihr aktueller Zweig hat.

William Entriken
quelle
6

Ich weiß, dass es bereits mehrere Antworten auf diese Frage gibt, aber ich habe einen seltsamen Fehler erhalten, als ich die meisten ausprobiert habe.

In meinem Fall habe ich eine zweite Fernbedienung heroku, die nicht die ist, originund weil sie nicht synchronisiert war, wurde beim Versuch, Folgendes auszuführen git diff master heroku/master:

fatal: ambiguous argument 'heroku/master': unknown revision or path not in the working tree.

oder dies, wenn Sie den anderen Ansatz ausprobieren git diff master..heroku/master:

fatal: bad revision 'master..heroku/master'

In meinem Fall wurde in der Lösung der Remote-Name git fetchvor dem Ausführen ausdrücklich erwähnt git diff:

$ git fetch heroku
$ git diff master heroku/master

Ich hoffe, das hilft anderen bei diesem Problem.

Fagiani
quelle
4
git difftool <commit> .

Dadurch wird das gewünschte Commit mit Ihren lokalen Dateien verglichen. Vergessen Sie nicht den Punkt am Ende (für lokale).

So vergleichen Sie beispielsweise Ihre lokalen Dateien mit einem Commit:

git difftool 1db1ef2490733c1877ad0fb5e8536d2935566341.

(und Sie brauchen keinen Git-Abruf, es sei denn, ein Vergleich mit neuen Commits ist erforderlich)

Izik
quelle
Ich denke, das ist interessant, weil ich einen Vergleich anstellen kann, bevor ich mich verpflichte und pushe. Leider ist in Windows vimdiff zum Anzeigen hässlich; Gibt es eine Möglichkeit, etwas Besseres wie Notepad ++ zu verwenden?
Stefano Scarpanti
3

Beispiel

git diff 'master' 'testlocalBranch'

Wenn Sie einen Editor wie Webstorm verwenden, können Sie mit der rechten Maustaste auf Datei auswählen, mit Zweig vergleichen und Ihren Zweig eingeben / auswählen.

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Kurkula
quelle
2
Was bringt dies gegenüber der 7,5 Jahre alten akzeptierten Antwort mit mehr als 170 Upvotes?
Mark Rotteveel
Dies ist für mrblah der Benutzer oder für ähnliche Benutzer, die einen Kommentar für die akzeptierte Antwort hinzugefügt haben. Die Syntax unterscheidet sich von einem Beispiel und das Beispiel hilft aus Anfängersicht besser.
Kurkula
2
In diesem Fall sollte diese Antwort kommentiert werden.
Rachit
1

Führen Sie in VS 2019 nur FETCH aus. Ziehen Sie keinen Code.

Das habe ich getan. Unten in der .gitconfig-Datei hinzugefügt, damit ich Beyond Compare verwenden kann

File location: C:\Users\[username]\.gitconfig

Unten hinzugefügt

[diff]
    tool = bc
[difftool "bc"]
    path = c:/Program Files/Beyond Compare 4/bcomp.exe

Öffnen Sie die Eingabeaufforderung und wechseln Sie in das Arbeitsverzeichnis. Ich habe unten angegeben, um den lokalen DEV-Zweig mit dem entfernten DEV-Zweig zu vergleichen

git difftool dev origin/dev --dir-diff

Dadurch werden Beyond Compare geöffnet und Verzeichnisse mit unterschiedlichen Dateien geöffnet. Wenn keine Änderungen vorgenommen werden, wird Beyond Compare nicht gestartet.

Ziggler
quelle
0

Ich wundere mich über gibt es eine Veränderung in meinem Master - Zweig ...

  1. Zunächst müssen Sie Ihren Zweig ändern (Wenn Sie sich bereits unter diesem Zweig befinden, müssen Sie dies nicht tun!)

Git Checkout Master

  1. Mit diesem Befehl können Sie sehen, welche Datei unter Ihrem Hauptzweig geändert wurde

Git-Status

  1. Listen Sie die Zweige auf

Git-Zweig -a

  • Master-
    Fernbedienungen / Herkunft / Master
  1. Finde die Unterschiede

Git Diff Herkunft / Master

Ali Atakan
quelle
0

Installieren

git config alias.udiff 'diff @{u}'

Unterschiedlicher KOPF mit KOPF @ {upstream}

git fetch  # Do this if you want to compare with the network state of upstream; if the current local state is enough, you can skip this
git udiff

Unterschiedlich mit einem beliebigen Remote-Zweig

Dies beantwortet die Frage in Ihrer Überschrift ("seine Fernbedienung"); Wenn Sie sich von "einer Fernbedienung" unterscheiden möchten (die nicht als Upstream für den Zweig konfiguriert ist), müssen Sie sie direkt als Ziel festlegen. Sie können alle Remote-Zweige wie folgt anzeigen:

git branch -r

Sie können alle konfigurierten Fernbedienungen wie folgt anzeigen:

git remote show

Sie können die Zweig- / Verfolgungskonfiguration für eine einzelne Fernbedienung (z. B. Ursprung) wie folgt anzeigen:

git remote show origin

Sobald Sie den geeigneten Ursprungszweig ermittelt haben, führen Sie einfach einen normalen Diff durch :)

git diff [MY_LOCAL] MY_REMOTE_BRANCH

DylanYoung
quelle
0

Das ist ganz einfach. Sie können verwenden:git diff remote/my_topic_branch my_topic_branch

Wo my_topic_branchist dein Themenzweig?

Elisha Senoo
quelle
0

Angenommen, Sie haben Ihr originRepository bereits als Remote-Repository eingerichtet. Dann,

git diff <local branch> <origin>/<remote branch name>

Tirtha
quelle
0

Versuchen:

git diff origin HEAD

Angenommen, Sie möchten Ihre aktuellen lokalen Zweige HEADvom Ursprung unterscheiden. Und vorausgesetzt, Sie sind in der lokalen Niederlassung. :) :)

Sourabh Pandit
quelle
-3

Wenn Sie TortoiseGit verwenden (es bietet eine grafische Benutzeroberfläche für Git), können Sie mit der rechten Maustaste auf Ihren Git-Repo-Ordner klicken und dann auf klicken Git Sync.

Sie können Ihre zu vergleichenden Zweige auswählen, wenn sie nicht ausgewählt sind. Dann können Sie Unterschiede Commit anzeigen. Sie können dann auch mit der rechten Maustaste auf ein Commit klicken, Compare with previous revisionum die Unterschiede nebeneinander anzuzeigen.Tortoise Git Sync zum Vergleichen von Remote- und lokalen Filialen

Halil İbrahim Oymacı
quelle