Se fusionó accidentalmente en la rama equivocada a la mía. ¿Hay alguna manera de eliminar estos archivos no deseados?

5 minutos de lectura

avatar de usuario
DerretirPerro

Accidentalmente fusioné la rama de un compañero de trabajo con la rama en la que estaba trabajando. He realizado varias confirmaciones desde entonces, por lo que idealmente no quiero volver al estado en el que se encontraba la rama antes de la fusión. Sin embargo, no he hecho nada que haya alterado sus archivos.

¿Hay alguna manera de eliminar los archivos de su sucursal de la mía?

(Lo siento, soy nuevo en git, espero haber entendido la terminología).

Quizás la opción más fácil y segura aquí sería revertir la confirmación de combinación que realizó hace algunas confirmaciones. Para hacer esto, busque la confirmación de fusión en su historial usando git logy registre el hash SHA-1 de esa confirmación. Luego, haz lo siguiente:

git revert -m 1 <SHA-1>

Aquí <SHA-1> es el hash de la confirmación de combinación que desea deshacer. los -m 1 La opción le dice a Git que vuelva al primer padre, que es la rama en la que se originó la fusión, que debería ser su rama.

  • Como nuevo usuario de git, muchas gracias por incluir el significado de <SHA-1> y -m 1.

    – Perro derretido

    16 de febrero de 2017 a las 1:26

  • El inconveniente de esto es que Git todavía cree que la fusión ocurrió (¡porque sucedió!), por lo que esto puede causarle acidez más adelante si desear fusionar.

    – torek

    16 de febrero de 2017 a las 1:28

Si no ha enviado (publicado) sus confirmaciones en ninguna parte, la solución más simple es reorganizar la fusión. (Puedes hacer esto incluso si tener los publicó, pero vea la advertencia.)

El comando git rebase copias se compromete, pero por defecto, descartes fusionar confirmaciones. El objetivo normal de git rebase es copiar confirmaciones para que vengan en un punto diferente. Por ejemplo, podrías tener esto:

...--o--*--o--o     <-- master
         \
          A--B--C   <-- yourbranch

en su repositorio después de recoger algunos nuevos master confirma desde algún repositorio “upstream” (origin), y ahora le gustaría hacer su A-B-C secuencia viene después de la última confirmación en masteren lugar de venir después de cometer * (comprometerse * es el primer compromiso que está en ambas cosas master y yourbranch).

Entonces tú git checkout yourbranch && git rebase master y Git copia los compromisos a otros nuevos, A'-B'-C' (copias de los originales), y tira los viejos:

                A'-B'-C'   <-- yourbranch
               /
...--o--*--o--o     <-- master
         \
          A--B--C   [abandoned]

Pero desde git rebase normalmente descartes se fusiona, puede volver a la base donde está ahora y, en el proceso, descartar una fusión:

...--o--*--o--o--o--...
         \     \
          A--B--X--C--D   <-- yourbranch

Aquí, su confirmación de fusión X es un error y deseas deshacerte de él (lo he dibujado como fusionando la línea principal, pero podría fusionar algo más, en realidad no importa qué te fusionaste, solo eso es una confirmación de combinación, con dos flechas que apuntan hacia atrás saliendo de él, cuando Git lo mira). Entonces encuentras el ID hash de commit * y correr:

git checkout yourbranch; git rebase <hash-id>

Git enumera las confirmaciones para copiar como “aquellas después de *hasta la punta de yourbrancha excepción de las fusiones”. Eso es A-B-C-D. Luego “copia” A (no es necesario, por lo que en realidad reutiliza el original A por defecto), “copias” B (de nuevo, no es necesario), copias C (tiene que esta vez—el original C se conecta a X y el nuevo debe conectarse en su lugar a B), y copias Dhaciendo yourbranch apunte al último compromiso copiado y abandone la cadena anterior:

...--o--*--o--o--o--...
         \     \
          A--B--X--C--D  [abandoned]
              \
               C'-D'  <-- yourbranch

Con D abandonados, los tres D, C y X simplemente desaparezca del mapa por completo:

...--o--*--o--o--o--...
         \
          A--B
              \
               C'-D'  <-- yourbranch

Con C y D habiendo desaparecido, ni siquiera necesitamos el C' y D' marcas Sin embargo, los dejaré y simplemente arreglaré el problema que ya no necesitamos:

...--o--*--o--o--o--...
         \
          A--B--C'-D'  <-- yourbranch

El mensaje de compromiso para C' parece el de Cy el de D' parece el de D; y C' y D' son “tan buenos como” los originales o, en realidad, incluso mejores: son ¡nuevo y mejorado! 🙂 porque omiten las cosas fusionadas.

Advertencia: porque estos son “nuevo y mejorado”, tienen nuevos ID de hash. Esto significa que si los tienes publicados, cualquiera que tenga los viejos todavía los tendrá, y los reconocerá por sus identificaciones hash antiguas. Ahora debe convencer a estos otros usuarios de Git, con sus otros repositorios, para tomar las copias nuevas y mejoradas y deseche las viejas y malas, tal como lo hizo usted.

Si usted no he publicado estos compromisos en cualquier lugar, nadie más tiene los antiguos, y no hay nada de qué preocuparse.


Tenga en cuenta, por cierto, que puede git rebase en una nueva base, tal como lo haría para actualizar a la última master. Esto solo copia todos las confirmaciones (en la nueva ubicación), en lugar de reutilizar las confirmaciones que pueda (en la ubicación anterior) y copiar el resto. (Pero enfrentará cualquier problema relacionado con la actualización cuando haga esto, tal como lo haría con cualquier reorganización. Es decir, si quien actualizó mastero lo que sea que esté actualizando, tocó el mismo código en el mismo archivos, tendrá que resolver los conflictos de combinación que se produzcan. Si solo está eliminando una combinación y no hubo conflictos de combinación en la combinación, no habrá ninguno en la reorganización).

  • Gracias por publicar esto, muy útil. +1

    – Tim Biegeleisen

    16 de febrero de 2017 a las 1:52


¿Ha sido útil esta solución?