git conflict revert git-revert

git revertir varios compromisos específicos



conflict git-revert (1)

Prueba de cordura

Primero, tenga en cuenta que git revert revierte sus parches en el orden en que se enumeran sus hashes; debe enumerar los hashes de más reciente a más antiguo, ya que desea avanzar hacia atrás en el tiempo. Entonces, voy a llamar a tus hashes

<hash1> ... <hashN>

donde <hash1> es anterior a <hash2> ... es anterior a <hashN> . Entonces, asegúrate de que estabas haciendo

git revert <hashN> ... <hash1>

¡en primer lugar!

Solución fácil

Segundo, asumiendo que los ha estado revertiendo en el orden correcto, pruebe la --no-commit :

git revert --no-commit <hashN> ... <hash1>

Solución más complicada

Tercero, si la solución fácil no funciona bien, pero los compromisos que desea revertir realmente tienen sentido como un solo compromiso (si no veo muchas esperanzas), intente esto: construya un gran compromiso a partir de Cuatro quieres revertir, y luego revertir la gran confirmación.

  1. Construye el gran compromiso:

    Crea una rama en el padre de la confirmación más antigua:

    git checkout -b big-commit <hash1>~

    Copia las confirmaciones en tu nueva rama y contraelas:

    git cherry-pick --no-commit <hash1> ... <hashN> git commit -m "Big commit"

    Ahora debería tener un gran compromiso en su sucursal big-commit .

  2. Aplique la confirmación grande en sentido inverso a la rama que está intentando revertir:

    git checkout <branch you wanted to revert on> git revert big-commit

Otra solución relativamente fácil.

Use la reorganización selectiva para reconstruir la rama en cuestión como si nunca hubiera contenido los confirmaciones no deseadas:

  1. Crea una nueva rama de rebuild para trabajar en:

    git checkout -b rebuild <branch you want to revert>

  2. Rebase de forma interactiva, eliminando los compromisos que no desea:

    git rebase -i <hash1>~

    En el editor de rebase interactivo, elimine las líneas para <hash1> ... <hashN> .

Ahora su rama de rebuild contendrá <branch you want to revert> , como si <hash1> ... <hashN> nunca haya existido. Si te topas con conflictos aquí parece que son inevitables.

Si necesita que su trabajo esté en la <branch you want to revert> y no puede simplemente git reset para que apunte a su nueva rama de rebuild :

git checkout <branch you want to revert> git reset --hard rebuild

(p. ej., porque ya lo ha hecho público), entonces puede aplicar las diferencias a <branch you want to revert> como un parche:

git co <branch you want to revert> git diff <branch you want to revert> rebuild | patch

El problema: una rama tiene buenos compromisos intercalados con los no deseados.

Intento de solución:

git revert hash5 hash8 hash9 hash23

Lo que pensé que haría esto es que aplicaría todas las confirmaciones especificadas y luego me dejaría solucionar los conflictos.

Lo que ahora creo que pasa:

  • git aplica commit hash5, en el proceso de introducción de grandes conflictos.
  • Accedo a una combinación, editando el código que quiero que parezca, preparando el escenario para más conflictos (ver el siguiente punto)
  • git aplica el hash8 de confirmación, que entra en conflicto con las ediciones realizadas en la combinación
  • Intento una fusión ... etc etc

Pregunta: ¿Cómo consigo que git aplique todos los revertimientos seguidos antes de presentarme algún posible conflicto?