Einrichtung und Konfiguration
Projekte holen und erstellen
Grundlegende Snapshots
Branching und Merging
Projekte teilen und aktualisieren
Inspektion und Vergleich
Patching
Debugging
Externe Systeme
Server-Administration
Anleitungen
- gitattributes
- Konventionen der Kommandozeile
- Tägliches Git
- Häufig gestellte Fragen (FAQ)
- Glossar
- Hooks
- gitignore
- gitmodules
- Revisionen
- Submodule
- Tutorial
- Workflows
- Alle Anleitungen...
Administration
Plumbing-Befehle
-
2.52.0
2025-11-17
- 2.51.2 keine Änderungen
-
2.51.1
2025-10-15
-
2.51.0
2025-08-18
- 2.50.1 keine Änderungen
-
2.50.0
2025-06-16
- 2.49.1 keine Änderungen
-
2.49.0
2025-03-14
- 2.48.1 → 2.48.2 keine Änderungen
-
2.48.0
2025-01-10
- 2.47.2 → 2.47.3 keine Änderungen
-
2.47.1
2024-11-25
- 2.46.3 → 2.47.0 keine Änderungen
-
2.46.2
2024-09-23
- 2.45.1 → 2.46.1 keine Änderungen
-
2.45.0
2024-04-29
- 2.44.1 → 2.44.4 keine Änderungen
-
2.44.0
2024-02-23
- 2.43.2 → 2.43.7 keine Änderungen
-
2.43.1
2024-02-09
-
2.43.0
2023-11-20
- 2.42.1 → 2.42.4 keine Änderungen
-
2.42.0
2023-08-21
- 2.41.1 → 2.41.3 keine Änderungen
-
2.41.0
2023-06-01
- 2.40.1 → 2.40.4 keine Änderungen
-
2.40.0
2023-03-12
- 2.36.1 → 2.39.5 keine Änderungen
-
2.36.0
2022-04-18
- 2.35.1 → 2.35.8 keine Änderungen
-
2.35.0
2022-01-24
- 2.34.1 → 2.34.8 keine Änderungen
-
2.34.0
2021-11-15
- 2.33.2 → 2.33.8 keine Änderungen
-
2.33.1
2021-10-12
-
2.33.0
2021-08-16
- 2.32.1 → 2.32.7 keine Änderungen
-
2.32.0
2021-06-06
- 2.31.1 → 2.31.8 keine Änderungen
-
2.31.0
2021-03-15
- 2.30.1 → 2.30.9 keine Änderungen
-
2.30.0
2020-12-27
- 2.29.1 → 2.29.3 keine Änderungen
-
2.29.0
2020-10-19
- 2.27.1 → 2.28.1 keine Änderungen
-
2.27.0
2020-06-01
- 2.25.2 → 2.26.3 keine Änderungen
-
2.25.1
2020-02-17
-
2.25.0
2020-01-13
- 2.24.1 → 2.24.4 keine Änderungen
-
2.24.0
2019-11-04
- 2.23.1 → 2.23.4 keine Änderungen
-
2.23.0
2019-08-16
- 2.22.2 → 2.22.5 keine Änderungen
-
2.22.1
2019-08-11
-
2.22.0
2019-06-07
- 2.20.1 → 2.21.4 keine Änderungen
-
2.20.0
2018-12-09
- 2.19.1 → 2.19.6 keine Änderungen
-
2.19.0
2018-09-10
- 2.18.1 → 2.18.5 keine Änderungen
-
2.18.0
2018-06-21
- 2.17.1 → 2.17.6 keine Änderungen
-
2.17.0
2018-04-02
-
2.16.6
2019-12-06
-
2.15.4
2019-12-06
-
2.14.6
2019-12-06
-
2.13.7
2018-05-22
- 2.12.5 keine Änderungen
-
2.11.4
2017-09-22
- 2.10.5 keine Änderungen
-
2.9.5
2017-07-30
-
2.8.6
2017-07-30
-
2.7.6
2017-07-30
-
2.6.7
2017-05-05
- 2.5.6 keine Änderungen
-
2.4.12
2017-05-05
-
2.3.10
2015-09-28
- 2.2.3 keine Änderungen
-
2.1.4
2014-12-17
-
2.0.5
2014-12-17
BESCHREIBUNG
Integrieren Sie Änderungen aus einem Remote-Repository in den aktuellen Branch.
Zuerst führt git pull git fetch mit denselben Argumenten (ohne Merge-Optionen) aus, um Remote-Branches zu holen. Dann entscheidet es, welcher Remote-Branch integriert werden soll: Wenn Sie git pull ohne Argumente ausführen, wird standardmäßig der Upstream des aktuellen Branches verwendet. Dann integriert es diesen Branch in den aktuellen Branch.
Es gibt 4 Hauptoptionen für die Integration des Remote-Branches
-
gitpull--ff-onlyführt nur "fast-forward"-Updates durch: es schlägt fehl, wenn sich Ihr lokaler Branch vom Remote-Branch abweicht. Dies ist die Standardeinstellung. -
gitpull--rebaseführtgitrebaseaus -
gitpull--no-rebaseführtgitmergeaus. -
gitpull--squashführtgitmerge--squashaus
Sie können auch die Konfigurationsoptionen pull.rebase, pull.squash oder pull.ff mit Ihrem bevorzugten Verhalten einstellen.
Wenn es während des Merges oder Rebase zu einem Merge-Konflikt kommt, den Sie nicht handhaben möchten, können Sie diesen sicher mit git merge --abort oder git --rebase abort abbrechen.
OPTIONEN
- <repository>
-
Das "Remote"-Repository, von dem geholt werden soll. Dies kann entweder eine URL sein (siehe Abschnitt GIT URLS unten) oder der Name eines Remotes (siehe Abschnitt REMOTES unten).
Standardmäßig der konfigurierte Upstream für den aktuellen Branch oder
origin. Weitere Informationen zur Konfiguration von Upstreams finden Sie unter UPSTREAM BRANCHES. - <refspec>
-
Welchen Branch oder welche Referenzen sollen geholt und in den aktuellen Branch integriert werden, z. B.
mainingitpulloriginmain. Standardmäßig der konfigurierte Upstream für den aktuellen Branch.Dies kann ein Branch, ein Tag oder eine andere Sammlung von Referenzen sein. Die vollständige Syntax finden Sie unter <refspec> unten unter "Optionen im Zusammenhang mit dem Holen" und wie
gitpulldieses Argument zur Bestimmung des zu integrierenden Remote-Branches verwendet, finden Sie unter STANDARDVERHALTEN. - -q
- --quiet
-
Dies wird sowohl an das zugrundeliegende git-fetch übergeben, um die Berichterstattung während der Übertragung zu unterdrücken, als auch an das zugrundeliegende git-merge, um die Ausgabe während des Merges zu unterdrücken.
- -v
- --verbose
-
Übergeben Sie --verbose an git-fetch und git-merge.
- --recurse-submodules[=(yes|on-demand|no)]
- --no-recurse-submodules
-
Diese Option steuert, ob neue Commits von populierten Submodulen geholt werden sollen und ob auch die Arbeitskopien aktiver Submodule aktualisiert werden sollen (siehe git-fetch[1], git-config[1] und gitmodules[5]).
Wenn der Checkout per Rebase erfolgt, werden auch lokale Submodul-Commits neu angeordnet.
Wenn das Update per Merge erfolgt, werden die Submodul-Konflikte aufgelöst und ausgecheckt.
Optionen im Zusammenhang mit dem Mergen
--commit--no-commit-
Führen Sie den Merge durch und committen Sie das Ergebnis. Diese Option kann verwendet werden, um
--no-commitzu überschreiben. Nur nützlich beim Mergen.Mit
--no-commitführen Sie den Merge durch und stoppen kurz vor dem Erstellen eines Merge-Commits, um dem Benutzer die Möglichkeit zu geben, das Merge-Ergebnis zu überprüfen und weiter zu bearbeiten, bevor er committet.Beachten Sie, dass Fast-Forward-Updates keinen Merge-Commit erstellen und daher keine Möglichkeit besteht, diese Merges mit
--no-commitzu stoppen. Wenn Sie also sicherstellen möchten, dass Ihr Branch durch den Merge-Befehl nicht verändert oder aktualisiert wird, verwenden Sie--no-ffmit--no-commit. --edit-e--no-edit-
Rufen Sie einen Editor auf, bevor ein erfolgreicher mechanischer Merge committet wird, um die automatisch generierte Merge-Nachricht weiter zu bearbeiten, damit der Benutzer den Merge erklären und rechtfertigen kann. Die Option
--no-editkann verwendet werden, um die automatisch generierte Nachricht zu akzeptieren (dies wird generell nicht empfohlen).Ältere Skripte können vom historischen Verhalten abhängen, das dem Benutzer nicht erlaubt, die Merge-Log-Nachricht zu bearbeiten. Sie werden sehen, dass ein Editor geöffnet wird, wenn sie
gitmergeausführen. Um die Anpassung solcher Skripte an das aktualisierte Verhalten zu erleichtern, kann die UmgebungsvariableGIT_MERGE_AUTOEDITzu Beginn aufnogesetzt werden. --cleanup=<mode>-
Diese Option bestimmt, wie die Merge-Nachricht vor dem Committen bereinigt wird. Weitere Details finden Sie unter git-commit[1]. Wenn der <mode> den Wert
scissorserhält, werden Scheren anMERGE_MSGangehängt, bevor sie im Falle eines Merge-Konflikts an die Commit-Maschinerie weitergeleitet werden. --ff-only-
Aktualisieren Sie die neue Historie nur, wenn keine abweichende lokale Historie vorhanden ist. Dies ist die Standardeinstellung, wenn keine Methode zur Auflösung abweichender Historien angegeben wird (über die --rebase=* Flags).
--ff--no-ff-
Beim Mergen anstelle von Rebasen wird angegeben, wie ein Merge behandelt wird, wenn die eingehende Historie bereits ein Nachkomme der aktuellen Historie ist. Wenn Mergen angefordert wird, ist
--ffdie Standardeinstellung, es sei denn, es wird ein annotierter (und möglicherweise signierter) Tag gemergt, der sich nicht an seinem natürlichen Ort in derrefs/tags/Hierarchie befindet. In diesem Fall wird--no-ffangenommen.Mit
--ffwird, wenn möglich, der Merge als Fast-Forward aufgelöst (nur der Branch-Zeiger wird angepasst, um dem gemergten Branch zu entsprechen; es wird kein Merge-Commit erstellt). Wenn dies nicht möglich ist (wenn die eingehende Historie kein Nachkomme der aktuellen Historie ist), wird ein Merge-Commit erstellt.Mit
--no-ffwird in allen Fällen ein Merge-Commit erstellt, auch wenn der Merge stattdessen als Fast-Forward aufgelöst werden könnte. -S[<key-id>]--gpg-sign[=<key-id>]--no-gpg-sign-
Signieren Sie den resultierenden Merge-Commit mit GPG. Das Argument <key-id> ist optional und hat standardmäßig die Kommentator-Identität; wenn es angegeben wird, muss es ohne Leerzeichen am Optionsnamen angehängt werden.
--no-gpg-signist nützlich, um sowohl die Konfigurationsvariablecommit.gpgSignals auch ein früheres--gpg-signzu überschreiben. --log[=<n>]--no-log-
Fügen Sie zusätzlich zu den Branch-Namen Einzeilen-Beschreibungen von höchstens <n> tatsächlich gemergten Commits in die Log-Nachricht ein. Siehe auch git-fmt-merge-msg[1]. Nur nützlich beim Mergen.
Mit
--no-logwerden keine Einzeilen-Beschreibungen der tatsächlich gemergten Commits aufgeführt. --signoff--no-signoff-
Fügt einen
Signed-off-by-Trailer vom Committer am Ende der Commit-Log-Nachricht hinzu. Die Bedeutung eines Sign-offs hängt vom Projekt ab, an das Sie committen. Es kann beispielsweise bestätigen, dass der Committer die Rechte hat, die Arbeit unter der Lizenz des Projekts einzureichen, oder einer bestimmten Beitragsstellervereinbarung zustimmt, wie z. B. einem Developer Certificate of Origin. (Siehe https://developercertificate.org für das von den Linux-Kernel- und Git-Projekten verwendete.) Konsultieren Sie die Dokumentation oder die Führung des Projekts, zu dem Sie beitragen, um zu verstehen, wie die Sign-offs in diesem Projekt verwendet werden.Die Option
--no-signoffkann verwendet werden, um eine frühere Option--signoffauf der Kommandozeile zu widerrufen. --stat-n--no-stat-
Zeigen Sie am Ende des Merges eine Diff-Statistik an. Die Diff-Statistik wird auch durch die Konfigurationsoption merge.stat gesteuert.
Mit
-noder--no-statwird am Ende des Merges keine Diff-Statistik angezeigt. --compact-summary-
Zeigen Sie am Ende des Merges eine kompakte Zusammenfassung an.
--squash--no-squash-
Erzeugt den Arbeitsbaum und den Index-Zustand, als ob ein echter Merge stattgefunden hätte (außer der Merge-Informationen), committet aber nicht tatsächlich, verschiebt
HEADnicht und zeichnet$GIT_DIR/MERGE_HEADnicht auf (um zu bewirken, dass der nächstegitcommitBefehl einen Merge-Commit erstellt). Dies ermöglicht es Ihnen, einen einzelnen Commit auf dem aktuellen Branch zu erstellen, dessen Auswirkung dieselbe ist wie das Mergen eines anderen Branches (oder mehr im Falle eines Oktopus).Mit
--no-squashwird der Merge durchgeführt und das Ergebnis committet. Diese Option kann verwendet werden, um--squashzu überschreiben.Mit
--squashist--commitnicht erlaubt und führt zu einem Fehler.Nur nützlich beim Mergen.
--verify--no-verify-
Standardmäßig werden die Pre-Merge- und Commit-Msg-Hooks ausgeführt. Wenn
--no-verifyangegeben wird, werden diese umgangen. Siehe auch githooks[5]. Nur nützlich beim Mergen. -s<strategy>--strategy=<strategy>-
Verwenden Sie die angegebene Merge-Strategie; kann mehrmals angegeben werden, um sie in der Reihenfolge anzugeben, in der sie versucht werden sollen. Wenn keine
-sOption angegeben ist, wird stattdessen eine vordefinierte Liste von Strategien verwendet (ortbeim Mergen eines einzelnen Heads,octopusandernfalls). -X<option>--strategy-option=<option>-
Übergeben Sie strategie-spezifische Optionen an die Merge-Strategie.
--verify-signatures--no-verify-signatures-
Überprüfen Sie, ob der Tip-Commit des zu mergenden Seiten-Branches mit einem gültigen Schlüssel signiert ist, d.h. einem Schlüssel mit einer gültigen UID: im Standard-Vertrauensmodell wurde der Signierschlüssel von einem vertrauenswürdigen Schlüssel signiert. Wenn der Tip-Commit des Seiten-Branches nicht mit einem gültigen Schlüssel signiert ist, wird der Merge abgebrochen.
Nur nützlich beim Mergen.
--summary--no-summary-
Synonyme für
--statund--no-stat; diese sind veraltet und werden in Zukunft entfernt. --autostash--no-autostash-
Erzeugt automatisch einen temporären Stash-Eintrag, bevor die Operation beginnt, speichert ihn in der Referenz
MERGE_AUTOSTASHund wendet ihn nach Abschluss der Operation an. Das bedeutet, dass Sie die Operation auf einem unsauberen Arbeitsbaum ausführen können. Seien Sie jedoch vorsichtig: die abschließende Anwendung des Stashes nach einem erfolgreichen Merge kann zu nicht-trivialen Konflikten führen. -
Standardmäßig lehnt der Befehl
gitmergedas Mergen von Historien ab, die keinen gemeinsamen Vorfahren teilen. Diese Option kann verwendet werden, um diese Sicherheitsmaßnahme beim Mergen von Historien zweier Projekte zu umgehen, die ihr Leben unabhängig voneinander begonnen haben. Da dies ein sehr seltener Fall ist, existiert keine Konfigurationsvariable, um dies standardmäßig zu aktivieren, und wird auch keine hinzugefügt.Nur nützlich beim Mergen.
- -r
- --rebase[=(false|true|merges|interactive)]
-
Wenn true, wird der aktuelle Branch nach dem Holen auf den Upstream-Branch neu angeordnet. Wenn es einen Remote-Tracking-Branch gibt, der dem Upstream-Branch entspricht, und der Upstream-Branch seit dem letzten Holen neu angeordnet wurde, verwendet die Neuordnung diese Informationen, um die Neuordnung nicht-lokaler Änderungen zu vermeiden.
Wenn auf
mergesgesetzt, erfolgt die Neuordnung mitgitrebase--rebase-merges, sodass die lokalen Merge-Commits in die Neuordnung einbezogen werden (siehe git-rebase[1] für Details).Wenn false, wird der Upstream-Branch in den aktuellen Branch gemergt.
Wenn
interactive, wird der interaktive Modus von Rebase aktiviert.Siehe
pull.rebase,branch.<name>.rebaseundbranch.autoSetupRebasein git-config[1], wenn Sie möchten, dassgitpullimmer--rebaseanstelle von Mergen verwendet.HinweisDies ist ein potenziell *gefährlicher* Betriebsmodus. Er schreibt die Historie neu, was nicht gut ist, wenn Sie diese Historie bereits veröffentlicht haben. Verwenden Sie diese Option *nicht*, es sei denn, Sie haben git-rebase[1] sorgfältig gelesen. - --no-rebase
-
Dies ist eine Kurzform für --rebase=false.
Optionen im Zusammenhang mit dem Holen
- --all
- --no-all
-
Holen Sie alle Remotes, außer denen, bei denen die Konfigurationsvariable
remote.<name>.skipFetchAllgesetzt ist. Dies überschreibt die Konfigurationsvariablefetch.all. - -a
- --append
-
Hängen Sie Referenznamen und Objekt-Namen der geholten Referenzen an den vorhandenen Inhalt von
.git/FETCH_HEADan. Ohne diese Option werden alte Daten in.git/FETCH_HEADüberschrieben. - --atomic
-
Verwenden Sie eine atomare Transaktion, um lokale Referenzen zu aktualisieren. Entweder werden alle Referenzen aktualisiert oder im Fehlerfall werden keine Referenzen aktualisiert.
- --depth=<depth>
-
Begrenzen Sie das Holen auf die angegebene Anzahl von Commits von der Spitze jedes Remote-Branches. Wenn in ein *flaches* Repository geholt wird, das mit der Option
gitclone--depth=<depth> erstellt wurde (siehe git-clone[1]), vertiefen oder verkürzen Sie die Historie auf die angegebene Anzahl von Commits. Tags für die vertieften Commits werden nicht geholt. - --deepen=<depth>
-
Ähnlich wie --depth, gibt jedoch die Anzahl der Commits von der aktuellen flachen Grenze anstelle von der Spitze jedes Remote-Branches an.
- --shallow-since=<date>
-
Vertieft oder verkürzt die Historie eines flachen Repositorys, um alle erreichbaren Commits nach <datum> einzuschließen.
- --shallow-exclude=<ref>
-
Vertieft oder verkürzt die Historie eines flachen Repositorys, um Commits auszuschließen, die von einem angegebenen Remote-Branch oder Tag erreichbar sind. Diese Option kann mehrfach angegeben werden.
- --unshallow
-
Wenn das Quell-Repository vollständig ist, konvertieren Sie ein flaches Repository in ein vollständiges und entfernen Sie alle Einschränkungen, die von flachen Repositories auferlegt werden.
Wenn das Quell-Repository flach ist, holen Sie so viel wie möglich, sodass das aktuelle Repository dieselbe Historie wie das Quell-Repository hat.
- --update-shallow
-
Standardmäßig weigert sich
gitfetchbeim Holen aus einem flachen Repository, Referenzen zu holen, die eine Aktualisierung von .git/shallow erfordern. Diese Option aktualisiert .git/shallow und akzeptiert solche Referenzen. - --negotiation-tip=<commit|glob>
-
Standardmäßig berichtet Git dem Server Commits, die von allen lokalen Referenzen erreichbar sind, um gemeinsame Commits zu finden und so die Größe des zu empfangenden Packfiles zu reduzieren. Wenn angegeben, berichtet Git nur von den Commits, die von den angegebenen Spitzen erreichbar sind. Dies ist nützlich, um Fetches zu beschleunigen, wenn der Benutzer weiß, welche lokale Referenz wahrscheinlich gemeinsame Commits mit der geholten Upstream-Referenz hat.
Diese Option kann mehrfach angegeben werden; in diesem Fall berichtet Git von den Commits, die von einem der angegebenen Commits erreichbar sind.
Das Argument dieser Option kann ein Glob für Referenznamen, eine Referenz oder die (möglicherweise abgekürzte) SHA-1 eines Commits sein. Die Angabe eines Globs entspricht der mehrfachen Angabe dieser Option, eine für jeden übereinstimmenden Referenznamen.
Siehe auch die Konfigurationsvariablen
fetch.negotiationAlgorithmundpush.negotiate, die in git-config[1] dokumentiert sind, sowie die Option--negotiate-onlyunten. - --negotiate-only
-
Holen Sie nichts vom Server und drucken Sie stattdessen die Vorfahren der angegebenen
--negotiation-tip=*Argumente aus, die wir mit dem Server gemeinsam haben.Dies ist inkompatibel mit
--recurse-submodules=[yes|on-demand]. Intern wird dies zur Implementierung der Optionpush.negotiateverwendet. Siehe git-config[1]. - --dry-run
-
Zeigen Sie, was getan würde, ohne Änderungen vorzunehmen.
- --porcelain
-
Druckt die Ausgabe zur Standardausgabe in einem leicht zu parsende Format für Skripte. Details finden Sie im Abschnitt OUTPUT in git-fetch[1].
Dies ist inkompatibel mit
--recurse-submodules=[yes|on-demand] und hat Vorrang vor der Konfigurationsoptionfetch.output. - -f
- --force
-
Wenn git fetch mit der <src>
:<dst> Refspec verwendet wird, kann es die Aktualisierung des lokalen Branches verweigern, wie im Teil <refspec> der Dokumentation von git-fetch[1] erläutert. Diese Option überschreibt diese Prüfung. - -k
- --keep
-
Heruntergeladenes Pack behalten.
- --prefetch
-
Ändert die konfigurierte Refspec, um alle Referenzen im Namensraum
refs/prefetch/zu platzieren. Siehe die Aufgabeprefetchin git-maintenance[1]. - -p
- --prune
-
Vor dem Holen entfernen Sie alle Remote-Tracking-Referenzen, die nicht mehr im Remote vorhanden sind. Tags unterliegen keinem Pruning, wenn sie nur wegen des standardmäßigen Tag-Autofollowings oder wegen einer --tags-Option geholt werden. Wenn Tags jedoch wegen einer expliziten Refspec geholt werden (entweder auf der Kommandozeile oder in der Remote-Konfiguration, z. B. wenn das Remote mit der Option --mirror geklont wurde), unterliegen sie ebenfalls dem Pruning. Die Angabe von
--prune-tagsist eine Kurzform für die Angabe der Tag-Refspec. - --no-tags
-
Standardmäßig werden Tags, die auf Objekte zeigen, die aus dem Remote-Repository heruntergeladen werden, geholt und lokal gespeichert. Diese Option deaktiviert dieses automatische Tag-Following. Das Standardverhalten für ein Remote kann mit der Einstellung remote.<name>.tagOpt festgelegt werden. Siehe git-config[1].
- --refmap=<refspec>
-
Beim Holen von auf der Kommandozeile aufgeführten Referenzen wird die angegebene Refspec (kann mehrfach angegeben werden) verwendet, um die Referenzen auf Remote-Tracking-Branches abzubilden, anstatt der Werte der Konfigurationsvariablen
remote.*.fetchfür das Remote-Repository. Die Angabe einer leeren <refspec> für die Option--refmapbewirkt, dass Git die konfigurierten Refspecs ignoriert und sich vollständig auf die als Befehlszeilenargumente übergebenen Refspecs verlässt. Siehe den Abschnitt "Configured Remote-tracking Branches" für Details. - -t
- --tags
-
Holen Sie alle Tags vom Remote (d.h. holen Sie Remote-Tags
refs/tags/*in lokale Tags mit demselben Namen), zusätzlich zu allem anderen, was sonst geholt würde. Die alleinige Verwendung dieser Option unterliegt keinem Pruning, auch wenn --prune verwendet wird (obwohl Tags trotzdem beschnitten werden können, wenn sie auch das Ziel einer expliziten Refspec sind; siehe--prune). - -j
- --jobs=<n>
-
Anzahl der parallelen Kindprozesse, die für alle Formen des Holens verwendet werden.
Wenn die Option
--multipleangegeben wurde, werden die verschiedenen Remotes parallel geholt. Wenn mehrere Submodule geholt werden, werden sie parallel geholt. Um sie unabhängig voneinander zu steuern, verwenden Sie die Konfigurationseinstellungenfetch.parallelundsubmodule.fetchJobs(siehe git-config[1]).Typischerweise sind parallele rekursive und Multi-Remote-Fetches schneller. Standardmäßig werden Fetches sequentiell und nicht parallel durchgeführt.
- --set-upstream
-
Wenn das Remote erfolgreich geholt wurde, fügen Sie eine Upstream- (Tracking-) Referenz hinzu, die von git-pull[1] ohne Argumente und anderen Befehlen verwendet wird. Weitere Informationen finden Sie unter
branch.<name>.mergeundbranch.<name>.remotein git-config[1]. - --upload-pack <upload-pack>
-
Wenn angegeben und das zu holende Repository von git fetch-pack behandelt wird, wird
--exec=<upload-pack> an den Befehl übergeben, um einen nicht standardmäßigen Pfad für den auf der Gegenseite ausgeführten Befehl anzugeben. - --progress
-
Der Fortschrittsstatus wird standardmäßig auf dem Standardfehlerausgabestrom berichtet, wenn dieser an ein Terminal angeschlossen ist, es sei denn, -q wird angegeben. Diese Flag erzwingt die Anzeige des Fortschrittsstatus, auch wenn der Standardfehlerausgabestrom nicht an ein Terminal weitergeleitet wird.
- -o <option>
- --server-option=<option>
-
Übermittelt die angegebene Zeichenfolge an den Server, wenn über Protokollversion 2 kommuniziert wird. Die angegebene Zeichenfolge darf keine NUL- oder LF-Zeichen enthalten. Die Handhabung von Server-Optionen durch den Server, einschließlich unbekannter, ist serverspezifisch. Wenn mehrere
--server-option=<option> angegeben werden, werden sie alle in der auf der Kommandozeile angegebenen Reihenfolge an die Gegenseite gesendet. Wenn keine--server-option=<option> von der Kommandozeile angegeben wird, werden stattdessen die Werte der Konfigurationsvariablenremote.<name>.serverOptionverwendet. - --show-forced-updates
-
Standardmäßig prüft git, ob ein Branch während des Holens zwangsaktualisiert wird. Dies kann durch fetch.showForcedUpdates deaktiviert werden, aber die Option --show-forced-updates garantiert, dass diese Prüfung durchgeführt wird. Siehe git-config[1].
- --no-show-forced-updates
-
Standardmäßig prüft git, ob ein Branch während des Holens zwangsaktualisiert wird. Geben Sie --no-show-forced-updates an oder setzen Sie fetch.showForcedUpdates auf false, um diese Prüfung aus Leistungsgründen zu überspringen. Wenn sie während eines git-pull verwendet wird, prüft die Option --ff-only trotzdem auf Zwangsaktualisierungen, bevor ein Fast-Forward-Update versucht wird. Siehe git-config[1].
- -4
- --ipv4
-
Nur IPv4-Adressen verwenden, IPv6-Adressen ignorieren.
- -6
- --ipv6
-
Nur IPv6-Adressen verwenden, IPv4-Adressen ignorieren.
- <repository>
-
Das "Remote"-Repository, das die Quelle einer Fetch- oder Pull-Operation ist. Dieser Parameter kann entweder eine URL sein (siehe Abschnitt GIT URLS unten) oder der Name eines Remotes (siehe Abschnitt REMOTES unten).
- <refspec>
-
Gibt an, welche Referenzen geholt werden sollen und welche lokalen Referenzen aktualisiert werden sollen. Wenn keine <refspec>s in der Kommandozeile erscheinen, werden die zu holenden Referenzen stattdessen aus den
remote.<repository>.fetchVariablen gelesen (siehe den Abschnitt "KONFIGURIERTE REMOTE-TRACKING-BRANCHES" in git-fetch[1]).Das Format eines <refspec> Parameters ist ein optionales Pluszeichen
+, gefolgt von der Quelle <src>, gefolgt von einem Doppelpunkt:, gefolgt vom Ziel <dst>. Der Doppelpunkt kann weggelassen werden, wenn <dst> leer ist. <src> ist typischerweise eine Referenz, oder ein Glob-Muster mit einem einzelnen*, das zur Übereinstimmung mit einer Menge von Referenzen verwendet wird, aber es kann auch ein vollständig ausgeschriebener Hex-Objektname sein.Ein <refspec> kann ein
*in seinem <src> enthalten, um eine einfache Mustererkennung anzuzeigen. Ein solcher Refspec funktioniert wie ein Glob, der jeden Ref mit dem Muster abgleicht. Ein Muster-Refspec <refspec> muss genau ein*sowohl im <src> als auch im <dst> haben. Er wird Refs zum Ziel abbilden, indem er das*durch den aus der Quelle übereinstimmenden Inhalt ersetzt.Wenn ein Refspec mit einem
^-Präfix versehen ist, wird er als negativer Refspec interpretiert. Anstatt anzugeben, welche Refs abgerufen oder welche lokalen Refs aktualisiert werden sollen, gibt ein solcher Refspec stattdessen auszusendende Refs an. Ein Ref gilt als übereinstimmend, wenn er mit mindestens einem positiven Refspec übereinstimmt und mit keinem negativen Refspec übereinstimmt. Negative Refspecs können nützlich sein, um den Geltungsbereich eines Muster-Refspecs einzuschränken, sodass er keine bestimmten Refs einschließt. Negative Refspecs können selbst Muster-Refspecs sein. Sie dürfen jedoch nur ein <src> enthalten und kein <dst> angeben. Vollständig ausgeschriebene Hex-Objektnamen werden ebenfalls nicht unterstützt.tag<tag> bedeutet dasselbe wierefs/tags/<tag>:refs/tags/<tag>; es fordert das Abrufen von allem bis zum angegebenen Tag an.Der Remote-Ref, der mit <src> übereinstimmt, wird abgerufen, und wenn <dst> keine leere Zeichenkette ist, wird versucht, den lokalen Ref, der damit übereinstimmt, zu aktualisieren.
Ob diese Aktualisierung ohne
--forceerlaubt ist, hängt vom Ref-Namespace ab, zu dem abgerufen wird, von der Art des abgerufenen Objekts und davon, ob die Aktualisierung als Fast-Forward betrachtet wird. Im Allgemeinen gelten für das Abrufen die gleichen Regeln wie beim Pushen; siehe den Abschnitt <refspec>... von git-push[1] für deren Details. Ausnahmen von diesen Regeln, die speziell für *git fetch* gelten, werden unten aufgeführt.Bis Git Version 2.20 und im Gegensatz zum Pushen mit git-push[1] wurden alle Aktualisierungen von
refs/tags/*ohne+im Refspec (oder--force) akzeptiert. Beim Abrufen betrachteten wir promiscuous alle Tag-Aktualisierungen von einem Remote als erzwungene Abrufe. Seit Git Version 2.20 funktioniert das Abrufen zur Aktualisierung vonrefs/tags/*genauso wie beim Pushen. D.h. alle Aktualisierungen werden ohne+im Refspec (oder--force) abgelehnt.Im Gegensatz zum Pushen mit git-push[1] werden alle Aktualisierungen außerhalb von
refs/{tags,heads}/*ohne+im Refspec (oder--force) akzeptiert, sei es der Austausch z.B. eines Tree-Objekts gegen ein Blob, oder eines Commits gegen einen anderen Commit, der den vorherigen Commit nicht als Vorfahren hat usw.Im Gegensatz zum Pushen mit git-push[1] gibt es keine Konfiguration, die diese Regeln ändert, und nichts Vergleichbares zu einem
pre-fetch-Hook analog zumpre-receive-Hook.Wie beim Pushen mit git-push[1] können alle oben beschriebenen Regeln für nicht erlaubte Aktualisierungen durch Hinzufügen eines optionalen führenden
+zu einem Refspec (oder durch Verwendung der Kommandozeilenoption--force) überschrieben werden. Die einzige Ausnahme ist, dass kein Zwang dierefs/heads/*-Namensraum dazu bringt, ein Nicht-Commit-Objekt zu akzeptieren.HinweisWenn der Remote-Branch, den Sie abrufen möchten, bekanntermaßen regelmäßig zurückgesetzt und neu basisiert wird, wird erwartet, dass seine neue Spitze kein Nachfahre seiner vorherigen Spitze ist (wie in Ihrem Remote-Tracking-Branch beim letzten Abruf gespeichert). Sie möchten das +-Zeichen verwenden, um anzuzeigen, dass für solche Branches Nicht-Fast-Forward-Aktualisierungen erforderlich sind. Es gibt keine Möglichkeit zu bestimmen oder zu deklarieren, dass ein Branch mit diesem Verhalten in einem Repository verfügbar gemacht wird; der ziehende Benutzer muss einfach wissen, dass dies das erwartete Nutzungsmuster für einen Branch ist.HinweisEs gibt einen Unterschied zwischen dem Auflisten mehrerer <refspec> direkt auf der Kommandozeile von *git pull* und dem Vorhandensein mehrerer remote.<repository>.fetch-Einträge in Ihrer Konfiguration für ein <repository> und dem Ausführen eines *git pull*-Befehls ohne explizite <refspec>-Parameter. Explizit auf der Kommandozeile aufgeführte <refspec>s werden immer in den aktuellen Branch zusammengeführt, nachdem abgerufen wurde. Mit anderen Worten, wenn Sie mehr als einen Remote-Ref auflisten, erstellt *git pull* einen Octopus-Merge. Wenn Sie hingegen keinen expliziten <refspec>-Parameter auf der Kommandozeile angeben, ruft *git pull* alle <refspec>s ab, die es in der Konfigurationremote.<repository>.fetchfindet, und führt nur den ersten gefundenen <refspec> in den aktuellen Branch zusammen. Dies liegt daran, dass das Erstellen eines Octopus aus Remote-Refs selten vorkommt, während das Verfolgen mehrerer Remote-Heads auf einmal durch Abrufen von mehr als einem oft nützlich ist.
GIT URLS
Im Allgemeinen enthalten URLs Informationen über das Transportprotokoll, die Adresse des Remote-Servers und den Pfad zum Repository. Abhängig vom Transportprotokoll können einige dieser Informationen fehlen.
Git unterstützt ssh, git, http und https Protokolle (zusätzlich können ftp und ftps zum Abrufen verwendet werden, aber das ist ineffizient und veraltet; verwenden Sie sie nicht).
Der native Transport (d.h. git:// URL) führt keine Authentifizierung durch und sollte mit Vorsicht in ungesicherten Netzwerken verwendet werden.
Die folgenden Syntaxe können damit verwendet werden
-
ssh://[<user>@]<host>[:<port>]/<pfad-zum-git-repo> -
git://<host>[:<port>]/<pfad-zum-git-repo> -
http[s]://<host>[:<port>]/<pfad-zum-git-repo> -
ftp[s]://<host>[:<port>]/<pfad-zum-git-repo>
Eine alternative scp-ähnliche Syntax kann auch mit dem ssh-Protokoll verwendet werden
-
[<user>
@]<host>:/<pfad-zum-git-repo>
Diese Syntax wird nur erkannt, wenn keine Schrägstriche vor dem ersten Doppelpunkt stehen. Dies hilft, einen lokalen Pfad, der einen Doppelpunkt enthält, zu unterscheiden. Zum Beispiel kann der lokale Pfad foo:bar als absoluter Pfad oder ./foo:bar angegeben werden, um eine Fehlinterpretation als ssh-URL zu vermeiden.
Die Protokolle ssh und git unterstützen zusätzlich die Erweiterung von ~<username>
-
ssh://[<user>@]<host>[:<port>]/~<user>/<pfad-zum-git-repo> -
git://<host>[:<port>]/~<user>/<pfad-zum-git-repo> -
[<user>
@]<host>:~<user>/<pfad-zum-git-repo>
Für lokale Repositories, die ebenfalls nativ von Git unterstützt werden, können die folgenden Syntaxe verwendet werden
-
/pfad/zu/repo.git/ -
file:///pfad/zu/repo.git/
Diese beiden Syntaxe sind weitgehend äquivalent, außer beim Klonen, wenn die erste die Option --local impliziert. Siehe git-clone[1] für Details.
git clone, git fetch und git pull, aber nicht git push, akzeptieren auch eine geeignete Bundle-Datei. Siehe git-bundle[1].
Wenn Git ein bestimmtes Transportprotokoll nicht handhaben kann, versucht es, den Remote-Helfer remote-<transport> zu verwenden, falls einer existiert. Um explizit einen Remote-Helfer anzufordern, kann die folgende Syntax verwendet werden
-
<transport>
::<adresse>
wobei <adresse> ein Pfad, ein Server und Pfad oder eine beliebige URL-ähnliche Zeichenkette sein kann, die vom spezifischen aufgerufenen Remote-Helfer erkannt wird. Siehe gitremote-helpers[7] für Details.
Wenn es eine große Anzahl ähnlich benannter Remote-Repositories gibt und Sie ein anderes Format dafür verwenden möchten (so dass die von Ihnen verwendeten URLs in URLs umgeschrieben werden, die funktionieren), können Sie einen Konfigurationsabschnitt der Form erstellen
[url "<actual-url-base>"] insteadOf = <other-url-base>
Zum Beispiel, mit diesem
[url "git://git.host.xz/"] insteadOf = host.xz:/path/to/ insteadOf = work:
eine URL wie "work:repo.git" oder "host.xz:/path/to/repo.git" wird in jedem Kontext, der eine URL entgegennimmt, zu "git://git.host.xz/repo.git" umgeschrieben.
Wenn Sie URLs nur für Push-Operationen umschreiben möchten, können Sie einen Konfigurationsabschnitt der Form erstellen
[url "<actual-url-base>"] pushInsteadOf = <other-url-base>
Zum Beispiel, mit diesem
[url "ssh://example.org/"] pushInsteadOf = git://example.org/
eine URL wie "git://example.org/path/to/repo.git" wird für Push-Operationen zu "ssh://example.org/path/to/repo.git" umgeschrieben, aber Pull-Operationen verwenden weiterhin die ursprüngliche URL.
REMOTES
Der Name eines der folgenden kann anstelle einer URL als Argument repository verwendet werden
-
ein Remote in der Git-Konfigurationsdatei:
$GIT_DIR/config, -
eine Datei im Verzeichnis
$GIT_DIR/remotesoder -
eine Datei im Verzeichnis
$GIT_DIR/branches.
All dies erlaubt Ihnen auch, die Refspec von der Kommandozeile wegzulassen, da jede dieser Dateien eine Refspec enthält, die Git standardmäßig verwendet.
Benannter Remote in der Konfigurationsdatei
Sie können den Namen eines Remotes angeben, den Sie zuvor mit git-remote[1], git-config[1] oder durch manuelle Bearbeitung der Datei $GIT_DIR/config konfiguriert haben. Die URL dieses Remotes wird verwendet, um auf das Repository zuzugreifen. Die Refspec dieses Remotes wird standardmäßig verwendet, wenn Sie keine Refspec auf der Kommandozeile angeben. Der Eintrag in der Konfigurationsdatei würde wie folgt aussehen:
[remote "<name>"] url = <URL> pushurl = <pushurl> push = <refspec> fetch = <refspec>
Die <pushurl> wird nur für Pushes verwendet. Sie ist optional und standardmäßig <URL>. Das Pushen zu einem Remote betrifft alle definierten Push-URLs oder alle definierten URLs, wenn keine Push-URLs definiert sind. Fetch hingegen holt nur von der ersten definierten URL, wenn mehrere URLs definiert sind.
Benannte Datei in $GIT_DIR/remotes
Sie können den Namen einer Datei in $GIT_DIR/remotes angeben. Die URL in dieser Datei wird verwendet, um auf das Repository zuzugreifen. Die Refspec in dieser Datei wird als Standard verwendet, wenn Sie keine Refspec auf der Kommandozeile angeben. Diese Datei sollte folgendes Format haben:
URL: one of the above URL formats Push: <refspec> Pull: <refspec>
Push: Zeilen werden von git push verwendet und Pull: Zeilen werden von git pull und git fetch verwendet. Mehrere Push: und Pull: Zeilen können für zusätzliche Branch-Mappings angegeben werden.
Benannte Datei in $GIT_DIR/branches
Sie können den Namen einer Datei in $GIT_DIR/branches angeben. Die URL in dieser Datei wird verwendet, um auf das Repository zuzugreifen. Diese Datei sollte folgendes Format haben:
<URL>#<head>
<URL> ist erforderlich; #<head> ist optional.
Abhängig vom Vorgang verwendet Git eine der folgenden Refspecs, wenn Sie keine auf der Kommandozeile angeben. <branch> ist der Name dieser Datei in $GIT_DIR/branches und <head> standardmäßig master.
git fetch verwendet
refs/heads/<head>:refs/heads/<branch>
git push verwendet
HEAD:refs/heads/<head>
UPSTREAM BRANCHES
Branches in Git können optional einen Upstream-Remote-Branch haben. Git verwendet standardmäßig den Upstream-Branch für Remote-Operationen, z. B.
-
Dies ist der Standard für
gitpullodergitfetchohne Argumente. -
Dies ist der Standard für
gitpushohne Argumente, mit einigen Ausnahmen. Sie können zum Beispiel die Optionbranch.<name>.pushRemoteverwenden, um zu einem anderen Remote zu pushen, als von dem Sie ziehen, und standardmäßig mitpush.default=simplemuss der von Ihnen konfigurierte Upstream-Branch denselben Namen haben. -
Verschiedene Befehle, einschließlich
gitcheckoutundgitstatus, zeigen Ihnen, wie viele Commits zu Ihrem aktuellen Branch und zum Upstream hinzugefügt wurden, seitdem Sie ihn verzweigt haben, z. B. "Your branch and origin/main have diverged, and have 2 and 3 different commits each respectively".
Der Upstream wird in .git/config in den Feldern "remote" und "merge" gespeichert. Wenn zum Beispiel main's Upstream origin/main ist
[branch "main"] remote = origin merge = refs/heads/main
Sie können einen Upstream-Branch explizit mit git push --set-upstream <remote> <branch> festlegen, aber Git legt den Upstream oft automatisch für Sie fest, zum Beispiel
-
Wenn Sie ein Repository klonen, setzt Git den Upstream für den Standard-Branch automatisch.
-
Wenn die Konfigurationsoption
push.autoSetupRemotegesetzt ist, setztgitpushden Upstream automatisch beim ersten Push eines Branches. -
Das Auschecken eines Remote-Tracking-Branches mit
gitcheckout<branch> erstellt automatisch einen lokalen Branch mit diesem Namen und setzt den Upstream auf den Remote-Branch.
|
Hinweis
|
Upstream-Branches werden manchmal als "Tracking-Informationen" bezeichnet, wie in "set the branch’s tracking information". |
MERGE-STRATEGIEN
Der Merge-Mechanismus (git merge und git pull Befehle) erlaubt die Auswahl der Backend-Merge-Strategien mit der Option -s. Einige Strategien können auch ihre eigenen Optionen haben, die durch Angabe von -X<option>-Argumenten an git merge und/oder git pull übergeben werden können.
ort-
Dies ist die Standard-Merge-Strategie beim Ziehen oder Zusammenführen eines Branches. Diese Strategie kann nur zwei Heads mit einem 3-Wege-Merge-Algorithmus auflösen. Wenn es mehr als einen gemeinsamen Vorfahren gibt, der für einen 3-Wege-Merge verwendet werden kann, erstellt sie einen zusammengeführten Baum der gemeinsamen Vorfahren und verwendet diesen als Referenzbaum für den 3-Wege-Merge. Dies führt Berichten zufolge zu weniger Merge-Konflikten, ohne Fehlmerges zu verursachen, wie Tests mit tatsächlichen Merge-Commits aus der Linux 2.6 Kernel-Entwicklungshistorie zeigen. Zusätzlich kann diese Strategie das Erkennen und Behandeln von Merges mit Umbenennungen. Sie nutzt keine erkannten Kopien. Der Name für diesen Algorithmus ist ein Akronym ("Ostensibly Recursive’s Twin") und entstand aus der Tatsache, dass er als Ersatz für den vorherigen Standardalgorithmus,
recursive, geschrieben wurde.In Fällen, in denen der Pfad ein Submodul ist, wenn der auf einer Seite des Merges verwendete Submodul-Commit ein Nachfahre des auf der anderen Seite des Merges verwendeten Submodul-Commits ist, versucht Git, zum Nachfahren zu wechseln. Andernfalls behandelt Git diesen Fall als Konflikt und schlägt als Auflösung einen Submodul-Commit vor, der ein Nachfahre der konfligierenden ist, falls einer existiert.
Die
ort-Strategie kann die folgenden Optionen annehmenours-
Diese Option erzwingt die automatische Auflösung von konfligierenden Hunks, indem sie die Version von *unserer* Seite bevorzugt. Änderungen vom anderen Baum, die nicht mit unserer Seite kollidieren, werden im Merge-Ergebnis berücksichtigt. Bei einer Binärdatei werden die gesamten Inhalte von unserer Seite übernommen.
Dies sollte nicht mit der
ours-Merge-Strategie verwechselt werden, die nicht einmal den anderen Baum betrachtet. Sie verwirft alles, was der andere Baum enthält, und erklärt, dass *unser* Verlauf alles enthält, was darin passiert ist. theirs-
Dies ist das Gegenteil von
ours; beachte, dass es im Gegensatz zuourskeinetheirs-Merge-Strategie gibt, mit der man diese Merge-Option verwechseln könnte. ignore-space-changeignore-all-spaceignore-space-at-eolignore-cr-at-eol-
Behandelt Zeilen mit der angegebenen Art von Leerzeichenänderung als unverändert für den Zweck eines Drei-Wege-Merges. Leerzeichenänderungen, die mit anderen Änderungen an einer Zeile vermischt sind, werden nicht ignoriert. Siehe auch git-diff[1]
-b,-w,--ignore-space-at-eolund--ignore-cr-at-eol.-
Wenn die *ihre* Version nur Leerzeichenänderungen an einer Zeile einführt, wird *unsere* Version verwendet;
-
Wenn *unsere* Version Leerzeichenänderungen einführt, aber *ihre* Version eine wesentliche Änderung enthält, wird *ihre* Version verwendet;
-
Andernfalls wird der Merge wie gewohnt fortgesetzt.
-
renormalize-
Führt einen virtuellen Checkout und Check-in aller drei Stufen jeder Datei durch, die einen Drei-Wege-Merge benötigt. Diese Option ist für das Mergen von Branches mit unterschiedlichen Clean-Filtern oder End-of-Line-Normalisierungsregeln gedacht. Siehe "Merging branches with differing checkin/checkout attributes" in gitattributes[5] für Details.
no-renormalize-
Deaktiviert die Option
renormalize. Dies überschreibt die Konfigurationsvariablemerge.renormalize. find-renames[=<n>]-
Schaltet die Erkennung von Umbenennungen ein und setzt optional den Ähnlichkeitsschwellenwert. Dies ist die Standardeinstellung. Dies überschreibt die Konfigurationsvariable
merge.renames. Siehe auch git-diff[1]--find-renames. rename-threshold=<n>-
Veraltetes Synonym für
find-renames=<n>. no-renames-
Schaltet die Erkennung von Umbenennungen aus. Dies überschreibt die Konfigurationsvariable
merge.renames. Siehe auch git-diff[1]--no-renames. histogram-
Veraltetes Synonym für
diff-algorithm=histogram. patience-
Veraltetes Synonym für
diff-algorithm=patience. diff-algorithm=(histogram|minimal|myers|patience)-
Verwendet einen anderen Diff-Algorithmus beim Mergen, der helfen kann, Fehlmerges zu vermeiden, die aufgrund unwichtiger übereinstimmender Zeilen (wie Klammern aus unterschiedlichen Funktionen) auftreten. Siehe auch git-diff[1]
--diff-algorithm. Beachten Sie, dassortstandardmäßigdiff-algorithm=histogramverwendet, während normale Diffs derzeit standardmäßig auf die Konfigurationseinstellungdiff.algorithmzurückgreifen. subtree[=<path>]-
Diese Option ist eine fortgeschrittenere Form der Subtree-Strategie, bei der die Strategie eine Vermutung darüber anstellt, wie zwei Bäume verschoben werden müssen, um zueinander zu passen, wenn sie gemerged werden. Stattdessen wird der angegebene Pfad vorangestellt (oder vom Anfang entfernt), um die Form zweier Bäume anzupassen.
recursive-
Dies ist jetzt ein Synonym für
ort. Es war bis v2.49.0 eine alternative Implementierung, wurde aber in v2.50.0 aufortumgeleitet. Die frühere rekursive Strategie war die Standardstrategie zum Auflösen von zwei Heads von Git v0.99.9k bis v2.33.0. resolve-
Dies kann nur zwei Heads (d.h. den aktuellen Branch und einen anderen von Ihnen gezogenen Branch) mittels eines 3-Wege-Merge-Algorithmus auflösen. Es versucht, Kreuz-Merge-Mehrdeutigkeiten sorgfältig zu erkennen. Es behandelt keine Umbenennungen.
octopus-
Dies löst Fälle mit mehr als zwei Heads auf, weigert sich aber, einen komplexen Merge durchzuführen, der eine manuelle Auflösung erfordert. Er ist hauptsächlich dazu gedacht, Topic-Branch-Heads zu bündeln. Dies ist die Standard-Merge-Strategie beim Ziehen oder Zusammenführen von mehr als einem Branch.
ours-
Dies löst eine beliebige Anzahl von Heads auf, aber der resultierende Baum des Merges ist immer der des aktuellen Branch-Heads, wobei alle Änderungen von allen anderen Branches effektiv ignoriert werden. Er ist dazu gedacht, die alte Entwicklungsgeschichte von Seiten-Branches zu ersetzen. Beachten Sie, dass dies sich von der Option
-Xourszurort-Merge-Strategie unterscheidet. subtree-
Dies ist eine modifizierte
ort-Strategie. Beim Mergen der Bäume A und B wird, wenn B einem Subtree von A entspricht, B zuerst angepasst, um die Baumstruktur von A abzugleichen, anstatt die Bäume auf derselben Ebene zu lesen. Diese Anpassung wird auch auf den gemeinsamen Vorfahren-Baum angewendet.
Mit den Strategien, die 3-Wege-Merges verwenden (einschließlich der Standardstrategie ort), wird eine Änderung, die auf beiden Branches vorgenommen wurde, aber später auf einem der Branches rückgängig gemacht wurde, im zusammengeführten Ergebnis vorhanden sein; einige Leute finden dieses Verhalten verwirrend. Es tritt auf, weil nur die Heads und die Merge-Basis für die Durchführung eines Merges berücksichtigt werden, nicht die einzelnen Commits. Der Merge-Algorithmus betrachtet daher die rückgängig gemachte Änderung als keine Änderung und ersetzt sie stattdessen durch die geänderte Version.
STANDARDVERHALTEN
Oft verwenden Leute git pull ohne Angabe von Parametern. Traditionell entsprach dies der Angabe von git pull origin. Wenn jedoch die Konfiguration branch.<name>.remote vorhanden ist, während man sich auf dem Branch <name> befindet, wird dieser Wert anstelle von origin verwendet.
Um zu ermitteln, von welcher URL abgerufen werden soll, wird der Wert der Konfiguration remote.<origin>.url konsultiert, und wenn keine solche Variable vorhanden ist, wird der Wert in der Zeile URL: in $GIT_DIR/remotes/<origin> verwendet.
Um zu ermitteln, welche Remote-Branches abgerufen (und optional in den Remote-Tracking-Branches gespeichert) werden sollen, wenn der Befehl ohne Refspec-Parameter auf der Kommandozeile ausgeführt wird, werden die Werte der Konfigurationsvariablen remote.<origin>.fetch konsultiert, und wenn keine vorhanden sind, wird $GIT_DIR/remotes/<origin> konsultiert und seine Pull:-Zeilen verwendet. Zusätzlich zu den im OPTIONS-Abschnitt beschriebenen Refspec-Formaten können Sie einen globbing-Refspec haben, der wie folgt aussieht:
refs/heads/*:refs/remotes/origin/*
Ein globbing-Refspec muss eine nicht-leere RHS haben (d.h. er muss speichern, was in Remote-Tracking-Branches abgerufen wurde), und seine LHS und RHS müssen mit /* enden. Das Obige gibt an, dass alle Remote-Branches unter der Hierarchie refs/remotes/origin/ mit demselben Namen über Remote-Tracking-Branches verfolgt werden.
Die Regel zur Bestimmung, welcher Remote-Branch nach dem Abrufen zusammengeführt wird, ist etwas kompliziert, um die Abwärtskompatibilität nicht zu beeinträchtigen.
Wenn explizite Refspecs auf der Kommandozeile von git pull angegeben wurden, werden alle zusammengeführt.
Wenn auf der Kommandozeile kein Refspec angegeben wurde, verwendet git pull den Refspec aus der Konfiguration oder $GIT_DIR/remotes/<origin>. In solchen Fällen gelten folgende Regeln:
-
Wenn die Konfiguration
branch.<name>.mergefür den aktuellen Branch <name> existiert, ist dies der Name des Branches auf der Remote-Seite, der zusammengeführt wird. -
Wenn der Refspec ein globbing-Refspec ist, wird nichts zusammengeführt.
-
Andernfalls wird der Remote-Branch des ersten Refspec zusammengeführt.
BEISPIELE
-
Aktualisieren Sie die Remote-Tracking-Branches für das Repository, von dem Sie geklont haben, und führen Sie dann einen davon in Ihren aktuellen Branch zusammen.
$ git pull $ git pull origin
Normalerweise ist der zusammengeführte Branch der HEAD des Remote-Repositorys, aber die Wahl wird durch die Optionen branch.<name>.remote und branch.<name>.merge bestimmt; siehe git-config[1] für Details.
-
Führen Sie den Remote-Branch
nextin den aktuellen Branch zusammen.$ git pull origin next
Dies hinterlässt eine Kopie von
nexttemporär in FETCH_HEAD und aktualisiert den Remote-Tracking-Branchorigin/next. Dasselbe kann durch Aufrufen von fetch und merge erreicht werden.$ git fetch origin $ git merge origin/next
Wenn Sie einen Pull versucht haben, der zu komplexen Konflikten geführt hat und Sie von vorne beginnen möchten, können Sie mit *git reset* wiederherstellen.
SICHERHEIT
Die Fetch- und Push-Protokolle sind nicht darauf ausgelegt, zu verhindern, dass eine Seite Daten von einem anderen Repository stiehlt, die nicht zum Teilen bestimmt waren. Wenn Sie private Daten haben, die Sie vor einem böswilligen Peer schützen müssen, ist Ihre beste Option, sie in einem anderen Repository zu speichern. Dies gilt sowohl für Clients als auch für Server. Insbesondere Namensräume auf einem Server sind für die Lesezugriffskontrolle nicht effektiv; Sie sollten einem Namensraum nur Lesezugriff gewähren, wenn Sie einem Client vertrauen würden, der Lesezugriff auf das gesamte Repository hat.
Die bekannten Angriffsvektoren sind wie folgt:
-
Das Opfer sendet "have"-Zeilen, die die IDs von Objekten ankündigen, die es besitzt und die nicht explizit zum Teilen bestimmt sind, aber zur Optimierung der Übertragung verwendet werden können, wenn der Peer sie ebenfalls hat. Der Angreifer wählt ein Objekt-ID X zum Stehlen aus und sendet eine Ref auf X, muss aber nicht den Inhalt von X senden, da das Opfer es bereits hat. Nun glaubt das Opfer, dass der Angreifer X hat, und es sendet den Inhalt von X später zurück an den Angreifer. (Dieser Angriff ist für einen Client am einfachsten auf einen Server durchzuführen, indem eine Ref auf X in dem Namensraum erstellt wird, auf den der Client Zugriff hat, und diese dann geholt wird. Der wahrscheinlichste Weg für einen Server, dies auf einem Client durchzuführen, ist, X in einen öffentlichen Branch zu "mergen" und zu hoffen, dass der Benutzer zusätzliche Arbeit an diesem Branch leistet und ihn an den Server zurückpusht, ohne den Merge zu bemerken.)
-
Wie in #1 wählt der Angreifer eine Objekt-ID X zum Stehlen aus. Das Opfer sendet ein Objekt Y, das der Angreifer bereits hat, und der Angreifer behauptet fälschlicherweise, X und nicht Y zu haben, so dass das Opfer Y als Delta gegen X sendet. Das Delta enthüllt dem Angreifer Regionen von X, die Y ähnlich sind.
BUGS
Die Verwendung von --recurse-submodules kann derzeit nur neue Commits in bereits ausgecheckten Submodulen abrufen. Wenn z. B. der Upstream ein neues Submodul in den gerade abgerufenen Commits des Superprojekts hinzugefügt hat, kann das Submodul selbst nicht abgerufen werden, was es unmöglich macht, dieses Submodul später auszuchecken, ohne erneut abrufen zu müssen. Dies wird voraussichtlich in einer zukünftigen Git-Version behoben.
GIT
Teil der git[1] Suite