In einfachen Worten, wenn Sie in ein Flugzeug ohne Internetverbindung steigen wollten ... bevor Sie abfliegen, könnten Sie es einfach tun git fetch origin <master>
. Es würde alle Änderungen in Ihren Computer abrufen, ihn jedoch von Ihrem lokalen Entwicklungs- / Arbeitsbereich trennen.
Im Flugzeug können Sie Änderungen an Ihrem lokalen Arbeitsbereich vornehmen und ihn dann mit dem, was Sie abgerufen haben, zusammenführen und potenzielle Zusammenführungskonflikte ohne Verbindung zum Internet lösen. Und wenn nicht jemand neue widersprüchliche Änderungen am Remote-Repository vorgenommen hat, können Sie git push origin <branch>
Ihren Kaffee holen, sobald Sie am Ziel angekommen sind .
Aus diesem fantastischen Atlassian-Tutorial :
Der git fetch
Befehl lädt Commits, Dateien und Refs von einem Remote-Repository in Ihr lokales Repository herunter.
Abrufen ist das, was Sie tun, wenn Sie sehen möchten, woran alle anderen gearbeitet haben. Es ähnelt dem SVN-Update darin, dass Sie sehen können, wie sich der zentrale Verlauf entwickelt hat, Sie jedoch nicht gezwungen werden, die Änderungen tatsächlich in Ihrem Repository zusammenzuführen. Git isoliert abgerufene Inhalte von vorhandenen lokalen Inhalten . Dies hat
keinerlei Auswirkungen auf Ihre lokale Entwicklungsarbeit . Abgerufene Inhalte müssen mit dem git checkout
Befehl explizit ausgecheckt werden . Auf diese Weise können Sie Commits sicher abrufen, bevor Sie sie in Ihr lokales Repository integrieren.
Wenn Inhalte von einem Remote - Repository Herunterladen git pull
und git fetch
Befehlen zur Verfügung , die Aufgabe zu erfüllen. Sie können git fetch
die "sichere" Version der beiden Befehle in Betracht ziehen
. Der Remote-Inhalt wird heruntergeladen, der Arbeitsstatus Ihres lokalen Repositorys wird jedoch nicht aktualisiert, sodass Ihre aktuelle Arbeit erhalten bleibt. git pull
Ist die aggressivere Alternative, wird der Remote-Inhalt für den aktiven lokalen Zweig heruntergeladen und sofort ausgeführt git merge
, um ein Zusammenführungs-Commit für den neuen Remote-Inhalt zu erstellen. Wenn Änderungen anstehen, führt dies zu Konflikten und startet den Ablauf der Zusammenführungskonfliktlösung.
Mit git pull
:
- Sie bekommen keine Isolation.
- Es wirkt sich auf Ihre lokale Entwicklung aus.
- Es muss nicht explizit ausgecheckt werden. Weil es implizit a
git merge
.
- Es ist im Grunde NICHT sicher. Es ist aggressiv.
- Anders als dort,
git fetch
wo es nur Ihre betrifft .git/refs/remotes
, wirkt sich Git Pull sowohl auf Ihre als auch auf Ihre aus.git/refs/remotes
.git/refs/heads/
Hmmm ... also wenn ich die Arbeitskopie nicht aktualisiere git fetch
, wo nehme ich dann Änderungen vor? Wo speichert Git Fetch die neuen Commits?
Gute Frage. Es platziert es irgendwo isoliert von Ihrer Arbeitskopie. Aber wieder wo? Lass es uns herausfinden.
Führen Sie in Ihrem Projektverzeichnis (dh wo Sie Ihre git
Befehle ausführen) Folgendes aus:
ls
. Dies zeigt die Dateien und Verzeichnisse. Nichts cooles, ich weiß.
Jetzt tu es ls -a
. Daraufhin werden Punktdateien angezeigt , dh Dateien, die mit beginnen. .
Anschließend wird ein Verzeichnis mit dem Namen angezeigt : .git
.
- Tu es
cd .git
. Dies wird offensichtlich Ihr Verzeichnis ändern.
- Jetzt kommt der lustige Teil; tun
ls
. Sie sehen eine Liste der Verzeichnisse. Wir suchen refs
. Tu es cd refs
.
- Es ist interessant zu sehen, was sich in allen Verzeichnissen befindet, aber konzentrieren wir uns auf zwei davon.
heads
und remotes
. Verwenden Sie cd
, um auch in ihnen zu überprüfen.
- Alles
git fetch
, was Sie tun, aktualisiert die Elemente im /.git/refs/remotes
Verzeichnis. Es wird nichts im /.git/refs/heads
Verzeichnis aktualisiert .
- Jeder
git pull
wird zuerst die git fetch
Elemente im /.git/refs/remotes
Verzeichnis aktualisieren , dann mit Ihrem lokalen Verzeichnis zusammenführen und dann den Kopf im /.git/refs/heads
Verzeichnis ändern .
Eine sehr gute Antwort finden Sie auch unter Wo platziert sich 'git fetch'? .
Suchen Sie auch im Beitrag zu den Namenskonventionen für Git-Zweige nach "Schrägstrichnotation" . Es hilft Ihnen besser zu verstehen, wie Git Dinge in verschiedenen Verzeichnissen platziert.
Um den tatsächlichen Unterschied zu sehen
Mach einfach:
git fetch origin master
git checkout master
Wenn der Remote-Master aktualisiert wurde, wird folgende Meldung angezeigt:
Your branch is behind 'origin/master' by 2 commits, and can be fast-forwarded.
(use "git pull" to update your local branch)
Wenn Sie dies nicht fetch
getan git checkout master
hätten, würde Ihr lokaler Git nicht wissen, dass 2 Commits hinzugefügt wurden. Und es würde nur sagen:
Already on 'master'
Your branch is up to date with 'origin/master'.
Aber das ist veraltet und falsch. Das liegt daran, dass Git Ihnen Feedback nur basierend auf dem gibt, was es weiß. Es ist nicht bekannt, dass neue Commits noch nicht abgeschlossen wurden ...
Gibt es eine Möglichkeit, die neuen Änderungen zu sehen, die in Remote vorgenommen wurden, während lokal an der Zweigstelle gearbeitet wurde?
Einige IDEs (z. B. Xcode) sind sehr intelligent und verwenden das Ergebnis von a git fetch
und können die Codezeilen mit Anmerkungen versehen, die im Remote-Zweig Ihres aktuellen Arbeitszweigs geändert wurden. Wenn diese Zeile sowohl durch lokale Änderungen als auch durch Remote-Verzweigung geändert wurde, wird diese Zeile mit Rot versehen. Dies ist kein Zusammenführungskonflikt. Es ist ein potenzieller Zusammenführungskonflikt. Es ist ein Headsup, mit dem Sie den zukünftigen Zusammenführungskonflikt lösen können, bevor Sie ihn git pull
vom Remote-Zweig aus ausführen.
Spaß Tipp:
Wenn Sie einen Remote-Zweig abgerufen haben, z. B.:
git fetch origin feature/123
Dann würde dies in Ihr Fernbedienungsverzeichnis gehen. Es ist immer noch nicht in Ihrem lokalen Verzeichnis verfügbar. Es vereinfacht jedoch das Auschecken zu diesem Remote-Zweig durch DWIM (Tun Sie, was ich meine):
git checkout feature/123
Sie müssen nicht mehr tun:
git checkout -b feature/123 origin/feature/123
Mehr dazu hier