En una de mis ramas de desarrollo, hice algunos cambios en mi código base. Antes de poder completar las funciones en las que estaba trabajando, tuve que cambiar mi rama actual a maestra para demostrar algunas funciones. Pero solo usando un "git checkout master" conservó los cambios que también hice en mi rama de desarrollo, rompiendo así algunas de las funcionalidades en master. Entonces, lo que hice fue confirmar los cambios en mi rama de desarrollo con un mensaje de confirmación "confirmación temporal" y luego finalizar la compra para la demostración.
Ahora que terminé con la demostración y volví a trabajar en mi rama de desarrollo, me gustaría eliminar el "compromiso temporal" que hice sin dejar de preservar los cambios que hice. ¿Es eso posible?
git stash
git stash
es una buena herramienta, los commits de "trabajo en progreso" son también un dispositivo legítimo.git stash
alguna otra rama en el ínterin.stash
es que es completamente local y será propenso a la pérdida de código por eliminación de datos o recreación o, falla o pérdida de hardware. OMI, realmente debería usarse solo para WIP a muy corto plazo. Me encanta un compromiso de WIP antes de irse de vacaciones: P .. ¡llámalo un compromiso de descarga de cerebro!Respuestas:
Es tan simple como esto:
Nota: algunos shells se tratan
^
como un carácter especial (por ejemplo, algunos shells de Windows o ZSH con globing habilitado ), por lo que es posible que tenga que citar"HEAD^"
en esos casos.git reset
sin a--hard
o--soft
mueve suHEAD
para apuntar a la confirmación especificada, sin cambiar ningún archivo.HEAD^
se refiere a la (primera) confirmación principal de su confirmación actual, que en su caso es la confirmación anterior a la temporal.Tenga en cuenta que otra opción es continuar con normalidad y luego, en el siguiente punto de confirmación, ejecutar:
que en su lugar editará la confirmación más reciente, teniendo el mismo efecto que el anterior.
Tenga en cuenta que esto (como con casi todas las respuestas de git) puede causar problemas si ya ha empujado la mala confirmación a un lugar donde otra persona puede haberla retirado. Intenta evitar eso
fuente
More?
después de hacer esto. Cualquier cosa que escriba en ese mensaje me dafatal: ambiguous argument 'HEADwhateverItypedIn': unknown revision or path not in the working tree.
^
como un personaje especial. Puede citar la referencia"HEAD^"
o utilizar la sintaxis alternativa sinHEAD~1
comillasgit reset HEAD\^
Hay dos formas de manejar esto. Lo que es más fácil depende de tu situación.
Reiniciar
Si la confirmación de la que desea deshacerse fue la última confirmación, y no ha realizado ningún trabajo adicional, simplemente puede usar
git-reset
Lleva su rama nuevamente al commit justo antes de su HEAD actual. Sin embargo, en realidad no cambia los archivos en su árbol de trabajo. Como resultado, los cambios que estaban en esa confirmación aparecen como modificados, es como un comando 'no confirmado'. De hecho, tengo un alias para hacer precisamente eso.
Entonces puede usarlo
git uncommit
en el futuro para hacer una copia de seguridad de una confirmación.Aplastamiento
Aplastar un commit significa combinar dos o más commits en uno. Hago esto con bastante frecuencia. En su caso, tiene una característica a medio hacer confirmada, y luego la finalizaría y volvería a confirmar con el mensaje de confirmación permanente adecuado.
Digo arriba porque quiero dejar en claro que esto podría ser cualquier cantidad de confirmaciones. Ejecute
git log
y encuentre el commit del que desea deshacerse, copie su SHA1 y úselo en lugar de<ref>
. Git te llevará al modo de rebase interactivo. Mostrará todas las confirmaciones entre su estado actual y cualquier cosa que ponga en su lugar<ref>
. Entonces, si<ref>
hace 10 commits, te mostrará los 10 commits.Delante de cada commit, tendrá la palabra
pick
. Encuentra el commit desea deshacerse de y cambiarlo depick
afixup
osquash
. Usarfixup
simplemente descartes que confirman el mensaje y fusionan los cambios en su predecesor inmediato en la lista. Lasquash
palabra clave hace lo mismo, pero le permite editar el mensaje de confirmación de la nueva confirmación combinada.Tenga en cuenta que las confirmaciones se volverán a confirmar en el orden en que aparecen en la lista cuando salga del editor. Entonces, si realizó una confirmación temporal, luego realizó otro trabajo en la misma rama y completó la función en una confirmación posterior, entonces el uso de rebase le permitiría volver a ordenar las confirmaciones y aplastarlas.
ADVERTENCIA:
Rebasar modifica el historial: NO haga esto con ninguna confirmación que ya haya compartido con otros desarrolladores.
Escondite
En el futuro, para evitar este problema, considere usarlo
git stash
para almacenar temporalmente el trabajo no comprometido.Esto almacenará tus cambios actuales a un lado en tu lista de escondite. Arriba está la versión más explícita del comando stash, que permite un comentario para describir lo que está ocultando. También puede simplemente ejecutar
git stash
y nada más, pero no se almacenará ningún mensaje.Puede navegar por su lista de alijo con ...
Esto le mostrará todas sus reservas, en qué ramas se hicieron, y el mensaje y al comienzo de cada línea, e identificador para esa reserva que se ve así
stash@{#}
donde # es su posición en la matriz de reservas.Para restaurar un alijo (que se puede hacer en cualquier rama, independientemente de dónde se creó originalmente el alijo) simplemente ejecute ...
Una vez más, # es la posición en la matriz de escondites. Si el alijo que desea restaurar está en la
0
posición, es decir, si era el alijo más reciente. A continuación, sólo puede ejecutar el comando sin especificar la posición de escondite, git asumirá que quiere decir la última:git stash apply
.Entonces, por ejemplo, si me encuentro trabajando en la rama incorrecta, puedo ejecutar la siguiente secuencia de comandos.
En su caso, se movió un poco más por las ramas, pero la misma idea aún se aplica.
Espero que esto ayude.
fuente
git config --global alias.uncommit reset HEAD^
solo los alias no confirman para restablecer. En su lugar, hacergit config --global alias.uncommit 'reset HEAD^'
Creo que estas buscando esto
git reset --soft HEAD~1
Deshace la confirmación más reciente mientras mantiene los cambios realizados en esa confirmación a la puesta en escena.
fuente
git reset HEAD^
a Windows solo te pregunta "¿Más?" - lo que sea que eso signifique^
es un personaje de escape en DOS. Cuando se combina con una nueva línea, sirve como un mensaje de continuación para el comando anterior. Escribirgit reset HEAD^^
debería funcionar en Windows.Sí, puede eliminar su confirmación sin eliminar los cambios: git reset @ ~
fuente
git reset --soft
ogit reset --keep
?Estás buscando uno
git reset HEAD^ --soft
u otrogit reset HEAD^ --mixed
.Hay 3 modos para el comando de reinicio como se indica en los documentos :
git reset HEAD^ --soft
deshacer el
git commit
. Todavía existen cambios en el árbol de trabajo (la carpeta del proyecto) + el índice (--cached)git reset HEAD^ --mixed
deshacer
git commit
+git add
. Todavía existen cambios en el árbol de trabajo.git reset HEAD^ --hard
Como si nunca hubieras hecho estos cambios en la base de código. Los cambios se han ido del árbol de trabajo.
fuente
Para aquellos que usan zsh, deberán usar lo siguiente:
git reset --soft HEAD\^
Explicado aquí: https://github.com/robbyrussell/oh-my-zsh/issues/449
En caso de que la URL quede muerta, la parte importante es:
fuente
git reset HEAD^
está trabajando en zsh para mí, puede haber sido reparado.zsh 5.3 (x86_64-apple-darwin18.0)
En mi caso, ya presioné al repositorio. ¡Ay!
Puede revertir una confirmación específica mientras mantiene los cambios en sus archivos locales haciendo:
De esta manera pude mantener los cambios que necesitaba y deshacer una confirmación que ya se había presionado.
fuente
git revert bad-commit-sha
, entoncesgit revert -n revert-commit-just-created-sha
y luego reparar desde allí. Me tienes a medio camino. ¡Gracias!El uso de git 2.9 (precisamente 2.9.2.windows.1)
git reset HEAD^
solicita más; No estoy seguro de lo que se espera entrada aquí. Por favor, consulte la siguiente captura de pantallaEncontramos otra solución
git reset HEAD~#numberOfCommits
con la que podemos elegir seleccionar el número de confirmaciones locales que desea restablecer manteniendo sus cambios intactos. Por lo tanto, tenemos la oportunidad de descartar todos los compromisos locales, así como un número limitado de compromisos locales.Consulte las siguientes capturas de pantalla que se muestran
git reset HEAD~1
en acción:fuente
Una forma más de hacerlo.
Agregue commit en la parte superior de commit temporal y luego haga:
Para fusionar dos confirmaciones en una (el comando abrirá un archivo de texto con instrucciones explícitas, edítelo).
fuente
git reset HEAD^
. Git rebase tiene mucho margen de error aquí.2020 forma simple:
(El hash de confirmación de la última confirmación que desea mantener).
Si se envió el commit, puede hacer lo siguiente:
Mantendrá los cambios ahora no confirmados localmente
fuente