git reset --soft HEAD~1
Debes hacer lo que quieras. Después de esto, tendrá los primeros cambios en el índice (visibles con git diff --cached
), y sus cambios más nuevos no se realizarán por etapas. git status
entonces se verá así:
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: foo.java
#
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: foo.java
#
Luego puede hacer git add foo.java
y confirmar ambos cambios a la vez.
git commit --amend
hace; pero con un flujo de trabajo mucho más complicado. Esto no responde a la pregunta que OP hizo, a pesar de dar una buena dirección (git reset
).git reset --soft HEAD~
Utilizar:
Eso hace un restablecimiento "mixto" de forma predeterminada, que hará lo que solicitó; pon foo.java en unstaged, eliminando el commit más reciente.
fuente
git reset --soft
no funcionó, pero logit reset HEAD^
hizoPara mí, lo siguiente es la forma más legible (por lo tanto, preferible) de hacerlo:
En lugar de
1
, podría haber cualquier cantidad de confirmaciones que desee eliminar.fuente
git reset --soft
es solo para eso: es comogit reset --hard
, pero no toca los archivos.fuente
git reset
"es comogit reset --hard
pero no toca los archivos". Nogit reset --soft
.git reset --soft
organizará los cambios, por lo que no tendrá que agregarlos a la puesta en escena en caso de que quiera cometerlos, pero tendrá quegit reset
hacerlos (sí, una segunda vez y sin el--soft
) en caso de que no lo haga. Entonces esa respuesta es corta, pero incorrecta.Para desestadificar todos los archivos en su última confirmación:
git reset HEAD~
fuente
"Restablecer" es la forma de deshacer los cambios localmente. Cuando se compromete, primero selecciona los cambios para incluir con " git add ", eso se llama "puesta en escena". Y una vez que los cambios están organizados, entonces los " comprometes ".
Para retroceder ya sea desde la puesta en escena o la confirmación, "restablece" el HEAD. En una rama, HEAD es una variable git que apunta a la confirmación más reciente. Entonces, si ha organizado pero no se ha comprometido, " git reset HEAD ". Eso respalda al HEAD actual al quitar los cambios del escenario. Es la abreviatura de " git reset - HEAD mezclado ~ 0 ".
Si ya se ha comprometido, entonces HEAD ya ha avanzado, por lo que debe realizar una copia de seguridad de la confirmación anterior. Aquí " restablece HEAD ~ 1 " o " restablece HEAD ^ 1 " o " restablece HEAD ~ " o " restablece HEAD ^ " - todas las referencias HEAD menos una.
¿Cuál es el mejor símbolo, ~ o ^? Piense en ~ tilde como una secuencia única : cuando cada confirmación tiene un solo elemento primario y es solo una serie de cambios en secuencia, entonces puede hacer una copia de seguridad de la secuencia utilizando la tilde, como HEAD ~ 1, HEAD ~ 2, HEAD ~ 3, para padres, abuelos, bisabuelos, etc. (técnicamente es encontrar el primer padre en generaciones anteriores).
Cuando hay una fusión, los commits tienen más de un padre. Ahí es cuando entra en juego el ^ caret: puedes recordarlo porque muestra las ramas que se unen. Usando el símbolo de intercalación, HEAD ^ 1 sería el primer padre y HEAD ^ 2 sería el segundo padre de un solo padre, por ejemplo, madre y padre.
Entonces, si solo retrocede un salto en una confirmación de un solo padre, entonces HEAD ~ y HEAD ^ son equivalentes: puede usar cualquiera de los dos.
Además, el restablecimiento puede ser --soft , --mixed o --hard . Un reinicio por software simplemente retrocede la confirmación: restablece el HEAD, pero no extrae los archivos de la confirmación anterior, por lo que se conservan todos los cambios en el directorio de trabajo. Y - el reinicio suave ni siquiera borra el escenario (también conocido como el índice ), por lo que todos los archivos que se organizaron aún estarán en el escenario.
Un restablecimiento mixto (el valor predeterminado) tampoco comprueba los archivos de la confirmación anterior, por lo que se conservan todos los cambios, pero se borra la etapa. Es por eso que un simple " git reset HEAD " despejará del escenario.
Un restablecimiento completo restablece el HEAD y borra la etapa, pero también extrae todos los archivos de la confirmación anterior y sobrescribe cualquier cambio.
Si ha enviado el commit a un repositorio remoto, el reinicio no funciona tan bien. Puede restablecer localmente, pero cuando intente presionar hacia el control remoto, git verá que su HEAD local está detrás del HEAD en la rama remota y se negará a presionar. Es posible que pueda forzar el empuje, pero a git realmente no le gusta hacerlo.
Alternativamente, puede esconder sus cambios si desea conservarlos, verifique la confirmación anterior, retire los cambios, organícelos, cree una nueva confirmación y luego presione eso.
fuente
Digamos que quieres eliminar los cambios de los cambios hasta n commits,
Donde commit hashes son los siguientes:
Luego ejecute el siguiente comando:
git reset hn
Ahora la CABEZA estará en hn + 1. Los cambios de h1 a hn no se realizarán.
fuente