Cómo cancelar "git commit -amend" hecho en lugar de "git commit"

Accidentalmente cambié mi fijación anterior. El final debe estar separado para mantener un historial de cambios realizados por mí en un archivo específico.

¿Hay alguna forma de cancelar el último commit? Si hago algo como git reset --hard HEAD^ , la primera confirmación también se cancela.

(No he hecho clic en ningún directorio eliminado)

819
22 сент. establecido por Jesper Rønn-Jensen el 22 de septiembre 2009-09-22 12:56 '09 a las 12:56 2009-09-22 12:56
@ 7 respuestas

Lo que debe hacer es crear una nueva confirmación con los mismos detalles que la confirmación HEAD actual, pero con la principal como con la versión anterior de HEAD . git reset --soft moverá el puntero a la rama para que la próxima confirmación se realice sobre otra confirmación, desde la cual se encuentra la rama actual.

 # Move the current head so that it pointing at the old commit # Leave the index intact for redoing the commit. # HEAD@{1} gives you "the commit that HEAD pointed at before # it was moved to where it currently points at". Note that this is # different from HEAD~1, which gives you "the commit that is the # parent node of the commit that HEAD is currently pointing to." git reset --soft HEAD@{1} # commit the current tree using the commit details of the previous # HEAD commit. (Note that HEAD@{1} is pointing somewhere different from the # previous command. It now pointing at the erroneously amended commit.) git commit -C HEAD@{1} 
1418
22 сент. respuesta dada por Charles Bailey Sep 22 2009-09-22 13:23 '09 a las 1:23 p.m. 2009-09-22 13:23

usar ref-log :

 git branch fixing-things HEAD@{1} git reset fixing-things 
border=0

solo debe tener todos los cambios modificados en su copia de trabajo y confirmar nuevamente

para ver la lista completa de los tipos de índice de git reflog anteriores

88
22 сент. respuesta dada el 22 de septiembre 2009-09-22 13:02 '09 a las 13:02 2009-09-22 13:02

Encuentra los cambios corregidos:

 git log --reflog 

Nota Puede agregar --patch para ver el cuerpo de confirmación para mayor claridad. Igual que git reflog .

luego reinicie su HEAD para cualquier corrección previa en el punto en el que era normal:

 git reset SHA1 --hard 

Nota: Reemplaza SHA1 con tu real hash commit. También tenga en cuenta que este comando perderá los cambios no confirmados, por lo que puede copiarlos antes.

Luego elige otra solución que necesites:

 git cherry-pick SHA1 
19
27 марта '16 в 4:56 2016-03-27 04:56 kenorb da la respuesta 27 de marzo de 2016 a las 4:56 2016-03-27 04:56

Siempre se puede dividir la confirmación, desde el manual.

  • Inicie un reinicio interactivo con git rebase -i commit ^, donde commit es el commit que desea dividir. De hecho, cualquier rango de compromiso actuará si contiene este compromiso.
  • Marque la corrección que desea dividir con la acción de edición.
  • Cuando se trata de editar este mensaje, haz un reset de git HEAD ^. El efecto es que HEAD se rebobina en uno, y el índice sigue un ejemplo. Sin embargo, el árbol de trabajo sigue siendo el mismo.
  • Ahora agregue los cambios al índice que desea tener en la primera confirmación. Puedes usar git add (posiblemente interactivo) o git -gui (o ambos) para esto.
  • Confirme el índice actual con cualquier mensaje de confirmación. Ahora
  • Repita los dos últimos pasos hasta que su árbol de trabajo esté limpio.
  • Continuar reiniciando con git rebase -continuar.
18
22 сент. Respuesta dada por Arkaitz Jiménez 22 de septiembre. 2009-09-22 13:01 '09 a la 1:01 pm 2009-09-22 13:01

Tal vez pueda usar git reflog para obtener dos confirmaciones antes del cambio y después del cambio.

Luego use git diff before_commit_id after_commit_id > d.diff para obtener la diferencia entre el cambio y después del cambio.

Luego use git checkout before_commit_id para regresar antes de git checkout before_commit_id

Y el último uso de git apply d.diff para aplicar cambios reales.

Esto resuelve mi problema.

10
20 сент. la respuesta se da utzcoz 20 sep . 2016-09-20 15:39 '16 a las 3:39 pm 2016-09-20 15:39

Puede que valga la pena tener en cuenta que si todavía está en su editor con un mensaje de confirmación, puede eliminar el mensaje de confirmación y git commit --amend .

4
03 марта '17 в 21:45 2017-03-03 21:45 La respuesta de Justin Schulz es el 3 de marzo de 2017 a las 21:45 2017-03-03 21:45
  • Compruebe si hay una sucursal temporal con el último compromiso

    git branch temp HEAD@{1}

  • Restablecer la última confirmación

    git reset temp

  • Ahora tendrá todos los archivos con la fijación, así como con la fijación anterior. Compruebe el estado de todos los archivos.

    git status

  • Restablece tus archivos de confirmación desde la etapa git.

    git reset myfile1.js (etc.)

  • Repita esta fijación.

    git commit -C HEAD@{1}

  • Agregue y bloquee sus archivos para una nueva confirmación.

-1
04 марта '16 в 10:28 2016-03-04 10:28 Priyanshu Chauhan da la respuesta el 4 de marzo de 2016 a las 10:28 2016-03-04 10:28

Otras preguntas sobre las etiquetas o hacer una pregunta