Pregunta Cómo deshacer "git commit --amend" en lugar de "git commit"


Accidentalmente modifiqué mi compromiso anterior. La confirmación debería haberse separado para mantener el historial de los cambios que realicé en un archivo en particular.

¿Hay alguna manera de deshacer ese último compromiso? Si hago algo como git reset --hard HEAD^, el primer compromiso también se deshace.

(Todavía no he enviado a ningún directorio remoto)


942
2017-09-22 09:56


origen


Respuestas:


Lo que debe hacer es crear un nuevo compromiso con los mismos detalles que el actual HEAD commit, pero con el padre como la versión anterior de HEAD. git reset --soft moverá el puntero de bifurcación para que el siguiente compromiso ocurra encima de un compromiso diferente desde donde está el búfer actual.

# Move the current head so that it's 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's now pointing at the erroneously amended commit.)
git commit -C HEAD@{1}

1662
2017-09-22 10:23



utilizar el ref-log:

git branch fixing-things HEAD@{1}
git reset fixing-things

Debería tener todos sus cambios modificados previamente solo en su copia de trabajo y puede volver a cometer

para ver una lista completa de tipos de índices anteriores git reflog


101
2017-09-22 10:02



Encuentra tus commit modificados por:

git log --reflog

Nota: puede agregar --patch para ver el cuerpo de los commits por claridad. Igual que git reflog.

luego reinicia tu HEAD a cualquier confirmación previa en el punto en que estuvo bien por:

git reset SHA1 --hard

Nota: Reemplazar SHA1 con tu hash de confirmación real. También tenga en cuenta que este comando se perder cualquier cambio no confirmado, por lo que puede esconderlos antes.

A continuación, seleccione con cuidado la otra confirmación que necesita encima:

git cherry-pick SHA1

32
2018-03-27 01:56



Siempre puedes dividir una confirmación, Desde el manual

  • Comience una rebase interactiva con git rebase -i commit ^, donde commit es la confirmación que desea dividir. De hecho, cualquier rango de compromiso funcionará, siempre que contenga ese compromiso.
  • Marque la confirmación que desea dividir con la acción "editar".
  • Cuando se trata de editar esa confirmación, ejecute git reset HEAD ^. El efecto es que HEAD se rebobina en uno, y el índice sigue el juego. Sin embargo, el árbol de trabajo permanece igual.
  • Ahora agregue los cambios al índice que desea tener en la primera confirmación. Puedes usar git add (posiblemente interactivamente) o git-gui (o ambos) para hacer eso.
  • Confirme el índice actual con cualquier mensaje de compromiso apropiado ahora.
  • Repita los dos últimos pasos hasta que su árbol de trabajo esté limpio.
  • Continúa la rebase con git rebase --continuar.

20
2017-09-22 10:01



Quizás pueda usar git reflog para obtener dos commit antes de enmendar y después de enmendar.

Entonces usa git diff before_commit_id after_commit_id > d.diff para obtener la diferencia entre antes de enmendar y después de enmendar.

Siguiente uso git checkout before_commit_id volver a antes de cometer

Y último uso git apply d.diff para aplicar el cambio real que hiciste

Eso resuelve mi problema.


13
2017-09-20 12:39



Posiblemente vale la pena señalar que si todavía está en su editor con el mensaje de confirmación, puede eliminar el mensaje de confirmación y se cancelará el git commit --amend mando.


12
2018-03-03 18:45



Casi 9 años tarde en esto, pero no vi que esta variación mencionada lograra lo mismo (es una especie de combinación de algunos de ellos, similar a la respuesta superior (https://stackoverflow.com/a/1459264/4642530)

Buscar todas las cabezas separadas en la rama

git reflog show origin/BRANCH_NAME --date=relative

Luego encuentra el hash SHA1

Restablecer a viejo SHA1

git reset --hard SHA1

Luego empújalo hacia arriba.

git push origin BRANCH_NAME

Hecho.

Esto te devolverá a la antigua confirmación por completo.

(Incluyendo la fecha de la cabeza de compromiso separada sobreescrita anterior)


1
2018-06-17 21:55



  1. Pago a la sucursal temporal con el último compromiso

    git branch temp HEAD@{1}

  2. Restablecer el último compromiso

    git reset temp

  3. Ahora, tendrás todos tus archivos así como la confirmación previa. Verifica el estado de todos los archivos.

    git status

  4. Restablece tus archivos de commit desde la etapa de git.

    git reset myfile1.js (pronto)

  5. Vuelva a conectar este compromiso

    git commit -C HEAD@{1}

  6. Agregue y confirme sus archivos a la nueva confirmación.


0
2018-03-04 07:28



Puede hacer abajo para deshacer su "git commit -amend"

  1. $ git reset --soft HEAD ^
  2. $ git checkout files_from_old_commit_on_branch
  3. $ git pull origen your_branch_name

=================================

Ahora tus cambios son como los anteriores. Así que has terminado con el deshacer de "git commit -amend" Ahora puedes hacer "origen de git push", empujar para ramificar


0
2018-06-25 11:46