Unterschiede zwischen Git Remote Update und Fetch?

180

Ist git remote updatedas Äquivalent von git fetch?

David
quelle

Antworten:

110

UPDATE: Weitere Informationen!

Ich hätte das von Anfang an tun sollen: Ich habe die Git-Versionshinweise in Git's Git-Repo gelesen (also Meta!)

grep --color=always -R -C30 fetch Documentation/RelNotes/* | less

Dann habe ich nach lessgesucht --allund dies habe ich unter den Versionshinweisen für Git Version 1.6.6 gefunden :

git fetchGelernt --allund --multipleOptionen, um das Abrufen aus vielen Repositorys auszuführen, und die --pruneOption, veraltete Remote-Tracking-Zweige zu entfernen. Diese machen git remote updateund git remote pruneweniger notwendig (es gibt jedoch keinen Plan zu entfernen remote updateoder remote prune).

Version 1.6.6 wurde erst am 23. Dezember 2009 veröffentlicht , und das Originalposter stellte seine Frage am 6. Dezember 2009.

Wie Sie den Versionshinweisen entnehmen können, waren sich die Autoren von Git der Tatsache bewusst, dass die git remote updateBefehlsfunktionalität etwas dupliziert wurde git fetch, aber sie beschlossen, sie nicht zu entfernen, möglicherweise aus Gründen der Abwärtskompatibilität mit vorhandenen Skripten und Programmen oder weil Es ist einfach zu viel Arbeit und es gibt Elemente mit höherer Priorität.


Ursprüngliche Antwort mit mehr Details

xenoterracide Antwort ist 3,5 Jahre alt jetzt, und Git hat sich seitdem durch mehrere Versionen gegangen (es von gegangen ist v1.6.5.5 auf v1.8.3.2 als dies geschrieben wurde ), und suchen Sie in der aktuellen Dokumentation git remote updateund git fetchsieht es so aus Als ob beide im Grunde die gleiche Funktion zum Abrufen neuer Commits von mehreren Fernbedienungen ausführen könnten , wenn die richtigen Optionen und Argumente gegeben wären .

Alle Fernbedienungen abrufen

Eine Möglichkeit, mehrere Fernbedienungen abzurufen, ist das --allFlag:

git fetch --all

Dadurch werden alle konfigurierten Fernbedienungen abgerufen, sofern Sie keine remote.<name>.skipFetchAllEinstellungen vorgenommen haben:

Wenn true, wird diese Fernbedienung beim Aktualisieren mit git-fetch (1) oder dem Unterbefehl update von git-remote (1) standardmäßig übersprungen . - git-config Dokumentation

Dies wäre gleichbedeutend mit der Verwendung

git remote update

ohne Angabe einer Remote-Gruppe, die abgerufen werden soll, und ohne dass dies remotes.defaultin Ihrer Repo-Konfiguration festgelegt wurde und dass keine Ihrer Fernbedienungen remote.<name>.skipDefaultUpdateauf true gesetzt wurde.

In der aktuellen 1.8.3.2-Dokumentation für die Konfiguration von Git wird die remotes.defaultEinstellung nicht erwähnt , aber ich habe The Almighty Google dazu konsultiert und diese hilfreiche Erklärung von Mislav Marohnić gefunden :

$ git config remotes.default 'origin mislav staging'
$ git remote update

# fetches remotes "origin", "mislav", and "staging"

Sie können eine Standardliste von Fernbedienungen definieren, die vom remote updateBefehl abgerufen werden sollen . Dies können Fernbedienungen von Ihren Teamkollegen, vertrauenswürdigen Community-Mitgliedern eines Open Source-Projekts oder ähnlichem sein.

Wenn Sie also remotes.defaultfestgelegt haben und nicht alle Ihre Fernbedienungen darin aufgeführt sind, git remote updatewerden vermutlich nicht alle Fernbedienungen abgerufen, die Ihrem Repo "bekannt" sind.

Die remote.<name>.skipDefaultUpdateEinstellung wird in den Git-Dokumenten folgendermaßen erklärt:

Wenn true, wird diese Fernbedienung beim Aktualisieren mit git-fetch (1) oder dem Unterbefehl update von git-remote (1) standardmäßig übersprungen .

Abrufen einer bestimmten Gruppe von Fernbedienungen

Anstatt alle Fernbedienungen zu holen, die beide fetchund remote updateermöglicht es Ihnen , mehrere Fernbedienungen und Gruppen von Fernbedienungen angeben zu holen:

git fetch [<options>] <group>
git fetch --multiple [<options>] [(<repository> | <group>)…]

git fetch [<options>] <group>Mit dieser Option können Sie mehrere Fernbedienungen abrufen, die Teil einer Gruppe sind (um ein weiteres Beispiel von Mislav auszuleihen ):

$ git config remotes.mygroup 'remote1 remote2 ...'
$ git fetch mygroup

git fetch --multipleMit dieser Option können Sie mehrere Repositorys und Repository-Gruppen angeben, die gleichzeitig abgerufen werden sollen (aus den Dokumenten ):

Lassen Sie mehrere <repository>und <group>Argumente angeben. Nein <refspec>skann angegeben werden.

Mehrdeutigkeit in der git remote updateDokumentation

Die Inhaltsangabe fürgit remote update gibt an, dass die Befehlssyntax wie folgt lautet:

git remote [-v | --verbose] update [-p | --prune] [(<group> | <remote>)…]

Beachten Sie den letzten Teil [(<group> | <remote>)…]? Die nachfolgenden Punkte ...implizieren, dass Sie mit dem Befehl mehrere Gruppen und Fernbedienungen angeben können. Dies würde bedeuten, dass er sich genauso verhält wie git fetch --multiple... sehen Sie, wie ähnlich die Syntax zwischen den beiden ist?

Im selben Dokument updatesagt die Erklärung für den Befehl jedoch nichts über die Angabe mehrerer Gruppen- und Remote-Argumente aus, sondern nur darüber

Rufen Sie [es] Updates für einen benannten Satz von Fernbedienungen im Repository ab, wie durch definiert remotes.<group>.

Es ist daher unklar, ob die Angabe mehrerer einzelner Fernbedienungen und mehrerer entfernter Gruppen git remote updateidentisch ist git fetch --multiple.

Eine einzelne Fernbedienung abrufen

Schließlich kennt jeder den einfachen Fall, eine einzelne Fernbedienung abzurufen:

git fetch <remote>

Möglicherweise können Sie auch verwenden

git remote update <remote>

git remote updateUm dasselbe zu tun, aber wie ich im vorherigen Abschnitt erwähnt habe, ist in der Dokumentation für unklar, ob es möglich ist, mit dem Befehl etwas anderes als eine einzelne Gruppe von Fernbedienungen abzurufen .

Einpacken

Wie ich erklärt habe, git fetchund git remote updateverhalten Sie sich beim Abrufen von mehreren Fernbedienungen ähnlich. Sie haben eine ähnliche Syntax und ähnliche Argumente, git fetchsind jedoch kürzer, sodass die Benutzer wahrscheinlich leichter tippen und verwenden können.

Es kann sein, dass git remote updatenicht nur eine einzelne Fernbedienung wie mit abgerufen werden kann git fetch, aber wie ich bereits erwähnt habe, wird dies in der Dokumentation nicht klargestellt.

Beiseite

Die doppelte Funktionalität zwischen Git-Porzellanbefehlen, die durch git fetchund git remote updateüber veranschaulicht wird , ist nicht eindeutig. Ich habe eine ähnliche Situation mit git rebase --ontound festgestellt git cherry-pick, da beide eine Reihe von Commits benötigen, um auf ein neues Basis-Commit zu patchen.

Ich denke, da sich Git im Laufe der Jahre weiterentwickelt hat, wurden einige Funktionen (unvermeidlich?) Dupliziert, vielleicht manchmal als Annehmlichkeit für Endbenutzer (zum Beispiel ist es einfacher, einen Bereich an zu übergeben cherry-pick, als ein einzelnes Commit immer wieder zu übergeben einen Bereich auswählen). Anscheinend cherry-pickwurden nicht immer verschiedene Commits akzeptiert, wie in den Versionshinweisen zu Version 1.7.2 erläutert :

git cherry-picklernte, eine Reihe von Commits (z. B. cherry-pick A..Bund cherry-pick --stdin) auszuwählen, und tat dies auch git revert; Diese unterstützen jedoch nicht die schönere Sequenzierungskontrolle rebase [-i].

nvidot
quelle
4
Zu Ihrer Information: git rebaseist wie mvund git cherry-pickist wie cp. Der --ontoSchalter ändert das nicht. Sie können git rebasenur dann einen Kopiereffekt erzielen, wenn Sie SHA1-Werte angeben. Andernfalls wird Ihr Zweig verschoben!
Robert Siemer
141

Ja und nein. git remote updateholt von allen Fernbedienungen, nicht nur von einer.

Ohne auf den Code zu schauen, um festzustellen, ob remote updatees sich nur um ein Shell-Skript handelt (möglich), wird im Grunde Fetch für jede Fernbedienung ausgeführt. git fetchkann viel körniger sein.

Xenoterracid
quelle
3
Sie können konfigurieren, welche Fernbedienungen beim Ausführen abgerufen werden sollen git remote update(siehe git-remote-Manpage).
Jakub Narębski
Übrigens git remoteist es kein Shell-Skript, aber es erscheint git fetchwährend eines remote update.
Mipadi
1
Gibt es äquivalente git fetchBefehlsoptionen für a git remote update?
Tuler
15
@tuler Ja: es istgit fetch --all
LoKi