trucos tag que name hace conectar con commits commands comentarios codigos git github git-rebase revert git-revert

que - git tag name



Revertir confirmaciones específicas de git (2)

Hay dos casos aquí:

  1. 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.

  2. 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.