¿Puedo eliminar el git commit, pero guardar los cambios?

En una de mis ramas de desarrollo, hice algunos cambios en mi base de código. Antes de poder completar las funciones en las que estaba trabajando, tuve que cambiar la rama actual al disco maestro para demostrar algunas de las funciones. Pero fue solo con la ayuda del asistente de "git checkout" que se conservaron los cambios que también hice en mi rama de desarrollo, lo que viola ciertas funciones en el maestro. Entonces, lo que hice fue confirmar los cambios en mi rama de desarrollo con el mensaje de confirmación "arreglo temporal" y luego el asistente de verificación para la demostración.

Ahora que he terminado la demostración y he vuelto a trabajar en mi rama de desarrollo, me gustaría eliminar la "solución temporal" que hice mientras conservaba todos los cambios que hice. Es posible?

651
02 апр. set tanookiben 02 abr 2013-04-02 21:56 '13 a las 21:56 2013-04-02 21:56
@ 10 respuestas

Es tan simple:

 git reset HEAD^ 

git reset sin --hard o --soft mueve su HEAD para indicar el compromiso especificado, sin cambiar ningún archivo. HEAD^ refiere a la (primera) fijación paterna de su confirmación actual, que en su caso es una corrección para una corrección temporal.

Tenga en cuenta que la otra opción debería ejecutarse como de costumbre y luego comenzar en el siguiente punto de fijación:

 git commit --amend [-m … etc] 

que en su lugar editará la última confirmación, teniendo el mismo efecto que el anterior.

Tenga en cuenta que esto (como casi todas las respuestas de git) puede causar problemas si ya ha presionado mal un lugar donde alguien más podría retirarlo. Intenta evitar esto.

1060
02 апр. La respuesta es dada por Gareth 02 Abr. 2013-04-02 21:58 '13 a las 21:58 2013-04-02 21:58

Hay dos maneras de manejar esto. Lo que es más fácil depende de tu situación.

Restablecer

Si el compromiso del que desea deshacerse fue el último, y no realizó ningún trabajo adicional, puede usar git-reset

 git reset HEAD^ 

Devuelva su sucursal a un compromiso justo antes de su CABEZA actual. Sin embargo, esto no cambia realmente los archivos en su árbol de trabajo. Como resultado, los cambios realizados en este compromiso se muestran como cambiados, esto es similar al comando uncommit. De hecho, tengo un seudónimo para hacer esto.

 git config --global alias.uncommit 'reset HEAD^' 

Entonces, simplemente puede usar git uncommit en el futuro para hacer una copia de seguridad de un solo compromiso.

aplastante

Aplastar un compromiso significa fusionar dos o más compromisos en uno. Lo hago bastante a menudo. En su caso, ha arreglado la función con media preparación, y luego la completa y la transmite nuevamente con el mensaje correcto y permanente sobre la confirmación.

 git rebase -i <ref> 

Estoy hablando más arriba porque quiero aclarar que esto puede ser cualquier número de confirmaciones. Ejecute git log y encuentre la confirmación de la que desea deshacerse, copie SHA1 y utilícelo en lugar de <ref> . Git te pondrá en un modo de rebase interactivo. Mostrará todas las confirmaciones entre su estado actual y lo que puso en lugar de <ref> . Por lo tanto, si <ref> 10 devuelve, le mostrará las 10 confirmaciones.

Antes de cada compromiso tendrá la palabra pick . Encuentre el compromiso del que desea deshacerse y cámbielo de pick to fixup o squash . El uso de fixup simplemente descarta el mensaje, que corrige el mensaje y combina los cambios con su predecesor inmediato en la lista. La palabra clave squash hace lo mismo, pero le permite editar el mensaje de confirmación de la confirmación recién fusionada.

Tenga en cuenta que los compromisos se volverán a confirmar en el orden en que aparecen en la lista cuando salga del editor. Por lo tanto, si realizó una confirmación temporal, luego realizó otro trabajo en la misma rama y realizó la función en una confirmación posterior, el uso de rebase le permitirá reordenar las confirmaciones y aplastarlas.

ADVERTENCIA:

La reubicación cambia la historia: NO hagas esto con ningún compromiso que ya hayas compartido con otros desarrolladores.

border=0

para esconder

En el futuro, para evitar este problema, considere usar git stash para almacenar temporalmente el trabajo no comprometido.

 git stash save 'some message' 

Esto guardará sus cambios actuales a la lista en su caché. La anterior es la versión más explícita del comando stash, que le permite comentar para describir lo que está almacenando. También puedes ejecutar git stash y nada más, pero el mensaje no se guardará.

Puedes ver tu lista de cachés desde ...

 git stash list 

Esto le mostrará todos sus cachés, en qué ramas se hicieron, así como el mensaje al comienzo de cada línea, así como el identificador de este caché, que se parece a este stash@{#} donde # es su posición en la matriz de caché,

Para restaurar la memoria caché (que se puede hacer en cualquier rama, independientemente de dónde se creó originalmente la memoria caché), simplemente ejecute ...

 git stash apply stash@{#} 

Nuevamente, # es una posición en una matriz de cachés. Si el caché que desea recuperar está en la posición 0 es decir, si fue el último caché. Luego, simplemente puede ejecutar el comando sin especificar la posición del alijo, git asumirá que quiere decir el último: git stash apply .

Así, por ejemplo, si estoy en la rama incorrecta, puedo ejecutar la siguiente secuencia de comandos.

 git stash git checkout <correct_branch> git stash apply 

En su caso, se movió un poco más a lo largo de las ramas, pero la misma idea sigue siendo válida.

Espero que esto ayude.

130
03 апр. La respuesta se da eddiemoya 03 apr. 2013-04-03 06:55 '13 a las 6:55 2013-04-03 06:55

Sí, puede eliminar su confirmación sin eliminar los cambios: git reset @ ~

30
23 авг. Respuesta dada por DURGESH Chaurasiya 23 de agosto. 2016-08-23 21:44 '16 a las 21:44 2016-08-23 21:44

Creo que estas buscando esto.

git reset --soft HEAD~1

Cancela el compromiso más reciente, al mismo tiempo que mantiene los cambios realizados en este compromiso en la etapa preparatoria.

28
09 марта '18 в 12:57 2018-03-09 12:57 la respuesta la da Sudhanshu Jain el 9 de marzo de 18 a las 12:57 2018-03-09 12:57

En mi caso, ya hice clic en el repositorio. Ups!

Puede devolver un compromiso específico guardando los cambios en los archivos locales ejecutando:

 git revert -n <sha> 

De esta manera, pude guardar los cambios que necesitaba y deshabilitar la confirmación que ya estaba presionada.

5
18 мая '17 в 17:20 2017-05-18 17:20 respondió a Wim Feijen el 18 de mayo de 17 a las 17:20 2017-05-18 17:20

Para aquellos que usan zsh, tienes que usar lo siguiente:

git reset --soft HEAD\^

Explicado aquí: https://github.com/robbyrussell/oh-my-zsh/issues/449

En caso de que la URL esté muerta, la parte importante es:

Escape ^ en tu equipo

También puede usar HEAD ~ para no tener que evitarlo cada vez.

5
18 авг. respuesta dada por Greg Hilston 18 ago. 2018-08-18 22:02 '18 a las 10:02 pm 2018-08-18 22:02

Usando git 2.9 (exactamente 2.9.2.windows.1) git reset HEAD^ solicita más; No estoy seguro de lo que se espera aquí. Ver abajo captura de pantalla

2019

22 нояб. La respuesta se da nkharche 22 nov. 2017-11-22 13:03 '17 a la 1:03 pm 2017-11-22 13:03

Otra forma de hacer esto.

Agregue una confirmación en la parte superior de la corrección temporal y luego ejecute:

 git rebase -i 

Combine dos confirmaciones en una (el comando abrirá un archivo de texto con instrucciones explícitas y lo editará).

2
02 апр. Se da la respuesta a Ruslan Osipov 02 abr. 2013-04-02 22:59 '13 a las 10:59 pm 2013-04-02 22:59
 git reset HEAD^ 

HEAD es tu ID de reparación

1
06 дек. La respuesta es dada por Mike el 06 de diciembre. 2017-12-06 23:02 '17 a las 11:02 pm 2017-12-06 23:02

Utilicé el escritorio de Github y utilicé el elemento de menú Revertir último compromiso. Funcionó a la perfección.

0
06 дек. la respuesta se da saju 06 dic. 2017-12-06 23:02 '17 a las 11:02 pm 2017-12-06 23:02

Otras preguntas sobre etiquetas o hacer una pregunta