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 --softsolo 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 --softsolo 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 resetcambiar 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 mastersalido, 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 resetcomando.
Cambia tu índice también
git reset --mixed <ref>
o equivalente
git reset <ref>:
Hace lo que --softhace Y también restablece el índice para que coincida con el compromiso en la referencia especificada. Mientras git reset --soft HEADno hace nada (porque dice mover la rama desprotegida a la rama desprotegida), git reset --mixed HEADo 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 --mixedhace 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 resetmovimiento a las que HEADapunta 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. HEADeres tú , y así se moverá cuando lo hagas.