2011-02-14 22 views
10

Tengo una gran fusión con más de 300 archivos en conflicto. Quiero resolver esto usando mergetool, pero no hay forma de que termine todo de una vez. ¿Cómo puedo comprometer la fusión y luego volver más tarde y continuar la misma fusión? Normalmente parece que git no te permite comprometerte si hay conflictos en el índice.Cómo comprometer una fusión larga de Git en el medio de resolver conflictos

+1

Tampoco se puede esconder. :( –

Respuesta

11

Supongo que por "no puedo hacerlo de una sola vez" en realidad quieres decir "quiero hacer otras cosas antes de terminar", ya que de lo contrario podrías dejar la fusión parcialmente resuelta en tu árbol de trabajo.

En primer lugar, antes de tener problemas, tenga en cuenta que simplemente podría crear otro clon del repositorio: la fusión parcialmente resuelta puede permanecer en uno, y puede hacer otro trabajo en otro.

Dicho todo esto, si realmente desea guardar el trabajo que ha realizado para resolver parcialmente una fusión, mi mejor sugerencia es usar git rerere (REuse REsolutions reordenados).

Para comenzar, asegúrese de que rerere.enabled esté configurado en verdadero, que cubrirá la mayoría de los casos de uso normal. Provoca que git rerere se ejecute automáticamente inmediatamente después de que sucedan los conflictos de fusión; en ese momento, verá mensajes del formulario Recorded preimage for '<path>'. También se ejecuta automáticamente cuando se compromete una combinación; luego verá los mensajes del formulario Recorded resolution for '<path>'.. Las resoluciones se pueden reutilizar más adelante cuando aparezcan los mismos trozos en conflicto.

Ahora, en su caso de uso, se producirá el primer disparo automático: se grabarán las preimágenes. Pero no está listo para comprometer su fusión, por lo que después de resolver algunos archivos en conflicto y marcarlos como resueltos (agregándolos al índice) puede ejecutar git rerere (sin argumentos) directamente. Grabará las resoluciones de todo lo que haya marcado como resuelto, pero ignorará lo que aún no se haya resuelto. A continuación, puede simplemente destruir el intento de fusión (git reset --merge), y la próxima vez que lo intente, las resoluciones grabadas se reutilizarán.

+1

Wow, eso es increíble. Quise decir que no quiero dejar un montón de cambios no comprometidos en mi máquina de desarrollo por días en caso de un desastre. Prefiero hacer los empujones regulares para la copia de seguridad como copia de seguridad y para que los colaboradores puede ver mi trabajo. Después de leer la página man, parece que los cambios 'rerere' se registran localmente. ¿Hay alguna forma de almacenarlos en una confirmación? Además, ¿tienes alguna idea de si puedo activar esto mientras estoy en en el medio de una combinación? –

+0

@Reed: Hm. Va a ser complicado usar 'rerere' si aún no estaba habilitado; lo único que se me ocurre es volver a hacer la fusión en un clon y copiar las cosas ya lo has resuelto. Y como dices, es un almacenamiento local. Por proponer una fusión parcial en forma de compromiso ... honestamente, lo descartaría: volcar una lista de los conflictos no resueltos (de 'git status' o' git estado --porcelain', por ejemplo), luego agrega todo como si estuviera arreglado, y confírmalo, en el entendido de que ser enmendado más tarde antes de ser verdaderamente publicado. – Cascabel

+0

@Reed: para que sea un poco menos complicado, puede comprometerse en dos pasos: resolver algunos conflictos, agregarlos y 'reiniciar HEAD 'todo lo demás. Luego, cuando te comprometas, estarás cometiendo una fusión con contenido resuelto únicamente, y todas las cosas no resueltas quedarán tal como estaban antes de la fusión. A continuación, puede agregar todas las cosas sin clasificar (previamente en conflicto) y confirmarlas como una segunda confirmación. Para trabajar en ello más adelante, puede verificar el segundo compromiso y hacer un restablecimiento mixto (al primer commit (fusión) ('git reset HEAD ^'), luego comenzar a trabajar de nuevo, sabiendo que todas las "modificaciones locales" fueron conflictos. – Cascabel

Cuestiones relacionadas