Lo que debe hacer es crear un nuevo commit con los mismos detalles que el HEAD
commit actual , pero con el padre como la versión anterior de HEAD
. git reset --soft
moverá el puntero de rama para que la próxima confirmación se realice encima de una confirmación diferente de donde está ahora el encabezado de 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}
git reflog
para encontrar el número correcto, por ejemplo{2}
.git commit --amend
. El segundo es un "rehacer" en una nueva confirmación. Estos funcionan para cualquieragit commit
, no solo--amend
.git commit
.git reset --soft HEAD@{1}
:fatal: ambiguous argument 'HEAD@1': unknown revision or path not in the working tree. Use '--' to separate paths from revisions
. Cuando lo reemplacéHEAD@{1}
con el hash de confirmación equivalente que se muestra engit reflog
(¡gracias JJD!), ¡Esta respuesta funcionó maravillosamente!HEAD@{1}
. Si corroecho HEAD@{1}
en tcsh, por ejemplo, la salida seHEAD@1
debe a que tcsh interpretó las llaves. Si uso comillas simples, se conservan las llaves.usa el registro de referencia :
entonces debe tener todos sus cambios previamente modificados solo en su copia de trabajo y puede confirmar nuevamente
para ver una lista completa del tipo de índices anteriores
git reflog
fuente
HEAD@{1}
yHEAD~1
?HEAD~1
es exactamente igualHEAD^
e identifica al padre de la confirmación actual.HEAD@{1}
por otro lado, se refiere a la confirmación que HEAD señaló antes de esta, es decir, se refieren a confirmaciones diferentes cuando se paga una rama diferente o se modifica una confirmación.git reset HEAD@{1}
es suficiente.Encuentra tus confirmaciones modificadas por:
Nota: Puede agregar
--patch
para ver el cuerpo de los commits para mayor claridad. Igual quegit reflog
.luego restablezca su HEAD a cualquier confirmación previa en el punto en que estaba bien:
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 su lugar para retener los últimos cambios y luego confirmarlos.Luego selecciona el otro commit que necesitas además:
fuente
git reset SHA1 --soft
, puede retener los últimos cambios y luego confirmarlos.Siempre puedes dividir un commit, desde el manual
fuente
git reflog
es todo lo que necesitasgit reset
lugar degit reset --soft
, luego hazlogit add --patch
.Posiblemente valga 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 abortará el
git commit --amend
comando.fuente
Tal vez pueda usar
git reflog
para obtener dos commit antes de enmendar y después de enmendar.Luego usa
git diff before_commit_id after_commit_id > d.diff
para obtener diferencias entre antes de enmendar y después de enmendar.Siguiente uso
git checkout before_commit_id
para volver a antes de confirmarY ultimo uso
git apply d.diff
para aplicar el cambio real que hiciste.Eso resuelve mi problema.
fuente
Si ha empujado el commit a remoto y luego ha modificado erróneamente los cambios a ese commit, esto solucionará su problema. Emita a
git log
para encontrar el SHA antes de la confirmación. (esto supone que el control remoto se denomina origen). Ahora emita estos comandos usando ese SHA.fuente
Puede hacer a continuación para deshacer su
git commit —amend
git reset --soft HEAD^
git checkout files_from_old_commit_on_branch
git pull origin your_branch_name
====================================
Ahora sus cambios son como los anteriores. Así que ya terminaste de deshacer
git commit —amend
Ahora puedes hacerlo
git push origin <your_branch_name>
, empujar a la rama.fuente
Casi 9 años tarde a esto, pero no vi esta variación mencionada logrando lo mismo (es una especie de combinación de algunos de estos, similar a la respuesta principal ( 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 lo revertirá a la antigua confirmación por completo.
(Incluyendo la fecha de la cabeza de compromiso separada sobrescrita anterior)
fuente
--soft
para mantener mis cambios. Solo quiero que se cometa por separadoPago a sucursal temporal con la última confirmación
git branch temp HEAD@{1}
Restablecer la última confirmación
git reset temp
Ahora, tendrá todos los archivos de su confirmación, así como la confirmación anterior. Verifique el estado de todos los archivos.
git status
Restablezca sus archivos de confirmación desde la etapa git.
git reset myfile1.js
(pronto)Vuelva a adjuntar este compromiso
git commit -C HEAD@{1}
Agregue y confirme sus archivos a una nueva confirmación.
fuente