repositorio - ¿Por qué Git no puede hacer restablecimientos duros/blandos por ruta?
que es head en git (4)
La pregunta de cómo ya está answered , explicaré por qué .
Entonces, ¿qué hace el reinicio de git ? Dependiendo de los parámetros especificados, puede hacer dos cosas diferentes:
Si especifica una ruta, reemplaza los archivos coincidentes en el índice con los archivos de una confirmación (HEAD por defecto). Esta acción no afecta en absoluto al árbol de trabajo y generalmente se usa como opuesto a git add.
Si no especifica una ruta, mueve la cabeza de bifurcación actual a una confirmación especificada y, junto con eso , restablece opcionalmente el índice y el árbol de trabajo al estado de esa confirmación. Este comportamiento adicional está controlado por el parámetro de modo:
--soft : no toques el índice y el árbol de trabajo.
--mezclado (predeterminado): restablece el índice pero no el árbol de trabajo.
--hard : restablece el índice y el árbol de trabajo.
También hay otras opciones, consulte la documentación de la lista completa y algunos casos de uso.Cuando no especifica una confirmación, su valor predeterminado es HEAD, por lo que
git reset --soft
no hará nada, ya que es un comando para mover la cabeza a HEAD (a su estado actual).git reset --hard
, por otro lado, tiene sentido debido a sus efectos secundarios , dice mueva la cabeza a HEAD y reinicie el índice y el árbol de trabajo en HEAD.Creo que ahora debería estar claro por qué esta operación no es para archivos específicos por su naturaleza: en primer lugar, se pretende mover un cabezal de bifurcación, restablecer el árbol de trabajo y el índice es una funcionalidad secundaria.
$ git reset -- <file_path>
puede restablecer por ruta.
Sin embargo, $ git reset (--hard|--soft) <file_path>
reportará un error como el siguiente:
Cannot do hard|soft reset with paths.
Porque no tiene sentido (otros comandos ya proporcionan esa funcionalidad), y reduce el potencial de hacer lo incorrecto por accidente.
Se acaba de realizar un "restablecimiento completo" de una ruta con git checkout HEAD -- <path>
(revisando la versión existente del archivo).
Un restablecimiento suave para una ruta no tiene sentido.
Un reset mixto para una ruta es lo que git reset -- <path>
hace.
Puede lograr lo que está tratando de hacer usando git checkout HEAD <path>
.
Dicho esto, el mensaje de error proporcionado no tiene sentido para mí (ya que el git reset
funciona bien en los subdirectorios), y no veo ninguna razón por la cual el git reset --hard
no debería hacer exactamente lo que estás pidiendo.
git reset --soft HEAD ~ 1 filename deshace el commit pero los cambios permanecen en local. nombre de archivo podría ser - para todos los archivos comprometidos