¿Cómo uso vimdiff para resolver un conflicto?


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

introduzca la descripción de la imagen aquí

Author: hichris123, 2013-02-16

2 answers

Los cuatro búferes proporcionan una vista diferente del mismo archivo. El búfer superior izquierdo (LOCAL) es cómo se veía el archivo en su rama de destino (en lo que está fusionando). El búfer superior derecho (REMOTO) es cómo se veía el archivo en su rama de origen (desde donde se está fusionando). El búfer central (BASE) es el ancestro común de los dos (por lo que puede comparar cómo las versiones izquierda y derecha han divergido entre sí).

Puedo equivocarme en el siguiente punto. Creo que la fuente de la el conflicto de fusión es que ambos archivos han cambiado la misma porción del archivo desde BASE; LOCAL ha cambiado las comillas de doble a simple, y REMOTE 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 REMOTE; solo sabe que LOCAL ha hecho cambios desde BASE en los mismos lugares que REMOTE tiene).

En cualquier caso, el búfer 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. Extrae los cambios del LOCAL si no quieres los cambios REMOTOS. Extrae los cambios del CONTROL REMOTO si los prefieres a los cambios LOCALES. Tire de la BASE si cree que tanto el CONTROL REMOTO como el LOCAL están equivocados. ¡Haz algo completamente diferente si tienes una idea mejor! Al final, el los cambios que hagan aquí son los que realmente serán comprometidos.

 109
Author: chepner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-05 10:06:21

La respuesta de@chepner es genial, me gustaría añadir algunos detalles sobre "cómo debo proceder para solucionar el conflicto de fusión" parte de la pregunta. Si nos fijamos en cómo utilizar realmente vimdiff en este caso, va 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 presione Enter. (ver también Cómo salir del editor Vim?). Git te preguntará si fusionar estaba completo, responder con n.


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

  • navegue hasta el búfer inferior (resultado de fusión): Ctrl-W j
  • navegar a la siguiente diff con j/k; o, mejor, utilizar ] c y [ c para navegar a la siguiente y anterior diff respectivamente
  • uso z o, mientras que en un pliegue para abrirlo, si quieres ver más de contexto
  • para cada diferencia, según la respuesta de @chepner, puede obtener la versión del código de la versión local, remota o base, o editarla y rehacerla como mejor le parezca
    • para obtenerlo de la versión local, use :diffget LO
    • desde remoto: :diffget RE
    • desde la base: :diffget BA
    • o, si desea editarse, obtenga una versión de local/remote/base primero, y luego vaya al modo de inserción y edite 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 la confirmación de fusión

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

 22
Author: Timur,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-25 16:52:05