2011-07-03 15 views

Respuesta

149

La "opción" especial -- significa "tratar cada argumento después de este punto como un nombre de archivo, sin importar cómo se vea". Esto no es específico de Git, es una convención general de línea de comandos de Unix. Normalmente lo usa para aclarar que un argumento es un nombre de archivo en lugar de una opción , p.

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

git checkout lleva también -- en el sentido de que los argumentos posteriores no son su opcional que especifica el parámetro "treeish", que desea comprometerse.

Así pues, en este contexto, es segura utilizar -- siempre, pero necesidad que cuando el archivo que desea revertir tiene un nombre que comienza con -, o es el mismo que el nombre de una rama. Algunos ejemplos de desambiguación rama/archivo:

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" 

y desambiguación opción/archivo:

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" 

no estoy seguro de lo que haces si tiene una rama cuyo nombre comienza con -. Quizás no hagas eso en primer lugar.


en este modo; "checkout" puede hacer muchas otras cosas también. Nunca entendí por qué git optó por implementar "descartar cambios no confirmados" como un modo del subcomando "pago", en lugar de "revertir" como la mayoría de los otros VCS, o "reiniciar", que creo que podría tener más sentido en los propios términos de git.

+11

git checkout revisa la sucursal . git checkout - revisa la versión de índice del archivo . – dunni

+3

Gracias, lamentablemente, la documentación de git no explica realmente esto – Carlton

+1

Con respecto a la "convención de Unix": de hecho '--' como un separador entre las opciones y los argumentos se implementa ampliamente.Funciona para cualquier programa/utilidad que utiliza POSIX 'getopt (3)' para manejar sus opciones de línea de comando, (ver 'man 3 getopt'), shell-scripts que usan' getopt (1) ', y algunos programas que lo implementan ellos mismos, pero no están universalmente garantizados para funcionar. – arielf

5

Cualquier cosa que siga al -- se trata como un nombre de archivo (no como un argumento de programa). Esto es importante si, por ejemplo, tiene nombres de archivos que comienzan con guiones.

Cuestiones relacionadas