Differenza tra "git checkout <filename>" e "git checkout - - <filename>"


Risposte:


214

La speciale "opzione" --significa "tratta ogni argomento dopo questo punto come un nome di file, indipendentemente da come appare". Non è specifico di Git, è una convenzione generale della riga di comando di Unix. Normalmente lo usi per chiarire che un argomento è un nome di file piuttosto che un'opzione , ad es

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

git checkout1 vuole anche --significare che gli argomenti successivi non sono il suo parametro "treeish" opzionale che specifica quale commit si desidera.

Quindi in questo contesto è sicuro da usare --sempre, ma ne hai bisogno quando il file che vuoi ripristinare ha un nome che inizia con -o è uguale al nome di un ramo. Alcuni esempi di disambiguazione di rami / file:

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"

e disambiguazione di opzioni / file:

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"

Non sono sicuro di cosa fai se hai un ramo il cui nome inizia con -. Forse non farlo in primo luogo.


1 in questa modalità; "checkout" può fare anche molte altre cose. Non ho mai capito perché git abbia scelto di implementare "scarta modifiche non salvate" come modalità del sottocomando "checkout", piuttosto che "revert" come la maggior parte degli altri VCS, o "reset" che penso potrebbe avere più senso nei termini di git.


12
git checkout <name> controlla il ramo <name>. git checkout - <name> controlla la versione index del file <name>.
Dunni

3
Grazie, sfortunatamente la documentazione di git non lo spiega davvero
Carlton

1
Per quanto riguarda la "convenzione Unix": infatti --come separatore tra opzioni e argomenti è ampiamente implementato. Funziona con qualsiasi programma / utilità che utilizza POSIX getopt(3)per gestire le sue opzioni della riga di comando, (vedi man 3 getopt), gli script della shell che lo utilizzano getopt(1)e alcuni programmi che lo implementano da soli, ma non è universalmente garantito che funzioni.
arielf

Hah! Ho semplicemente letto un esempio indietro nel tempo di come scartare le modifiche di lavoro, avendo dimenticato di vedere questa convenzione in altri programmi a riga di comando, presumendo che --significasse "negare le modifiche" alla C / C ++ - e da allora ho pensato a questo. Sbalordire!
underscore_d

Per le persone come me: non farti confondere dal nome master, significa file chiamato master e non ramo.
HarsH

7

Tutto ciò che segue --è trattato come un nome di file (non come un argomento del programma). Questo è importante se, ad esempio, hai nomi di file che iniziano con trattini.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.