specific remove remote last committed commits changes git commit undo amend

remove - revert commit git console



Cómo deshacer "git commit--amend" hecho en lugar de "git commit" (9)

He modificado accidentalmente mi compromiso anterior. La confirmación debería haber sido separada para mantener el historial de los cambios que hice en un archivo en particular.

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

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


  1. Checkout a sucursal temporal con último compromiso

    git branch temp HEAD@{1}

  2. Restablecer la última confirmación

    git reset temp

  3. Ahora, tendrá todos los archivos de su compromiso, así como el compromiso anterior. Verificar el estado de todos los archivos.

    git status

  4. Restablecer sus archivos de confirmación desde la etapa git.

    git reset myfile1.js (etc.)

  5. Vuelve a colocar este cometer

    git commit -C HEAD@{1}

  6. Agrega y confirma tus archivos a un nuevo commit.


Cabe señalar que si aún está en su editor con el mensaje de confirmación, puede eliminar el mensaje de confirmación y git commit --amend comando git commit --amend .


Casi 9 años tarde para esto, pero no vi que se mencionara esta variación que logra lo mismo (es una combinación de algunos de estos, similar a la respuesta principal ( https://.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 antiguo SHA1

git reset --hard SHA1

Luego empújelo de nuevo hacia arriba.

git push origin BRANCH_NAME

Hecho.

Esto lo revertirá de nuevo al antiguo compromiso.

(Incluyendo la fecha del encabezado de confirmación separado y sobrescrito anteriormente)


Encuentra tus compromisos modificados por:

git log --reflog

Nota: Puede agregar --patch para ver el cuerpo de las confirmaciones para mayor claridad. Igual que git reflog .

luego restablezca su HEAD a cualquier confirmación previa en el punto en que estaba bien:

git reset SHA1 --hard

Nota: Reemplace SHA1 con su hash de confirmación real. También tenga en cuenta que este comando perderá los cambios no confirmados, por lo que puede guardarlos antes. Alternativamente use --soft en --soft lugar.

Luego elige el otro compromiso que necesitas sobre él:

git cherry-pick SHA1


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 la versión anterior de HEAD . git reset --soft moverá el puntero de la rama para que la próxima confirmación ocurra sobre una confirmación diferente de donde está ahora el encabezado de la rama 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}


Puede hacer lo siguiente para deshacer su "git commit —amend"

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

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

Ahora sus cambios son según lo anterior. Así que ha terminado con la función de deshacer para "git commit - enmendar" Ahora puede hacer "git push origin", para presionar para ramificar


Siempre se puede dividir un commit, desde el manual

  • Inicie una rebase interactiva con git rebase -i commit ^, donde commit es el commit 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 ese commit, ejecuta git reset HEAD ^. El efecto es que la CABEZA se rebobina en uno, y el índice sigue su ejemplo. Sin embargo, el árbol de trabajo se mantiene igual.
  • Ahora agregue los cambios al índice que desea tener en la primera confirmación. Puedes usar git add (posiblemente de manera interactiva) o git-gui (o ambos) para hacer eso.
  • Confirme el índice actual con cualquier mensaje de confirmación que sea apropiado ahora.
  • Repita los dos últimos pasos hasta que su árbol de trabajo esté limpio.
  • Continuar la rebase con git rebase --continuar.

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

Luego use git diff before_commit_id after_commit_id > d.diff para obtener diff entre antes de enmendar y después de enmendar.

A continuación, use git checkout before_commit_id para volver antes de confirmar

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

Eso resuelve mi problema.


utilizar el ref-log :

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

entonces debe tener todos los cambios modificados previamente solo en su copia de trabajo y puede volver a confirmar

Para ver una lista completa de índices anteriores, escriba git reflog