git fetch
Befehl downloads commits, Dateien und Links aus einem remote-repository in Ihr lokales repo. Holen ist das, was Sie tun, wenn Sie sehen möchten, woran alle anderen gearbeitet haben. Es ähnelt svn update
, da Sie sehen können, wie der zentrale Verlauf fortgeschritten ist, Sie jedoch nicht gezwungen werden, die Änderungen tatsächlich in Ihrem Repository zusammenzuführen. Git isoliert abgerufene Inhalte von vorhandenen lokalen Inhalten; Es hat absolut keinen Einfluss auf Ihre lokale Entwicklungsarbeit., Abgerufene Inhalte müssen explizit mit dem Befehl git checkout
ausgecheckt werden. Dies macht das Abrufen zu einer sicheren Möglichkeit, Commits zu überprüfen, bevor sie in Ihr lokales Repository integriert werden.
Beim Herunterladen von Inhalten aus einem Remote-Repo stehen die Befehle git pull
und git fetch
zum Ausführen der Aufgabe zur Verfügung. Sie können git fetch
als „sichere“ Version der beiden Befehle betrachten. Es wird den Remote-Inhalt herunterladen, aber nicht den Arbeitsstatus Ihres lokalen Repos aktualisieren, sodass Ihre aktuelle Arbeit erhalten bleibt., git pull
ist die aggressivere Alternative; es wird den Remote-Inhalt für den aktiven lokalen Zweig herunterladen und sofort git merge
ausführen, um ein Merge-Commit für den neuen Remote-Inhalt zu erstellen. Wenn ausstehende Änderungen im Gange sind, führt dies zu Konflikten und zum Start des Zusammenführungskonfliktlösungsflusses.
Wie git fetch mit entfernten Zweigen arbeitet
Um besser zu verstehen, wie git fetch
funktioniert, lassen Sie uns diskutieren, wie Git Commits organisiert und speichert., Hinter den Kulissen speichert Git im Verzeichnis ./.git/objects
des Repositorys alle Commits, lokal und remote. Git hält Remote – und lokale Branch-Commits durch die Verwendung von Branch Refs deutlich getrennt. Die Refs für lokale Zweige werden in der ./.git/refs/heads/
gespeichert. Durch Ausführen des Befehls git branch
wird eine Liste der lokalen branch refs ausgegeben. Im Folgenden finden Sie ein Beispiel für die Ausgabe von git branch
mit einigen Demo-Zweignamen.,
git branch
master
feature1
debug2
Wenn Sie den Inhalt des Verzeichnisses /.git/refs/heads/
untersuchen, wird eine ähnliche Ausgabe angezeigt.
ls ./.git/refs/heads/
master
feature1
debug2
Entfernte Zweige sind genau wie lokale Zweige, außer dass sie Commits aus dem Repository eines anderen zuordnen. Entfernten Zweigen wird die Fernbedienung vorangestellt, zu der sie gehören, damit Sie sie nicht mit lokalen Zweigen verwechseln. Wie lokale Zweige hat Git auch Refs für entfernte Zweige. Remote branch Refs leben im Verzeichnis ./.git/refs/remotes/
., Das nächste Beispielcode-Snippet zeigt die Zweige, die Sie nach dem Abrufen eines Remote-Repos mit dem Namen remote-repo sehen könnten:
git branch -r
# origin/master
# origin/feature1
# origin/debug2
# remote-repo/master
# remote-repo/other-feature
Diese Ausgabe zeigt die lokalen Zweige an, die wir zuvor untersucht hatten, zeigt sie jedoch jetzt mit dem Präfix origin/
an. Zusätzlich sehen wir jetzt die entfernten Zweige mit dem Präfix remote-repo
. Sie können einen Remote-Zweig genau wie einen lokalen Zweig auschecken, aber dadurch befinden Sie sich in einem getrennten HEAD
– Status (genau wie beim Auschecken eines alten Commits). Sie können sie als schreibgeschützte Zweige betrachten., Um Ihre Remote-Zweige anzuzeigen, übergeben Sie einfach das Flag -r
an den Befehl git branch
.
Sie können Remote-Zweige mit den üblichen Befehlen git checkout
und git log
überprüfen. Wenn Sie die Änderungen genehmigen, die ein Remote-Zweig enthält, können Sie ihn mit einer normalen git merge
zu einem lokalen Zweig zusammenführen. Im Gegensatz zu SVN ist das Synchronisieren Ihres lokalen Repositorys mit einem Remote-Repository tatsächlich ein zweistufiger Prozess: Abrufen, dann Zusammenführen. Der Befehl git pull
ist eine praktische Verknüpfung für diesen Prozess.,
Git fetch Befehle und Optionen
git fetch <remote>
Holen Sie alle Zweige aus dem Repository. Dadurch werden auch alle erforderlichen Commits und Dateien aus dem anderen Repository heruntergeladen.
git fetch <remote> <branch>
Wie der obige Befehl, aber nur den angegebenen Zweig abrufen.
git fetch --all
Ein Power Move, der alle registrierten Fernbedienungen und deren Zweige abruft:
git fetch --dry-run
Die Option --dry-run
führt eine Demo-Ausführung des Befehls aus., Es werden Beispiele für Aktionen ausgegeben, die während des Abrufs ausgeführt werden, diese jedoch nicht angewendet werden.
git fetch a remote branch
Das folgende Beispiel zeigt, wie Sie einen Remote-Zweig abrufen und Ihren lokalen Arbeitsstatus auf den Remote-Inhalt aktualisieren. Nehmen wir in diesem Beispiel an, dass es einen zentralen Repo-Ursprung gibt, von dem aus das lokale Repository mit dem Befehl geklont wurde. Nehmen wir auch ein zusätzliches Remote-Repository namens coworkers_repo an, das einen feature_branch enthält, den wir konfigurieren und abrufen werden., Lassen Sie uns mit diesen Annahmen das Beispiel fortsetzen.
Zunächst müssen wir das Remote-Repo mit dem Befehl git remote
konfigurieren.
git remote add coworkers_repo [email protected]:coworker/coworkers_repo.git
Hier haben wir mithilfe der Repo-URL einen Verweis auf das Repo des Mitarbeiters erstellt. Wir übergeben diesen Remote-Namen nun an git fetch
, um den Inhalt herunterzuladen.
git fetch coworkers_repo coworkers/feature_branch
fetching coworkers/feature_branch
Wir haben jetzt lokal den Inhalt von coworkers/feature_branch Wir müssen dies in unsere lokale Arbeitskopie integrieren., Wir beginnen diesen Vorgang mit dem Befehl git checkout
, um den neu heruntergeladenen Remote-Zweig auszuchecken.
git checkout coworkers/feature_branch
Note: checking out coworkers/feature_branch'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:
git checkout -b <new-branch-name>
Die Ausgabe dieser Checkout-Operation zeigt an, dass wir uns in einem getrennten Zustand befinden HEAD
. Dies wird erwartet und bedeutet, dass unsere HEAD
ref auf eine ref zeigt, die nicht mit unserer lokalen Historie übereinstimmt. Da HEAD
auf die Referenz coworkers/feature_branch, können wir aus dieser Referenz einen neuen lokalen Zweig erstellen., Die Ausgabe ‚ detached HEAD
‚ zeigt uns, wie wir dies mit dem Befehl git checkout
tun:
git checkout -b local_feature_branch
Hier haben wir einen neuen lokalen Zweig namens local_feature_branch. Dies setzt Updates HEAD
auf den neuesten Remote-Inhalt und wir können die Entwicklung von diesem Punkt aus fortsetzen.
Herkunft mit git fetch synchronisieren
Im folgenden Beispiel wird der typische Workflow zum Synchronisieren Ihres lokalen Repositorys mit dem Master-Zweig des zentralen Repositorys erläutert.,
git fetch origin
Dadurch werden die heruntergeladenen Zweige angezeigt:
Die Commits dieser neuen entfernten Zweige werden im folgenden Diagramm als Quadrate anstelle von Kreisen angezeigt. Wie Sie sehen, erhalten Sie mit git fetch
Zugriff auf die gesamte Verzweigungsstruktur eines anderen Repositorys.,
Um zu sehen, welche Commits dem Upstream-Master hinzugefügt wurden, können Sie eine git log
mit origin/master als Filter ausführen:
git log --oneline master..origin/master
Um die Änderungen zu genehmigen und in Ihrem lokalen Master-Zweig zusammenzuführen, verwenden Sie die folgenden Befehle:
git checkout master
git log origin/master
Dann können wir git merge origin/master
:
git merge origin/master
Die Origin/master-und Master-Zweige zeigen jetzt auf dasselbe Commit und Sie werden mit den Upstream-Entwicklungen synchronisiert.,
Git fetch Zusammenfassung
In review git fetch
ist ein primärer Befehl zum herunterladen von Inhalt von einem remote-repository. git fetch
wird in Verbindung mit git remote
, git branch
, git checkout
und git reset
verwendet, um ein lokales Repository auf den Status einer Fernbedienung zu aktualisieren. Der Befehl git fetch
ist ein kritischer Teil kollaborativer Git-Arbeitsabläufe., git fetch
has similar behavior to git pull
, however, git fetch
can be considered a safer, nondestructive version.