Wie gehe ich mit dieser Git-Warnung um? "Es wird davon abgeraten, zu ziehen, ohne anzugeben, wie unterschiedliche Zweige miteinander in Einklang gebracht werden sollen."

120

Nach a git pull origin mastererhalte 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?

Davide Casiraghi
quelle
1
Reichen Sie einen Fehlerbericht ein, dass die Warnung verwirrend ist. Eine Option sollte "empfohlen" werden und die Warnung sollte nur auf Anfrage angezeigt werden und nicht nur, weil eine Versionsänderung stattgefunden hat. Viele automatische Skripte könnten jetzt mit diesem unerwarteten Verhalten kaputt gehen.
Wolfgang Fahl
1
@WolfgangFahl, die Warnung sollte keine Skripte betreffen, da das Standardverhalten bis zur expliziten Änderung beibehalten wird. Es sollte nicht dazu führen, dass der Pull einen Exit-Code ungleich Null zurückgibt (vorausgesetzt, es handelt sich um eine Warnung, nicht um einen Fehler). Einige CI / CD-Skripte, die ich auf verschiedenen Servern bereitgestellt habe, funktionieren weiterhin mit einer nicht betroffenen Erfolgsrate.
Qumber
@Qumber - danke für den Kommentar. Crontab-Einträge senden z. B. E-Mails, wenn eine Ausgabe angezeigt wird, die nicht vorhanden war oder mit einem einfachen Grep gefiltert werden konnte. Unerwartete Ausgabe kann alle Arten von Nebenwirkungen haben.
Wolfgang Fahl
@ WolfgangFahl, Jeder Zug hat normalerweise einen anderen Ausgang. Jedes Skript, das nur davon abhängt, ist wahrscheinlich schlecht geschrieben. Außerdem sollte eine Produktionsumgebung nicht ohne umfangreiche Tests aktualisiert werden. Ich ziehe es vor, das Produkt überhaupt nicht zu aktualisieren. Stattdessen erstelle ich eine neue Instanz mit den neuesten Informationen, hoste meine Apps dort, teste alles und mache dann die Produktion.
Qumber

Antworten:

135

Im Standardmodus ist Git Pull eine Abkürzung für Git Fetch, gefolgt von Git Merge FETCH_HEAD.

Wenn Sie ein tun git pull origin master,
git pullfü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

git pull --ff-only

(oder nicht? Lesen Sie weiter, um zu sehen, welche Ihren Anforderungen entspricht.)

Mit git pull --ff-onlyaktualisiert Git Ihren Zweig nur, wenn er "schnell vorgespult" werden kann, ohne neue Commits zu erstellen. Wenn dies nicht möglich ist, wird der git pull --ff-onlyVorgang einfach mit einer Fehlermeldung abgebrochen.

Sie können Ihren Git-Client so konfigurieren, dass er immer --ff-onlystandardmäßig verwendet wird, sodass Sie dieses Verhalten auch dann erhalten, wenn Sie das Befehlszeilenflag vergessen:

git config --global pull.ff only

Hinweis: Das --globalFlag 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:

Es wird davon abgeraten, zu ziehen, ohne anzugeben, wie unterschiedliche Zweige miteinander in Einklang gebracht werden sollen. Sie können diese Nachricht

unterdrücken, indem Sie einen der folgenden Befehle einige Zeit vor Ihrem nächsten Pull ausführen : git config pull.rebase false # merge (die Standardstrategie)
git config pull.rebase true # rebase
git config pull.ff only # nur schneller Vorlauf

Sie können "git config" durch "git config --global" ersetzen, um eine Standardeinstellung für alle Repositorys festzulegen. Sie können auch --rebase, --no-rebase oder --ff-only in der Befehlszeile übergeben, um den konfigurierten Standard pro Aufruf zu überschreiben.

Die Warnung enthält drei Befehle als Optionen. Alle diese Befehle unterdrücken die Warnung. Sie dienen jedoch unterschiedlichen Zwecken:

git config pull.rebase false     # merge (the default strategy)

Dies behält das Standardverhalten bei und unterdrückt die Warnung.

git config pull.rebase true      # rebase

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 ).

git config pull.ff only          # fast-forward only

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.29oder oben können Sie nun eingestellt pull.ffzu false, trueoder onlyzu der Warnung loszuwerden.

git config pull.ff

true- Dies ist das Standardverhalten. Pull wird nach Möglichkeit schnell vorgespult, andernfalls wird es zusammengeführt.

git config pull.ff false

false - Pull wird niemals vorgespult und es wird immer eine Zusammenführung erstellt.

git config pull.ff only

only - Pull wird nach Möglichkeit schnell vorgespult, andernfalls wird der Vorgang mit einer Fehlermeldung abgebrochen.

Anzahl
quelle
2
Ich schätze die Zeit und Mühe, die Sie in Ihre Antwort gesteckt haben, aber ehrlich gesagt ist dies für mich immer noch völlig unverständlich.
Jared Nedzel
1
Wie hier kommentiert , wird die Warnung nicht davon beeinflusst, ob der Zweig tatsächlich divergiert oder nicht . Die Initiale "Ihr Zweig ist wahrscheinlich divergierend." kann irreführend sein.
Joe
2
Ich muss sagen, die drei Optionen in der Nachricht haben bei mir nicht funktioniert, um die Nachricht zu unterdrücken. Die Antwort hier ( git config --global pull.ff only) hat es jedoch getan .
DiskJunky
1
Aha! Danke @Qumber. Ich hatte es bereits versucht 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 die merge.ff falseEinstellung hatte. Nachdem Sie diese Einstellung gelöscht haben, spult es schnell vor, wenn es sollte. Docs hier (fast identisch mit den Git Pull Docs)
stwr667
1
Sie haben die unten erwähnte Option Git 2.29 eingefügt, ein guter Punkt. Upvoted.
VonC
56

Dies ist eine neue Warnung, die in Git 2.27 hinzugefügt wurde :

 * "git pull" issues a warning message until the pull.rebase
   configuration variable is explicitly given, which some existing
   users may find annoying---those who prefer not to rebase need to
   set the variable to false to squelch the warning.

Um die Warnung zu entfernen, setzen Sie einen der vorgeschlagenen Werte auf Ihre bevorzugten Standardverhalten , git pullwenn Sie nicht Verhalten auf der Kommandozeile angeben (mit --ff, --no-ff, --ff-only, --rebase). gitVersuchen 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.

  git config pull.rebase false  # merge (the default strategy)

Dies ist das vorhandene Standardverhalten. Stellen Sie dies für keine Warnung und keine Verhaltensänderung ein. gitführt den Remote-Zweig in Ihren lokalen Zweig ein.

  git config pull.rebase true   # rebase

Hier gitwird 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.

  git config pull.ff only       # fast-forward only

Wenn eine Schnellvorlaufzusammenführung nicht möglich ist, gitwird der Vorgang abgelehnt. Als Unterschied zwischen git pull --rebase und git pull --ff-only Anführungszeichen:

Verweigern Sie das Zusammenführen und Beenden mit einem Status ungleich Null, es sei denn, der aktuelle HEAD ist bereits auf dem neuesten Stand oder die Zusammenführung kann als schneller Vorlauf aufgelöst werden

Joe
quelle
18
Dies ist tatsächlich die richtigste Antwort, da sie erklärt, warum Leute (wie ich) diese Warnung nach fast einem Jahrzehnt der Verwendung von Git plötzlich sehen. Es wäre jedoch nützlich, wenn einige Hinweise zu den angebotenen Optionen gegeben würden. Wenn Sie beispielsweise darauf hinweisen, dass die Einstellung von pull.ff auf "nur" nicht verhindert, dass Sie eine "pull --rebase" ausführen, um sie zu überschreiben.
kdopen
Was ist der Unterschied zwischen pull.rebase = trueund branch.autoSetupRebase = always?
Tekumara
1
@tekumara siehe stackoverflow.com/a/15935584/733345
Joe
1
"Wenn es Änderungen in Ihrer Niederlassung gibt, die jedoch nicht in der Remote-Niederlassung vorhanden sind." Dann scheint es mir, dass Git diese Warnung nur dann auslösen sollte, wenn dies der Fall ist. Wenn ich an meiner Hauptleitung ziehe (und die Hauptleitung richtig verwendet wird), sollte ich mir darüber keine Sorgen machen müssen.
Keith Tyler
4
@ Joe Ich mag deine Antwort und denke, es ist die richtige Antwort, aber du siehst das unabhängig davon, ob Git tatsächlich etwas getan hat. Ich bin der Meinung, dass der richtige Zeitpunkt für die Ausgabe dieser Warnung ist, wenn Git etwas tun muss, dann sollte diese Meldung fehlschlagen. Nicht nur Spam-Benutzer mit dieser Nachricht im Voraus. Noch eine andere Sache, die zu meiner Hassliebe zu Git beiträgt.
Jon V
6

git config pull.ff onlyoder gleichwertig git pull --ff-onlyist 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.

Sensorario
quelle
3

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 die pull.ffKonfigurationsvariable 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)

pull: nicht warnen, wenn pull.ffeingestellt wurde

Unterzeichnet von: Alex Henrie

Ein Benutzer, der genug versteht, um einzustellen, pull.ffbenötigt keine zusätzlichen Anweisungen.

VonC
quelle