que - git tag name
Revertir confirmaciones específicas de git (2)
Hay dos casos aquí:
Cuando ya has empujado tu árbol git a algún lado y no quieres cambiar el historial. En este caso, necesitará una nueva confirmación que exprese los cambios que realizó al revertir las confirmaciones anteriores. Deberías usar la respuesta de @mamapitufo.
Si nunca ha presionado la rama donde están los cambios, y puede cambiar el historial. En este caso, puede eliminar completamente las confirmaciones no deseadas. Esto negará la historia y significa que no se desvía hacia sus compañeros de trabajo o el público.
En el segundo caso, debes hacer git rebase -i
. Encuentra una confirmación antes del historial que deseas cambiar. Este podría ser el hash de la confirmación o el nombre de la rama o etiqueta. Por ejemplo, podrías hacer
git rebase -i 23def8231
o si comenzó desde la rama origin/dev_branch
e hizo el trabajo que incluye los bits para eliminar en su rama llamada dev_branch
, podría hacer
git rebase -i origin/dev_branch
Ahora, se le enviará a una ventana del editor donde puede ver una lista de todas las confirmaciones que está modificando. Esto podría ser vim
: si no edita habitualmente en el terminal, podría establecerse como el predeterminado. Probablemente necesites una guía de inicio rápido para vim y una mente abierta si ese es el caso.
Ahora, lo más fácil es eliminar commits. Para ello, borre la línea o agregue un #
que indique un comentario al inicio de la línea. (Ya hay algunos comentarios en el archivo para explicarle las cosas. Ignorarlos o eliminarlos no tiene ningún efecto).
Cuando haya terminado, guarde el archivo y salga del editor. La rebase sucede así: git vuelve al commit que nombraste. Pasa por la lista que guardó y reproduce cada confirmación en esa lista. Luego hace que el resultado de ese proceso sea la nueva versión de la rama en la que estaba originalmente.
Cosas importantes para recordar:
- Si se pierde o elimina demasiadas líneas, puede cancelar la rebase eliminando cada línea de confirmación en el archivo y guardando. El proceso de rebase finalizará sin ningún cambio en absoluto.
- Es posible crear conflictos. Por ejemplo, si elimina una confirmación que edita un archivo, y lo deja en una confirmación posterior que edita el mismo lugar. La confirmación posterior ahora no se aplicará correctamente y tendrá que editar a mano o en una herramienta de combinación para obtener la versión que desee.
También puedes hacer muchas otras manipulaciones en git rebase -i
. Por ejemplo, cambiar el orden de los commits, aplastar varios juntos en uno, agregar cambios adicionales entre commits o cambiar los mensajes. Es muy útil. El caso de uso clásico es limpiar su sucursal local antes de volver a enviarla a un lugar donde otras personas verán sus cambios.
Tengo un árbol git con muchos commits y muchos archivos. Ahora, quiero revertir confirmaciones específicas que solo tocan un archivo. Para explicar:
> git init
Initialized empty Git repository in /home/psankar/specific/.git/
> echo "File a" > a
> git add a ; git commit -m "File a"
[master (root-commit) 5267c21] File a
1 file changed, 1 insertion(+)
create mode 100644 a
> echo "File b" > b
> git add b; git commit -m "File b"
[master 7b560ae] File b
1 file changed, 1 insertion(+)
create mode 100644 b
> echo "File c" > c
> git add c; git commit -m "File c"
[master fd6c132] File c
1 file changed, 1 insertion(+)
create mode 100644 c
> echo "b and c modified" > b ; cp b c
> git commit -a -m "b and c modified"
[master 1d8b062] b and c modified
2 files changed, 2 insertions(+), 2 deletions(-)
> echo "a modified" > a
> git commit -a -m "a modified"
[master 5b7e0cd] a modified
1 file changed, 1 insertion(+), 1 deletion(-)
> echo "c modified" > c
> git commit -a -m "c modified"
[master b49eb8e] c modified
1 file changed, 1 insertion(+), 1 deletion(-)
> git log --pretty=oneline c
> git log --pretty=oneline c | cat
b49eb8e03af331bddf90342af7d076f831282bc9 c modified
1d8b062748f23d5b75a77f120930af6610b8ff98 b and c modified
fd6c13282ae887598d39bcd894c050878c53ccf1 File c
Ahora quiero revertir solo los dos commits b49eb8 y 1d8b06 sin revertir los cambios a a. IOW revierte solo las confirmaciones en un archivo (sin revertir otras confirmaciones intermedias (que pueden ser miles) en archivos diferentes) ¿Cómo es posible?
Puedes usar git revert
con la --no-commit
. En tu ejemplo:
$ git revert --no-commit b49eb8e 1d8b062
# Files that were modified in those 2 commits will be changed in your working directory
# If any of those 2 commits had changed ''a'' then you could discard the revert for it:
$ git checkout a
$ git commit -a -m "Revert commits b49eb8e and 1d8b062"
Si no proporciona un mensaje de confirmación, entonces estará disponible un mensaje preparado cuando se inicie el editor de mensajes de confirmación.
Si omite la --no-commit
, los cambios en las confirmaciones que especifique se revertirán. Esto se logra aplicando el reverso de los cambios en las confirmaciones especificadas y cometiendo eso. Esto da como resultado un nuevo compromiso, tanto el original como el compromiso revertido estarán en la historia de su repositorio.