solucionar salir rama partir otra funciona desde crear consola conflictos conflicto como git vim git-merge mergetool git-conflict-resolution

rama - salir de merge git



¿Cómo uso vimdiff para resolver un conflicto? (2)

Acabo de fusionar una rama con mi maestro en git y obtuve la Automatic merge failed; fix conflicts and then commit the result. Automatic merge failed; fix conflicts and then commit the result. Ahora corrí git mergetool y vimdiff se abrió con la imagen de abajo. No sé cómo usar vimdiff. ¿Qué significa cada panel aquí y cómo debo proceder para solucionar el conflicto de fusión?


La respuesta de @ chepner es genial, me gustaría agregar algunos detalles sobre la parte "¿Cómo debo proceder para solucionar el conflicto de fusión?" de la pregunta. Si observas cómo usar vimdiff en este caso, sigue a continuación.

Primero, para abordar la opción "abortar todo", si no desea usar "vimdiff" y desea abortar la fusión: presione Esc , luego escriba :qa! y presiona Enter . (ver también ¿Cómo salir del editor de Vim? ). Git luego le preguntará si la fusión se completó, responda con n .

Si desea usar vimdiff, aquí hay algunos atajos útiles. Esto supone que usted conoce los conceptos básicos de Vim (navegación e inserción / modo normal):

  • navegue al buffer inferior (resultado de fusión): Ctrl-W j
  • navega hasta la siguiente diferencia con j / k ; o, mejor, use ] c y [ c para navegar a la diferencia siguiente y anterior respectivamente
  • use z o mientras está en un pliegue para abrirlo, si desea ver más contexto
  • para cada diferencia, según la respuesta de @ chepner, puede obtener la versión de código de la versión local, remota o base, o editarla y rehacerla como lo considere oportuno
    • para obtenerlo de la versión local, use :diffget LO
    • desde remoto :diffget RE
    • desde la base :diffget BA
    • o, si desea editar usted mismo, primero obtenga una versión de local / remoto / base, y luego vaya al modo de inserción y edite el resto
  • Una vez hecho esto, guarde el resultado de la fusión y salga de todas las ventanas :wqa
  • normalmente, git detecta que se realizó la fusión y completa el compromiso de fusión

Puede buscar en Internet otros atajos de vimdiff. Encontré este útil, por ejemplo: https://gist.github.com/hyamamoto/7783966


Los cuatro almacenamientos intermedios proporcionan una vista diferente del mismo archivo. El búfer superior izquierdo (LOCAL) es cómo se veía el archivo en su rama objetivo (en qué se está fusionando). El búfer superior derecho (REMOTO) es cómo se veía el archivo en su rama fuente (desde donde se fusiona). El buffer intermedio (BASE) es el ancestro común de los dos (para que pueda comparar cómo las versiones izquierda y derecha se han separado una de la otra).

Puedo estar equivocado en el siguiente punto. Creo que el origen del conflicto de fusión es que ambos archivos han cambiado la misma parte del archivo desde BASE; LOCAL ha cambiado las comillas de doble a simple, y REMOTO ha hecho el mismo cambio pero también ha cambiado el valor de fondo de un color a una URL. (Creo que la fusión no es lo suficientemente inteligente como para notar que todos los cambios a LOCAL también están presentes en REMOTO, simplemente sabe que LOCAL ha realizado cambios desde BASE en los mismos lugares que REMOTO).

En cualquier caso, el buffer inferior contiene el archivo que realmente puede editar, el que se encuentra en su directorio de trabajo. Puede hacer los cambios que desee; vim le muestra cómo difiere de cada una de las vistas superiores, que son las áreas que la fusión automática no pudo manejar. Tire de los cambios de LOCAL si no desea que los cambios REMOTOS. Extraiga los cambios de REMOTO si prefiere los cambios LOCALES. Tire de BASE si cree que REMOTO y LOCAL están equivocados. ¡Haz algo completamente diferente si tienes una mejor idea! Al final, los cambios que realice aquí son los que realmente se comprometerán.