Hay una serie de respuestas aquí con una idea errónea sobre git reset --soft
. Si bien existe una condición específica en la que git reset --soft
solo cambiará HEAD
(a partir de un estado de cabezal separado), por lo general (y para el uso previsto), mueve la referencia de rama que actualmente ha desprotegido. Por supuesto, no puede hacer esto si no tiene una rama desprotegida (de ahí la condición específica donde git reset --soft
solo cambiará HEAD
).
He encontrado que esta es la mejor manera de pensar git reset
. Que no sólo está en movimiento HEAD
( todo lo que hace ), también se está moviendo la ref rama , por ejemplo, master
. Esto es similar a lo que sucede cuando ejecuta git commit
(la rama actual se mueve junto con HEAD
), excepto que en lugar de crear (y pasar a) una nueva confirmación, pasa a una confirmación anterior .
Este es el punto de reset
cambiar una rama a otra que no sea una nueva confirmación, no cambiar HEAD
. Puede ver esto en el ejemplo de documentación:
Deshacer un commit, convirtiéndolo en una rama temática
$ git branch topic/wip (1)
$ git reset --hard HEAD~3 (2)
$ git checkout topic/wip (3)
- Has realizado algunas confirmaciones, pero te das cuenta de que era prematuro estar en la rama "maestra". Desea continuar puliéndolos en una rama de tema, por lo tanto, cree la rama "tema / wip" fuera del HEAD actual.
- Rebobina la rama maestra para deshacerte de esos tres commits.
- Cambie a la rama "tema / wip" y siga trabajando.
¿Cuál es el punto de esta serie de comandos? Desea mover una rama , aquí master
, así que mientras ha master
salido, corregit reset
.
La respuesta más votada aquí es generalmente buena, pero pensé en agregar esto para corregir las varias respuestas con conceptos erróneos.
Cambia tu sucursal
git reset --soft <ref>
: Restablece el puntero rama de la rama actualmente desprotegido a la confirmación en la referencia especificada, <ref>
. Los archivos en su directorio de trabajo e índice no cambian. Comprometerse desde esta etapa lo llevará de regreso a donde estaba antes del git reset
comando.
Cambia tu índice también
git reset --mixed <ref>
o equivalente
git reset <ref>
:
Hace lo que --soft
hace Y también restablece el índice para que coincida con el compromiso en la referencia especificada. Mientras git reset --soft HEAD
no hace nada (porque dice mover la rama desprotegida a la rama desprotegida), git reset --mixed HEAD
o de manera equivalente git reset HEAD
, es un comando común y útil porque restablece el índice al estado de su última confirmación.
Cambia tu directorio de trabajo también
git reset --hard <ref>
: hace lo que --mixed
hace Y también sobrescribe su directorio de trabajo. Este comando es similar a git checkout <ref>
, excepto que (y este es el punto crucial sobre reset
) todas las formas de git reset
movimiento a las que HEAD
apunta la referencia de la rama .
Una nota sobre "tal y tal comando mueve la CABEZA":
No es útil decir que un comando mueve el HEAD
. Cualquier comando que cambie su ubicación en el historial de confirmación mueve el HEAD
. Eso es lo que HEAD
es , un puntero a donde quiera que estés. HEAD
eres tú , y así se moverá cuando lo hagas.