Nach a git pull origin master
erhalte ich folgende Meldung:
warning: Pulling without specifying how to reconcile divergent branches is
discouraged. You can squelch this message by running one of the following
commands sometime before your next pull:
git config pull.rebase false # merge (the default strategy)
git config pull.rebase true # rebase
git config pull.ff only # fast-forward only
You can replace "git config" with "git config --global" to set a default
preference for all repositories. You can also pass --rebase, --no-rebase,
or --ff-only on the command line to override the configured default per
invocation.
remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 4 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (4/4), 51.49 KiB | 850.00 KiB/s, done.
Dann wurde das Ziehen erfolgreich durchgeführt. Trotzdem habe ich Zweifel an dieser Nachricht.
Was ist in diesem Fall das Beste?
Antworten:
Wenn Sie ein tun
git pull origin master
,git pull
führt eine Zusammenführung, die oft eine Zusammenführung verpflichten schafft. Daher ist das Ziehen von der Fernbedienung standardmäßig KEIN harmloser Vorgang: Es kann ein neues Commit-Sha erstellt werden, das zuvor nicht vorhanden war. Dieses Verhalten kann einen Benutzer verwirren, da das, was sich als harmloser Download-Vorgang anfühlt, den Festschreibungsverlauf auf unvorhersehbare Weise ändert.Um dies zu vermeiden, benötigen Sie
(oder nicht? Lesen Sie weiter, um zu sehen, welche Ihren Anforderungen entspricht.)
Mit
git pull --ff-only
aktualisiert Git Ihren Zweig nur, wenn er "schnell vorgespult" werden kann, ohne neue Commits zu erstellen. Wenn dies nicht möglich ist, wird dergit pull --ff-only
Vorgang einfach mit einer Fehlermeldung abgebrochen.Sie können Ihren Git-Client so konfigurieren, dass er immer
--ff-only
standardmäßig verwendet wird, sodass Sie dieses Verhalten auch dann erhalten, wenn Sie das Befehlszeilenflag vergessen:Hinweis: Das
--global
Flag wendet die Änderung für alle Repositorys auf Ihrem Computer an. Wenn Sie dieses Verhalten nur für das Repository wünschen, in dem Sie sich befinden, lassen Sie das Flag weg.Von hier genommen
Diese Warnung wurde in Git 2.27 hinzugefügt, wie Joe in seiner Antwort hervorhob.
So sieht die vollständige Warnung aus:
Die Warnung enthält drei Befehle als Optionen. Alle diese Befehle unterdrücken die Warnung. Sie dienen jedoch unterschiedlichen Zwecken:
Dies behält das Standardverhalten bei und unterdrückt die Warnung.
Dies wird tatsächlich über dem Remote-Zweig festgeschrieben, wobei ein einzelner Zweig sowohl lokal als auch remote verwaltet wird (im Gegensatz zum Standardverhalten, bei dem zwei verschiedene Zweige beteiligt sind - einer auf lokaler und der andere auf Remote-Zweig), und um beide zu kombinieren, wird eine Zusammenführung durchgeführt ).
Dies führt den Pull nur aus, wenn der lokale Zweig schnell vorgespult werden kann. Wenn nicht, wird es einfach mit einer Fehlermeldung abgebrochen (und es werden keine Commits erstellt).
Aktualisieren:
Wenn Sie
Git 2.29
oder oben können Sie nun eingestelltpull.ff
zufalse
,true
oderonly
zu der Warnung loszuwerden.true
- Dies ist das Standardverhalten. Pull wird nach Möglichkeit schnell vorgespult, andernfalls wird es zusammengeführt.false
- Pull wird niemals vorgespult und es wird immer eine Zusammenführung erstellt.only
- Pull wird nach Möglichkeit schnell vorgespult, andernfalls wird der Vorgang mit einer Fehlermeldung abgebrochen.quelle
git config --global pull.ff only
) hat es jedoch getan .pull.rebase false
, aber es funktionierte nicht wie beschrieben. Es wurde immer ein Merge-Commit erstellt und niemals ein schneller Vorlauf. Die Grundursache war, dass ich diemerge.ff false
Einstellung hatte. Nachdem Sie diese Einstellung gelöscht haben, spult es schnell vor, wenn es sollte. Docs hier (fast identisch mit den Git Pull Docs)Dies ist eine neue Warnung, die in Git 2.27 hinzugefügt wurde :
Um die Warnung zu entfernen, setzen Sie einen der vorgeschlagenen Werte auf Ihre bevorzugten Standardverhalten ,
git pull
wenn Sie nicht Verhalten auf der Kommandozeile angeben (mit--ff
,--no-ff
,--ff-only
,--rebase
).git
Versuchen Sie in jedem Fall, einen Schnellvorlauf ( Was ist Git-Schnellvorlauf? ) Zusammenzuführen, wenn dies möglich ist. Die Einstellungen steuern, was passiert, wenn Änderungen in Ihrer Zweigstelle vorgenommen werden, diese jedoch nicht in der Remote-Zweigstelle vorhanden sind.Dies ist das vorhandene Standardverhalten. Stellen Sie dies für keine Warnung und keine Verhaltensänderung ein.
git
führt den Remote-Zweig in Ihren lokalen Zweig ein.Hier
git
wird versucht, Ihre Änderungen über dem Remote-Zweig neu zu begründen. Siehe Wann sollte ich git pull --rebase verwenden? Weitere Informationen dazu, warum Sie das möchten.Wenn eine Schnellvorlaufzusammenführung nicht möglich ist,
git
wird der Vorgang abgelehnt. Als Unterschied zwischen git pull --rebase und git pull --ff-only Anführungszeichen:quelle
pull.rebase = true
undbranch.autoSetupRebase = always
?git config pull.ff only
oder gleichwertiggit pull --ff-only
ist die sicherste. Der Grund dafür ist, dass eine Rebase den Verlauf überschreiben und den Verlust von Commits verursachen kann, wenn ein anderer Entwickler zwangsweise auf denselben Zweig gedrückt hat.Aber alle von ihnen sind gültig.
quelle
Hinweis: Früher haben wir "
git pull
" ( man ) beigebracht, zu warnen, wenn der Benutzer nicht sagt, dass die Historien zusammengeführt, neu basiert werden müssen oder nur einen schnellen Vorlauf akzeptieren, sondern die Warnung für diejenigen ausgelöst wird, die diepull.ff
Konfigurationsvariable festgelegt haben.Dies ist bei Git 2.29 (Q4 2020) nicht mehr der Fall (dh keine Warnung mehr ).
Siehe Commit 54200ce (24. September 2020) von Alex Henrie (
alexhenrie
) .(Zusammengeführt von Junio C Hamano -
gitster
- in Commit 299deea , 29. September 2020)quelle