Git 2.21 (Q1 2019, 4+ Jahre später) wird die Fehlermeldung klären und Vorschläge machen
" git checkout frotz" ( ohne einen von mir ursprünglich vorgeschlagenen Doppelstrich ) vermeidet Mehrdeutigkeiten, indem sichergestellt wird, dass ' frotz' nicht gleichzeitig als Revision und als Pfad interpretiert werden kann .
Diese Sicherheit wurde aktualisiert, um auch einen eindeutigen Fernverfolgungszweigfrotz in einer Fernbedienung zu überprüfen , wenn beim Dimmen ein lokaler Zweig frotzaus einem Fernverfolgungszweigfrotz von einer Fernbedienung erstellt wird.
Hinweis: "dwim" (unten verwendet) ist "tun, was ich meine" , wenn ein Computersystem versucht, vorauszusehen, was Benutzer beabsichtigen, und triviale Fehler automatisch korrigiert, anstatt die expliziten, aber möglicherweise falschen Eingaben der Benutzer blind auszuführen.
Siehe Commit be4908f (13. November 2018) von Nguyễn Thái Ngọc Duy ( pclouds) .
(Zusammengeführt von Junio C Hamano - gitster- in Commit 8d7f9db , 04. Januar 2019)
checkout: eindeutige Dwim-Tracking-Zweige und lokale Dateien
Wenn Checkout-Dwim in Commit 70c9ac2 hinzugefügt wird , ist es nur auf Dwim beschränkt, wenn bestimmte Bedingungen erfüllt sind, und greift ansonsten auf das Standard-Checkout-Verhalten zurück.
Es stellt sich heraus, dass ein Zurückfallen verwirrend sein kann.
Eine der Bedingungen, um sich zu wenden
git checkout frotz
zu
git checkout -b frotz origin/frotz
ist, dass frotznicht als Datei existieren darf.
Aber wenn der Benutzer erwartet, dass " git checkout frotz" der Zweig erstellt wird " frotz" und es zufällig eine Datei mit dem Namen " frotz" gibt, hilft es nicht, dass der Inhalt der Datei " " stillschweigend zurückgesetzt frotzwird .
Dies wird in der Git-Mailingliste gemeldet und an anderer Stelle sogar als Beispiel für "Git ist schlecht" verwendet .
Wir versuchen normalerweise, das Richtige zu tun, aber wenn es mehrere "richtige Dinge" zu tun gibt, ist es am besten, es dem Benutzer zu überlassen, zu entscheiden.
Überprüfen Sie diesen Fall und bitten Sie den Benutzer, Folgendes zu unterscheiden:
- "
git checkout -- foo" wird den Pfad "foo" auschecken
- "
git checkout foo --" wird dwim und Zweig erstellen " foo" 6
Für Benutzer, die dwim nicht möchten, verwenden Sie --no-guess. In diesem speziellen Fall ist es nutzlos, weil " git checkout --no-guess foo --" einfach fehlschlägt.
Aber es könnte von Skripten verwendet werden.
Die Manpagegit checkout enthält vorerst:
--no-guess:
Versuchen Sie nicht, einen Zweig zu erstellen, wenn ein gleichnamiger Remote-Tracking-Zweig vorhanden ist.
Vor Git 2.26 (Q1 2020) ist " git checkout X" nicht korrekt fehlgeschlagen, wenn Xes sich nicht um einen lokalen Zweig handelt, sondern es konnten mehrere Remote-Tracking-Zweige benannt werden (dh als Ausgangspunkt für die Erstellung eines entsprechenden lokalen Zweigs gedimmt werden) korrigiert.
Siehe Commit fa74180 , Commit 2957709 (30. Dezember 2019) von Alexandr Miloslavskiy ( SyntevoAlex) .
(Zusammengeführt von Junio C Hamano - gitster- in Commit d0e70cd , 05. Februar 2020)
checkout: Datei in mehrdeutigen Tracking-Zweigen nicht zurücksetzen
Unterzeichnet von: Alexandr Miloslavskiy
Zum besseren Verständnis sind hier die vorhandenen guten Szenarien aufgeführt:
- Haben Sie keine Datei '
foo', keine lokale Verzweigung ' foo' und eine einzelne entfernte Verzweigung ' foo' 2. git checkout fooerstellt eine lokale Verzweigung foo, siehe Commit 70c9ac2 oben , hier beschrieben .
und
- Haben Sie eine Datei '
foo', keine lokale Verzweigung ' foo' und eine einzelne Remote-Verzweigung ' foo' 2. git checkout foowird sich beschweren, siehe Commit be4908f oben
Dieser Patch verhindert das folgende Szenario:
- Haben Sie eine Datei '
foo', keine lokale Verzweigung ' foo' und mehrere entfernte Verzweigungen ' foo' 2. git checkout foowird erfolgreich ... Inhalt der Datei zurücksetzen foo!
Das heißt, das Hinzufügen einer weiteren Fernbedienung ändert plötzlich das Verhalten erheblich. Dies ist bestenfalls eine Überraschung und kann im schlimmsten Fall vom Benutzer unbemerkt bleiben.
Siehe Commit be4908f oben , das einige reale Beschwerden enthält.
Nach meinem Verständnis hat Fix in Commit be4908f oben ( hier besprochen ) den Fall mehrerer Fernbedienungen übersehen, und das gesamte Verhalten des Zurücksetzens auf das Zurücksetzen von Dateien war nie beabsichtigt:
- Commit 70c9ac2 oben führt das unerwartete Verhalten ein.
Zuvor gab es einen Fallback von Not-a-Ref zu Pathspec. Dies ist ein vernünftiger Fallback.
Danach gibt es einen weiteren Fallback von Ambiguous-Remote zu Pathspec.
Ich verstehe, dass es ein Versehen mit Kopieren und Einfügen war.
- Commit be4908f oben fügt hinzu,
die()wenn zwischen Zweig und Datei Mehrdeutigkeiten bestehen.
Der Fall mehrerer Tracking-Zweige wird anscheinend übersehen.
Das neue Verhalten: Wenn es keinen lokalen Zweig und mehrere Remote-Kandidaten gibt, die()versuchen Sie einfach nicht, die Datei zurückzusetzen, ob sie vorhanden ist (verhindert Überraschungen) oder nicht (verbessert die Fehlermeldung) .
Mit Git 2.30 (Q1 2021) lernte " git checkout" ( man ) , die checkout.guessKonfigurationsvariable zu verwenden und die --[no-]guessOption " " entsprechend zu aktivieren / deaktivieren .
Siehe Commit 64f1f58 (07. Oktober 2020) und Commit ef09e7d (06. Oktober 2020) von Denton Liu ( Denton-L) .
(Zusammengeführt von Junio C Hamano - gitster- in Commit 0e41cfa , 27. Oktober 2020)
checkout: lernen zu respektieren checkout.guess
Unterzeichnet von: Denton Liu
Das aktuelle Verhalten von git checkout/switchist das, --guessdas derzeit standardmäßig aktiviert ist.
Einige Benutzer möchten jedoch möglicherweise nicht, dass dies automatisch geschieht.
Anstatt Benutzer zu zwingen, --no-guessjedes Mal manuell anzugeben , bringen Sie diesen Befehlen die checkout.guessKonfigurationsvariable bei, mit der Benutzer ein Standardverhalten festlegen können.
Bringen Sie dem Abschlussskript bei, die neue Konfigurationsvariable zu erkennen und die DWIM- Logik zu deaktivieren, wenn sie auf false gesetzt ist.
git configenthält jetzt in seiner Manpage :
checkout.guess
Gibt den Standardwert für die
Option --guessoder --no-guessin git checkoutund an git switch. Siehe
git switchund git checkout.
git checkoutenthält jetzt in seiner Manpage :
--guessist das Standardverhalten. Verwenden Sie --no-guessdiese Option, um es zu deaktivieren.
Das Standardverhalten kann über die checkout.guessKonfigurationsvariable eingestellt werden.
git switchenthält jetzt in seiner Manpage :
Das Standardverhalten kann über die checkout.guessKonfigurationsvariable eingestellt werden.