Wie überprüfe ich das entfernte Git-Repository (Ursprung) auf Änderungen?

249

Frage

Was sind die Git-Befehle für den folgenden Workflow?

Szenario

Ich habe aus einem Repository geklont und einige eigene Commits für mein lokales Repository durchgeführt. In der Zwischenzeit haben meine Kollegen Commits für das Remote-Repository vorgenommen. Jetzt möchte ich:

  1. Überprüfen Sie, ob im Remote-Repository neue Commits von anderen Personen vorhanden sind, z origin.

  2. Angenommen, seit meinem letzten Abruf gab es 3 neue Commits im Remote-Repository. Ich möchte die Commits des Remote-Repositorys unterscheiden, dh HEAD~3mit HEAD~2, HEAD~2mit HEAD~1und HEAD~1mit HEAD.

  3. Nachdem ich weiß, was sich aus der Ferne geändert hat, möchte ich die neuesten Commits von den anderen erhalten.

Meine bisherigen Erkenntnisse

Für Schritt 2: Ich kenne die caret Notation HEAD^, HEAD^^usw. und die Tilde - Notation HEAD~2, HEAD~3usw.

Für Schritt 3: Das heißt, ich denke, nur ein git pull.

Lernkurve
quelle
3
Mögliches Duplikat von Check, ob Pull in Git erforderlich ist
Daniele Orlando
@ Daniele, die Antwort, auf die Sie verlinken, ist hervorragend und wird sogar mit einem anpassbaren Bash-Skript geliefert. +1
gorbysbm

Antworten:

255

Sie können git fetch originden Remote-Zweig in Ihrem Repository aktualisieren, um auf die neueste Version zu verweisen. Für einen Unterschied gegen die Fernbedienung:

git diff origin/master

Ja, Sie können auch die Caret-Notation verwenden.

Wenn Sie die Remote-Änderungen akzeptieren möchten:

git merge origin/master
Alan Haggai Alavi
quelle
34
Der Diff sieht umgekehrt aus. Ich finde es einfacher zu benutzen, git diff HEAD origin/masterso dass der Diff zeigt, was angewendet wird, wenn ich die Remote-Änderungen akzeptiere.
Cbliard
2
"git fetch origin" und "git show-branch * master" waren für mich nützlich.
Léa Massiot
159
git remote update && git status 

Fand dies auf der Antwort auf Überprüfen, ob Pull in Git benötigt wird

git remote updateum Ihre Remote-Refs auf den neuesten Stand zu bringen. Dann können Sie eines von mehreren Dingen tun, wie zum Beispiel:

  1. git status -unowird Ihnen sagen, ob der Zweig, den Sie verfolgen, vor, hinter oder divergiert ist. Wenn nichts gesagt wird, sind lokal und remote identisch.

  2. git show-branch *master zeigt Ihnen die Commits in allen Zweigen, deren Namen auf master enden (z. B. master und origin / master).

Wenn Sie -vmit verwenden git remote update, können Sie sehen, welche Zweige aktualisiert wurden, sodass Sie keine weiteren Befehle benötigen.

Rajani Karuturi
quelle
Nicht genug. Ich muss git pull <remote> <branch>danach eine machen, sobald ich pushen muss, weil die Spitze meiner lokalen Niederlassung hinter dem entfernten Gegenstück war.
Overdrivr
3
@Overdrivr In der Frage wird nach einer Möglichkeit gefragt, Änderungen zu überprüfen, bevor die Commits an die lokale Zweigstelle gesendet werden. Ja, Sie müssen Ihren lokalen Zweig aktualisieren, nachdem Sie nach Änderungen gesucht haben.
Rajani Karuturi
Ist dies für Remote-Ursprung oder Upstream?
Vikramvi
1
Diese Option -v funktioniert nicht. Denn git remote update -vich habeerror: unknown switch `v'
Shad
1
@ Schatten sollten Sie git remote -v updatenichtgit remote update -v
Rajani Karuturi
34

Ein guter Weg, um eine synthetische Sicht auf das zu bekommen, was unter "Ursprung" vor sich geht, ist:

git remote show origin
jag
quelle
11
Aber dieser Befehl zeigt mir nicht, wie viele Commits es seit meinem letzten Pull auf "origin" gegeben hat, oder? Die Art und Weise, wie ich es verstanden habe "git remote show origin", ist eine lokale Operation und geht nicht über das Netzwerk, um Informationen abzurufen.
Lernkurve
24

Ich benutze nur

git remote update
git status

Letzterer meldet dann, wie viele Commits hinter meinem Local stehen. (wenn überhaupt)

dann

git pull origin master

um mein lokales auf den neuesten Stand zu bringen :)

Paul 501
quelle
13

Meine reguläre Frage lautet eher "irgendetwas Neues oder Geändertes im Repo", also ist das, was geändert wurde, praktisch. Fand es hier .

git whatchanged origin/master -n 1
iceCode
quelle
1
Nie neu gab es diesen Befehl. Vielen Dank. das ist was ich gesucht habe
Saurabh Jain
11

Eine mögliche Lösung

Dank der Lösung von Alan Haggai Alavi konnte ich den folgenden potenziellen Workflow entwickeln:

Schritt 1:

git fetch origin

Schritt 2:

git checkout -b localTempOfOriginMaster origin/master
git difftool HEAD~3 HEAD~2
git difftool HEAD~2 HEAD~1
git difftool HEAD~1 HEAD~0

Schritt 3:

git checkout master
git branch -D localTempOfOriginMaster
git merge origin/master
Lernkurve
quelle
13
Warum müssen Sie eine temporäre Verzweigung für Unterschiede zwischen den Revisionen der Fernbedienung erstellen? Sie können nurgit diff origing/master^ origing/master^^
Pablo Marin-Garcia
@ PabloMarin-Garcia: Danke. Das wusste ich damals noch nicht.
Lernkurve
2

git statuszeigt nicht immer den Unterschied zwischen Master und Origin / Master, auch nach einem Abruf. Wenn die Kombination git fetch origin && git statusfunktionieren soll, müssen Sie die Tracking-Informationen zwischen lokalem Zweig und Ursprung angeben:

# git branch --set-upstream-to=origin/<branch> <branch>

Für Hauptzweig:

git branch --set-upstream-to=origin/master master
Schakal
quelle
0

da es bisher nicht vorgeschlagen wurde ... und ich finde es sehr nützlich ...

Ich benutze einfach

git fetch origin

Um die Remote-Änderungen abzurufen, und dann sehe ich sowohl lokale als auch ausstehende Remote-Commits (und die damit verbundenen Änderungen) mit dem netten Gitk-Tool ( https://git-scm.com/docs/gitk ) an, das das Argument --all wie enthält

gitk --all
Raphael
quelle