Unterschied zwischen "git checkout <Dateiname>" und "git checkout - - <Dateiname>"

Antworten:

214

Die spezielle "Option" --bedeutet "Behandle jedes Argument nach diesem Punkt als Dateinamen, egal wie es aussieht." Dies ist nicht Git-spezifisch, sondern eine allgemeine Unix-Befehlszeilenkonvention. Normalerweise verwenden Sie es, um zu verdeutlichen, dass ein Argument eher ein Dateiname als eine Option ist , z

rm -f      # does nothing
rm -- -f   # deletes a file named "-f"

git checkout1 bedeutet auch --, dass nachfolgende Argumente nicht der optionale "baumartige" Parameter sind, der angibt, welches Commit Sie möchten.

In diesem Zusammenhang ist die Verwendung immer sicher-- , aber Sie benötigen sie, wenn die Datei, die Sie zurücksetzen möchten, einen Namen hat, der mit -dem Namen eines Zweigs beginnt oder mit diesem identisch ist. Einige Beispiele für die Disambiguierung von Zweigen / Dateien:

git checkout README     # would normally discard uncommitted changes
                        # to the _file_ "README"

git checkout master     # would normally switch the working copy to
                        # the _branch_ "master"

git checkout -- master  # discard uncommitted changes to the _file_ "master"

und Option / Datei Disambiguierung:

git checkout -p -- README  # interactively discard uncommitted changes
                           # to the file "README"

git checkout -- -p README  # unconditionally discard all uncommitted
                           # changes to the files "-p" and "README"

Ich bin mir nicht sicher, was Sie tun, wenn Sie eine Filiale haben, deren Name mit beginnt -. Vielleicht machen Sie das gar nicht erst.


1 in diesem Modus; "checkout" kann auch verschiedene andere Dinge tun. Ich habe nie verstanden, warum sich git dafür entschieden hat, "nicht festgeschriebene Änderungen verwerfen" als Modus des Unterbefehls "Auschecken" zu implementieren, anstatt wie die meisten anderen VCS "zurückzusetzen" oder "zurückzusetzen", was meiner Meinung nach in den eigenen Begriffen von git sinnvoller sein könnte.

zwol
quelle
12
git checkout <Name> checkt den Zweig <Name> aus. git checkout - <Name> überprüft die Indexversion der Datei <Name>.
Dunni
3
Danke, leider erklärt die Git-Dokumentation dies nicht wirklich
Carlton
1
In Bezug auf "Unix-Konvention": In der Tat ist --als Trennzeichen zwischen Optionen und Argumenten weit verbreitet. Es funktioniert für jedes Programm / Dienstprogramm, das POSIX verwendet getopt(3), um seine Befehlszeilenoptionen (siehe man 3 getopt), verwendete Shell-Skripte getopt(1)und einige Programme, die es selbst implementieren, zu verarbeiten, aber es ist nicht allgemein garantiert , dass es funktioniert.
Arielf
Hah! Ich habe vor langer Zeit einfach ein Beispiel gelesen, wie man funktionierende Änderungen verwirft, nachdem ich vergessen hatte, diese Konvention in anderen Befehlszeilenprogrammen zu sehen, angenommen habe, dass --dies "Änderungen negieren" a la C / C ++ bedeutet - und habe das seitdem gedacht. Verblüfft!
underscore_d
Für Leute wie mich: Lassen Sie sich nicht vom Namen Master verwirren, er meint Datei mit dem Namen Master und nicht den Zweig.
HarsH
7

Alles, was auf folgt, --wird als Dateiname behandelt (nicht als Programmargument). Dies ist wichtig, wenn Sie beispielsweise Dateinamen haben, die mit Bindestrichen beginnen.

jtbandes
quelle