remove - git tag best practices
Revertir parte de un commit con git (6)
Quiero revertir un compromiso particular en git. Desafortunadamente, nuestra organización todavía usa CVS como estándar, por lo que cuando me comprometo nuevamente con CVS, múltiples commit de git se combinan en uno solo. En este caso, me encantaría destacar el commit original de git, pero eso es imposible.
¿Hay un enfoque similar al de git add --patch
que me permita editar selectivamente las diferencias para decidir qué partes de un compromiso revertir?
He utilizado lo siguiente con éxito.
Primero revierte la confirmación completa (la pone en el índice) pero no la comprometes.
git revert -n <sha1> # -n is short for --no-commit
A continuación, elimine interactivamente los cambios GOOD revertidos del índice
git reset -p # -p is short for --patch
A continuación, confirme la diferencia inversa de los malos cambios
git commit -m "Partially revert <sha1>..."
Finalmente, los cambios BUENOS revertidos (que no han sido evaluados por el comando de reinicio) todavía están en el árbol de trabajo. Ellos necesitan ser limpiados. Si no quedan otros cambios no confirmados en el árbol de trabajo, esto puede hacerse por
git reset --hard
Otra alternativa (si su versión actual de un archivo no está muy lejos de la versión que intenta revertir) es obtener el hash de la confirmación inmediatamente anterior a la que desea revertir parcialmente (desde el git log
). Entonces tu comando se convierte en:
$ git checkout -p <hash_preceding_commit_to_revert> -- file/you/want/to/fix.ext
Esto cambia los archivos en su árbol de trabajo, pero no crea commits, así que si realmente git reset --hard -- file/you/want/to/fix.ext
puede volver a empezar con git reset --hard -- file/you/want/to/fix.ext
.
Personalmente, prefiero esta versión, que reutiliza el mensaje de confirmación generado automáticamente y le da al usuario la oportunidad de editar y pegar la palabra "Parcialmente" antes de comprometerse finalmente.
# generate a revert commit
# note the hash printed to console on success
git revert --no-edit <hash to revert>
# undo that commit, but not its changes to the working tree
# (reset index to commit-before-last; that is, one graph entry up from HEAD)
git reset HEAD~1
# interactively add reversions
git add -p
# commit with pre-filled message
git commit -c <hash from revert commit, printed to console after first command>
# reset the rest of the current directory''s working tree to match git
# this will reapply the excluded parts of the reversion to the working tree
# you may need to change the paths to be checked out
# be careful not to accidentally overwrite unsaved work
git checkout -- .
Puede usar git-revert -n, y luego usar add --patch para seleccionar hunks.
Solución:
git revert --no-commit <commit hash>
git reset -p # every time choose ''y'' if you want keep the change, otherwise choose ''n''
git commit -m "Revert ..."
git checkout -- . # Don''t forget to use it.
Utilice la --no-commit
( -n
) para git revert
, luego quite la imagen de los cambios, luego use git add --patch
:
$ git revert -n $bad_commit # Revert the commit, but don''t commit the changes
$ git reset HEAD . # Unstage the changes
$ git add --patch . # Add whatever changes you want
$ git commit # Commit those changes
Nota: Los archivos que agrega usando git add --patch son los archivos que desea revertir, no los archivos que desea conservar.