Lo que debe hacer es crear un nuevo commit con los mismos detalles que el HEADcommit actual , pero con el padre como la versión anterior de HEAD. git reset --softmoverá 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 reflogpara 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@1debe 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 reflogfuente
HEAD@{1}yHEAD~1?HEAD~1es 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
--patchpara 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
--soften 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 refloges todo lo que necesitasgit resetlugar 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 --amendcomando.fuente
Tal vez pueda usar
git reflogpara obtener dos commit antes de enmendar y después de enmendar.Luego usa
git diff before_commit_id after_commit_id > d.diffpara obtener diferencias entre antes de enmendar y después de enmendar.Siguiente uso
git checkout before_commit_idpara volver a antes de confirmarY ultimo uso
git apply d.diffpara 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 logpara 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 —amendgit reset --soft HEAD^git checkout files_from_old_commit_on_branchgit pull origin your_branch_name====================================
Ahora sus cambios son como los anteriores. Así que ya terminaste de deshacer
git commit —amendAhora 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=relativeLuego encuentra el hash SHA1
Restablecer a viejo SHA1
git reset --hard SHA1Luego empújalo hacia arriba.
git push origin BRANCH_NAMEHecho.
Esto lo revertirá a la antigua confirmación por completo.
(Incluyendo la fecha de la cabeza de compromiso separada sobrescrita anterior)
fuente
--softpara 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 tempAhora, tendrá todos los archivos de su confirmación, así como la confirmación anterior. Verifique el estado de todos los archivos.
git statusRestablezca 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