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 frotz
aus 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 frotz
nicht 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 frotz
wird .
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 X
es 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 foo
erstellt 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 foo
wird 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 foo
wird 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.guess
Konfigurationsvariable zu verwenden und die --[no-]guess
Option " " 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/switch
ist das, --guess
das derzeit standardmäßig aktiviert ist.
Einige Benutzer möchten jedoch möglicherweise nicht, dass dies automatisch geschieht.
Anstatt Benutzer zu zwingen, --no-guess
jedes Mal manuell anzugeben , bringen Sie diesen Befehlen die checkout.guess
Konfigurationsvariable 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 config
enthält jetzt in seiner Manpage :
checkout.guess
Gibt den Standardwert für die
Option --guess
oder --no-guess
in git checkout
und an git switch
. Siehe
git switch
und git checkout
.
git checkout
enthält jetzt in seiner Manpage :
--guess
ist das Standardverhalten. Verwenden Sie --no-guess
diese Option, um es zu deaktivieren.
Das Standardverhalten kann über die checkout.guess
Konfigurationsvariable eingestellt werden.
git switch
enthält jetzt in seiner Manpage :
Das Standardverhalten kann über die checkout.guess
Konfigurationsvariable eingestellt werden.