Wie finde ich mit Git Änderungen zwischen lokal und remote?

152

Hier sind zwei verschiedene Fragen, aber ich denke, sie hängen zusammen.

  1. Wie finde ich bei der Verwendung von Git heraus, welche Änderungen ich lokal festgeschrieben, aber noch nicht in einen Remote-Zweig verschoben habe? Ich suche etwas Ähnliches wie das Mercurial-Kommando hg outgoing.

  2. Wie finde ich bei der Verwendung von Git heraus, welche Änderungen ein Remote-Zweig vor einem Pull vorgenommen hat? Ich suche etwas Ähnliches wie das Mercurial-Kommando hg incoming.

Zum zweiten: Gibt es eine Möglichkeit, zu sehen, was verfügbar ist, und dann die Änderungen auszuwählen, die ich übernehmen möchte?

Ejunker
quelle
11
Wenn man sich die Antworten ansieht, scheint es einige Verwirrung darüber zu geben, was hg incomingund was hg outgoingtatsächlich zu tun ist. Das nächste Git-Äquivalent, das ich gefunden habe, ist die --dry-runOption. Nur git pull --dry-runund Sie sehen eine Liste aller Dinge, die passieren müssen.
Roman Starkov

Antworten:

97

Git kann diese Art von Informationen nicht wie Hg über das Netzwerk senden. Sie können jedoch ausführen git fetch(was eher so ist hg pullals hg fetch), um neue Commits von Ihren Remoteservern abzurufen.

Wenn Sie also einen Zweig aufgerufen masterund eine Fernbedienung aufgerufen haben origin, sollten Sie nach dem Ausführen git fetchauch einen Zweig anrufen origin/master. Sie können dann git logalle Commits masterabrufen, die eine Obermenge sein müssen, origin/masterindem Sie dies tun git log master..origin/master. Invertieren Sie diese beiden, um das Gegenteil zu erreichen.

Ein Freund von mir, David Dollar, hat ein paar Git-Shell-Skripte erstellt, um sie zu simulieren hg incoming/outgoing. Sie finden sie unter http://github.com/ddollar/git-utils .

Jordi Bunster
quelle
113

Ab Git 1.7.0 gibt es eine spezielle Syntax, mit der Sie generisch auf den Upstream-Zweig verweisen können: @{u}oder @{upstream}.

Nachahmen hg incoming:

git log ..@{u}

Nachahmen hg outgoing:

git log @{u}..

Ich verwende Folgendes incomingund outgoingAliase, um die Verwendung des oben genannten zu vereinfachen:

git config --global alias.incoming '!git remote update -p; git log ..@{u}'
git config --global alias.outgoing 'log @{u}..'
Richard Hansen
quelle
Git Log .. @ {u} gibt mir diese Fehler. (Ich habe sowohl Origin als auch ein Upstream-Repository in meiner Git-Konfiguration). Fehler: Kein Upstream-Zweig für '' gefunden. Fehler: Kein Upstream-Zweig für '..' gefunden. Fehler: Kein Upstream-Zweig für '..' gefunden. fatal: mehrdeutiges Argument '.. @ {u}': Unbekannte Revision oder Pfad nicht in der Arbeitsbaum. Verwenden Sie '-', um Pfade von Revisionen zu trennen
Henrik
6
Diese Fehler werden angezeigt, wenn Ihr lokaler Zweig nicht mit einem Upstream konfiguriert ist. Führen Sie zum Reparieren aus git branch --set-upstream foo origin/foo.
Richard Hansen
git log @{u}..listet jede einzelne Änderung im Repo für mich auf. Auf keinen Fall existieren sie noch nicht.
Roman Starkov
@romkyns: Möglicherweise ist in Ihrem lokalen Zweig der falsche Remote-Zweig als Upstream konfiguriert. Stellen Sie sicher git rev-parse --symbolic-full-name @{u}, dass die entsprechende Fernreferenz gedruckt wird. Außerdem git log @{u}..zeigt die Festschreibungen , die nicht erreichbar mit dem stromaufwärtigen Zweig sind, die Festschreibungen, die bereits in dem entfernten Repository enthalten kann (wenn sie von einer anderen Referenz erreichbar sind). Dies geschieht direkt nach dem Zusammenführen in einem bereits verschobenen Zweig.
Richard Hansen
@RichardHansen Ich fürchte, ich bin zu noob, um zu wissen, was für eine Fernreferenz geeignet wäre, aber dies war ein frisch geklontes Repo, auf dem ich nur ein checkout <somebranch>und gemacht habe merge <otherbranch>. Zu diesem Zeitpunkt habe ich das getan log @{u}..und jede Änderung aufgelistet gesehen.
Roman Starkov
42

Keine vollständige Antwort, aber Git Fetch zieht das Remote-Repo und führt keine Zusammenführung durch. Sie können dann eine

Git Diff Master Herkunft / Master

Martin Redmond
quelle
1
Arbeitete für mich (aber anders herum) -git diff origin/master master
Nick Grealy
34
  1. Verwenden Sie "git log origin..HEAD"

  2. Verwenden Sie "git fetch" gefolgt von "git log HEAD..origin". Mit den aufgelisteten Commit-IDs können Sie einzelne Commits auswählen.

Das oben Gesagte setzt natürlich voraus, dass "Ursprung" der Name Ihres Remote-Tracking-Zweigs ist (was der Fall ist, wenn Sie einen Klon mit Standardoptionen verwendet haben).

Greg Hewgill
quelle
3
(Und wenn Sie den Remote-Zweig nicht verfolgen, ist es "Git Log Origin / Master ... HEAD".)
Plindberg
4
"Ursprung" ist nicht der Name des Fernverfolgungszweigs, sondern der Name der Fernbedienung. Und nur die Angabe des Remote-Namens funktioniert nicht. Sie müssen den Remote-Tracking-Zweig angeben, der Origin / Master ist.
Robinst
22

Es gibt auch Folgendes, um alle Zweige zu vergleichen:

git log --branches --not --remotes=origin

Dies ist, was die Git Log Manpage dazu sagt:

Zeigt alle Commits an, die sich in einem der lokalen Zweige befinden, jedoch nicht in einem der Fernverfolgungszweige für den Ursprung (was Sie an diesem Ursprung haben, nicht).

Das obige ist für outgoing. Für incoming, einfach tauschen:

git log --remotes=origin --not --branches
robinst
quelle
8

Ich würde es tun

$ git fetch --dry-run

für hg incomingund

$ git push --dry-run

für hg outgoing.

chris
quelle
Entschuldigung, ich habe übersehen, dass dies bereits als Kommentar zum OP gesagt wurde.
Chris
1

git-out ist ein Skript, das hg outgoingziemlich genau emuliert . Es analysiert die Ausgabe "push-n", sodass eine genaue Ausgabe erstellt wird, wenn Sie zusätzliche Argumente für die Push-Angabe angeben müssen.

stepancheg
quelle
0

Git eingehend

$ git fetch && git log ..origin/master --stat
OR
$ git fetch && git log ..origin/master --patch

git ausgehend

$ git fetch && git log origin/master.. --stat
OR
$ git fetch && git log origin/master.. --patch
betenagupd
quelle
0

Als die Antworten "git log" und @ {u} mir anfänglich "unbekannte Revisions" -Fehler gaben, probierte ich Chris / romkyns Vorschlag aus git push --dry-run.

Sie erhalten eine Ausgabe wie "5905..4878 master-> master". 5905 ist das letzte Commit, das die Fernbedienung hat, und Commits über (und einschließlich) 4878 werden auf die Fernbedienung angewendet.

Sie können dann 5905..4878 als Argumente für mehrere andere Git-Befehle verwenden, um weitere Details zu erhalten:

git diff 5905..4878 # Gives full code changes in diff style

git log --online 5905..4878 # Displays each commit's comment
pierce.jason
quelle
-1

Wenn Sie git fetch ausführen, werden alle Inhalte einschließlich Zweigen und Tags (refs) vorübergehend in .git / FETCH_HEAD gespeichert, deren Inhalt mit dem folgenden Befehl angezeigt werden kann: git log FETCH_HEAD Wenn Sie bei git fetch kein Suffix -a verwenden, verwenden Sie standardmäßig Die Inhalte von FETCH_HEAD werden durch neue Inhalte überschrieben. Aus diesen Inhalten können Sie anzeigen und entscheiden, zu welchem ​​Zweig Sie sie zusammenführen möchten, wenn Sie dies tun, oder Sie können einfach eine Auswahl treffen, wenn Sie nur wenige Commits von dem möchten, was durch Abrufen gebracht wurde.

AMIT PRAKASH PANDEY
quelle