Git-Unterschied zwischen geklontem und ursprünglichem Remote-Repository

170

Ich habe ein Github-Repository geklont und lokal keine Änderungen vorgenommen. Das Github-Repository wurde mit Commits für denselben Zweig weiterentwickelt.

  1. Wie finde ich einen Unterschied zwischen meinem lokalen Repository und dem ursprünglichen Github-Repository?
  2. Wie finde ich einen Unterschied zwischen meiner Arbeitskopie und dem ursprünglichen Github-Repository?
  3. Wie finde ich einen Unterschied zwischen meinem lokalen Repository und einem anderen Github-Repository desselben Projekts?
Oleg Proudnikov
quelle
1
Mögliches Duplikat des Vergleichs des lokalen Git-Zweigs mit dem Remote-Zweig?
Ciro Santilli 法轮功 冠状 病 六四 事件 30
1
@CiroSantilli I 改造 中心 六四 六四 法轮功: Ich denke, es ist ausreichend anders: Die andere Frage fragt nach einem generischen Remote-Zweig, während dies mit Bezug auf GitHub geschieht, plus fragt nach drei verschiedenen Ausgangspunkten. Sie sind definitiv ähnlich, also ist Ihr Link sicherlich nützlich.
Jvriesem

Antworten:

161

1) Fügen Sie alle Remote-Repositorys hinzu, die Sie vergleichen möchten:

git remote add foobar git://github.com/user/foobar.git

2) Aktualisieren Sie Ihre lokale Kopie einer Fernbedienung:

git fetch foobar

Durch das Abrufen wird Ihre Arbeitskopie nicht geändert.

3) Vergleichen Sie einen Zweig aus Ihrem lokalen Repository mit einem von Ihnen hinzugefügten Remote:

git diff master foobar/master
dbyrne
quelle
Benötige ich Git Fetch vor Diff? Ich denke, es gibt keine Möglichkeit, sich ohne sie zu unterscheiden.
Oleg Proudnikov
Dies ist eigentlich nur eine Antwort auf Frage 3 (anders als bei einem anderen Github-Repo).
Ruslan Kabalin
5
Nichts unterscheidet das "ursprüngliche Github-Repository" von einem anderen Remote-Repository. Oder verstehe ich etwas falsch?
Dbyrne
Als ich es mit Git 2.7.4 versuchte, zeigte der "Git Diff Master Foobar / Master" keine Unterschiede. Ich sehe für mich so aus, als würde es meine lokale Kopie ("master") mit dem als 1. Argument angegebenen Repo ("master") vergleichen und darin nur den "Pfad / die Datei" "foobar / master" unterscheiden. Aber der Befehl "diff foobar / master" hat bei mir funktioniert und meinen lokalen Master mit foobar / master verglichen.
user2081279
Anstelle von fetch(Nr. 2) als Alternative: git remote update- Es werden alle Ihre Zweige aktualisiert, die so eingestellt sind, dass sie entfernte Zweige verfolgen, aber keine Änderungen in zusammenführen. odergit pull
Timo
49

Eine weitere Antwort auf Ihre Fragen (vorausgesetzt, Sie sind Master und haben bereits "git fetch origin" ausgeführt, um Sie auf Remote-Änderungen aufmerksam zu machen):

1) Commits für Remote-Zweig seit der Erstellung des lokalen Zweigs:

git diff HEAD...origin/master

2) Ich gehe davon aus, dass Sie mit "Arbeitskopie" Ihre lokale Niederlassung mit einigen lokalen Commits meinen, die noch nicht remote sind. So sehen Sie die Unterschiede zu dem, was Sie in Ihrem lokalen Zweig haben, der jedoch beim Ausführen eines Remote-Zweigs nicht vorhanden ist:

git diff origin/master...HEAD

3) Siehe die Antwort von dbyrne.

Ruslan Kabalin
quelle
Danke für die HEAD..origin/masterSyntax! Wir haben Fehler mit Origin / HEAD erhalten, die nicht vorhanden sind, und dies hat das Problem behoben.
Dan Bechard
@ruslan: Was bedeutet es, wenn git diff HEAD...origin/masternichts zurückgegeben wird, wenn ich ein Remote-Verzeichnis geklont habe, an dem ich Änderungen vornehmen darf ?
Mona Jalal
Beim Klonen über die Windows-Benutzeroberfläche ist ein Fehler aufgetreten. Daher frage ich mich, ob der Klon vollständig durchlaufen wurde. Ich sehe, dass sich die Ordner hier in meinem Verzeichnis befinden, möchte aber sicherstellen, dass sie mit remote identisch sind. In der Git-Shell gibt Git Diff jedoch nichts zurück. Ich bin verwirrt, ob mein Klon erfolgreich war oder nicht.
Mona Jalal
@MonaJalal bedeutet, dass es keine Upstream-Änderungen gibt, seit Sie es geklont haben.
Ruslan Kabalin
21

Dieses Beispiel könnte jemandem helfen:

Hinweis " origin" ist mein Alias ​​für Remote "Was ist auf Github?"
Hinweis " mybranch" ist mein Alias ​​für meinen Zweig "Was ist lokal", den ich mit Github synchronisiere - Ihr
Zweigname ist "Master", wenn Sie nicht erstellt haben einer. Ich verwende jedoch den anderen Namen, um mybranchzu zeigen, wo der Zweigstellennamenparameter verwendet wird.


Was genau sind meine Remote-Repos auf Github?

$ git remote -v
origin  https://github.com/flipmcf/Playground.git (fetch)
origin  https://github.com/flipmcf/Playground.git (push)

Fügen Sie das "andere Github-Repository mit demselben Code" hinzu - wir nennen dies eine Abzweigung:

$ git remote add someOtherRepo https://github.com/otherUser/Playground.git

$git remote -v
origin  https://github.com/flipmcf/Playground.git (fetch)
origin  https://github.com/flipmcf/Playground.git (push)
someOtherRepo https://github.com/otherUser/Playground.git (push)
someOtherRepo https://github.com/otherUser/Playground.git (fetch)

Stellen Sie sicher, dass unser lokales Repo auf dem neuesten Stand ist:

$ git fetch

Ändern Sie einige Dinge vor Ort. Sagen wir Datei ./foo/bar.py

$ git status
# On branch mybranch
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   modified:   foo/bar.py

Überprüfen Sie meine nicht festgeschriebenen Änderungen

$ git diff mybranch
diff --git a/playground/foo/bar.py b/playground/foo/bar.py
index b4fb1be..516323b 100655
--- a/playground/foo/bar.py
+++ b/playground/foo/bar.py
@@ -1,27 +1,29 @@
- This line is wrong
+ This line is fixed now - yea!
+ And I added this line too.

Lokal festschreiben.

$ git commit foo/bar.py -m"I changed stuff"
[myfork 9f31ff7] I changed stuff
1 files changed, 2 insertions(+), 1 deletions(-)

Jetzt bin ich anders als meine Fernbedienung (auf Github)

$ git status
# On branch mybranch
# Your branch is ahead of 'origin/mybranch' by 1 commit.
#
nothing to commit (working directory clean)

Diff dies mit Fernbedienung - Ihre Gabel: (dies wird häufig mit gemacht git diff master origin )

$ git diff mybranch origin
diff --git a/playground/foo/bar.py b/playground/foo/bar.py
index 516323b..b4fb1be 100655
--- a/playground/foo/bar.py
+++ b/playground/foo/bar.py
@@ -1,27 +1,29 @@
- This line is wrong
+ This line is fixed now - yea!
+ And I added this line too.

(Git Push, um diese auf die Fernbedienung anzuwenden)

Wie unterscheidet sich mein Remote-Zweig vom Remote-Master-Zweig?

$ git diff origin/mybranch origin/master

Wie unterscheidet sich mein lokales Material vom Remote-Master-Zweig?

$ git diff origin/master

Wie unterscheidet sich mein Zeug von der Gabel eines anderen, dem Hauptzweig desselben Repos?

$git diff mybranch someOtherRepo/master
FlipMcF
quelle
5
Bevor wir einen 'Git Diff' durchführen, ist es meiner Meinung nach notwendig, einen 'Git Fetch' durchzuführen, um sicherzustellen, dass unsere lokale Kopie der Fernbedienung auf dem neuesten Stand ist.
Don
1
Ich habe vielleicht 20 Beiträge darüber gelesen, wie man Remote und Local vergleicht. Ich habe das gerade selbst herausgefunden: Git-Abruf ist zuerst erforderlich. Git ist wirklich der Assembler-Code von RCS. Jesus. Danke für die Bestätigung, Don!
Terence Parr
gerade git fetchzu dieser Antwort hinzugefügt .
FlipMcF
1
Hummm ... Ich mag es nicht, wie ich 'myfork' als Filialnamen verwendet habe. Das könnte jemanden verwirren (wie mich, der gerade für diese Antwort zurückgekommen ist)
FlipMcF
Bearbeitet - Klarheit und Beantwortung der Frage Nr. 3 "
Gabelunterschied"