git reset vs git reset CABEZA
git-reset unstage (3)
La primera vez, antes de cualquier commit, el HEAD no existe, entonces obtenemos:
$git reset HEAD stagedFile fatal: ambiguous argument ''HEAD'': unknown revision or path not in the working tree
Cada vez que se organiza un archivo, Git ofrece instrucciones útiles en caso de que necesite quitar la etapa de un archivo:
(use "git reset HEAD <file>..." to unstage)
Sin embargo, los decentes Git Tutorials de Atlassian simplemente dicen:
git reset <file>
Esto parece más sencillo, entonces, ¿por qué la diferencia?
No hay diferencia (desde la
página de manual
de
git reset
) en términos del parámetro predeterminado:
El
<tree-ish>/<commit>
defecto esHEAD
en todas sus formas.
Ese mensaje inicialmente no incluía HEAD: commit 3c1eb9c, enero de 2007, git 1.5.0-rc1 , pero como el valor predeterminado no siempre se conoce, el mensaje de ayuda deja en claro a qué commit se supone que debe restablecer.
HEAD
aparece en
commit 367c988, noviembre de 2007, Git 1.5.4
:
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
torek señala una diferencia real en los comentarios :
Al especificar
HEAD
, garantiza que la primera palabra después deHEAD
se tome como nombre de ruta.
Por ejemplo, suponga que ejecutagit reset zorg
. ¿Eszorg
un árbol-ish, como un nombre de etiqueta, o es un nombre de ruta,./zorg
?
La respuesta de Git es: es un árbol-ish sigit rev-parse
puede convertirlo en una ID de árbol, de lo contrario es un camino.
Puede escribirgit reset -- zorg
ogit reset HEAD zorg
para asegurarse de que git lo trate como una ruta.
Vea más sobre la sintaxis de doble guión (
--
) en "
Eliminar una rama git mal llamada
".
El agrega en los comentarios :
Como comentario aparte, lo sugieren para descartar cambios en el directorio de trabajo
(es decir,git checkout -- <file>
).
Simplemente parece inconsistente congit reset HEAD <file>
.
Mientras
que la página de manual de
git reset
indica claramente la falta de tree-ish en
git reset <tree-ish> -- <paths>
significa HEAD, no es así para
git checkout <tree-ish> -- <paths>
.
git checkout <tree-ish> -- <pathspec>
Cuando se dan
<paths>
,git checkout
no cambia de rama.
Actualiza las rutas nombradas en el árbol de trabajo desde el archivo de índice o desde un<tree-ish>
nombrado (la mayoría de las veces un commit).
Eso significa que
git checkout -- path
anulará el árbol de trabajo con lo que ya se ha organizado (
git add
''ed).
Mientras que
git reset -- PATH
(que es la forma mixta de git reset) restablecerá
el índice
con lo que HEAD contiene (eliminando efectivamente lo que se agregó)
git reset
y
git checkout
no usan el mismo valor predeterminado y:
-
puede representar el árbol predeterminado para
git reset <tree-ish> <file>
:HEAD
.
Por lo tanto,git reset HEAD <file>
; -
pero no puede representar el parámetro predeterminado cuando no proporciona un árbol para el
git checkout
: es el índice.
Por lo tanto,git checkout -- file
.
El
--
tiene que usarse en el caso de
git checkout
, ya que solo hay un parámetro, y debe quedar claro que el parámetro representa
archivos
.
Tenga en cuenta que
git checkout HEAD files
es diferente:
torek
menciona
en los comentarios
git checkout HEAD path
Copias degit checkout HEAD path
desde el commitHEAD
(el árbol-ish) al índice y luego al directorio de trabajo.
Nota: con Git 2.23+, agosto de 2019, puede usar
git restore
lugar
Ver los ejemplos :
Para restaurar un archivo en el índice para que coincida con la versión en HEAD (esto es lo mismo que usar
git-reset
)
git reset [-q] [<tree-ish>] [--] <paths>… git reset (--patch | -p) [<tree-ish>] [--] [<paths>…] git reset [--soft | --mixed [-N] | --hard | --merge | --keep] [-q] [<commit>]
página man:
git restore --staged hello.c
no especifica una fuente, y solo restaura el índice (
--staged
): lo hace (por defecto) usando HEAD como fuente.
Por defecto, las fuentes de restauración para el árbol de trabajo y el índice son el índice y HEAD respectivamente.
--source
podría usarse para especificar una confirmación como la fuente de restauración.
Otros ejemplos:
Puede restaurar tanto el índice como el árbol de trabajo (esto es lo mismo que usar
git-checkout
)
git reset [-q] [<tree-ish>] [--] <paths>…
o la forma corta que es más práctica pero menos legible:
$git reset HEAD stagedFile fatal: ambiguous argument ''HEAD'': unknown revision or path not in the working tree
git restore
es un nombre de comando más natural y no tiene ambigüedad.
Por defecto,
git reset
es equivalente a
git reset HEAD
Citando la página del manual (mi énfasis):
git-reset: restablece el HEAD actual al estado especificado.
git reset [-q] [<tree-ish>] [--] <paths>… git reset (--patch | -p) [<tree-ish>] [--] [<paths>…] git reset [--soft | --mixed [-N] | --hard | --merge | --keep] [-q] [<commit>]
En la primera y segunda forma, copie las entradas de <tree-ish> en el índice. En la tercera forma, configure el encabezado de rama actual (HEAD) en <commitir>, opcionalmente modificando el índice y el árbol de trabajo para que coincida. El <tree-ish> / <commit> por defecto es HEAD en todas sus formas.
[...]
git reset [-q] [<tree-ish>] [--] <paths>…
Este formulario restablece las entradas de índice para todos los <paths> a su estado en <tree-ish>. (No afecta el árbol de trabajo o la rama actual).
Esto significa que
git reset <paths>
es lo opuesto agit add <paths>
.
De esto ves que no hay una diferencia real en el comportamiento.
Esto parece más sencillo, entonces, ¿por qué la diferencia?
Como ambos son iguales, también podrías usar la versión más corta de los dos.