vimdiff y fusionar conflictos


14

Al fusionar sucursales bajo control de origen, a menudo existe el problema de un conflicto de fusión con otros desarrolladores.

Sé que podemos usar vimdiff para diferenciar los cambios de código contra el control de código fuente , pero también existe una forma de usar vimdiff para ayudar a resolver conflictos de fusión.

Personalmente, estoy más interesado en git, pero sería útil entender si hay complementos / técnicas para otras herramientas / sistemas de control de código fuente.


¿Alguna vez has probado Meld ?
Eric Sabelhaus

1
@EricSabelhaus: ¿Es mejor que vimdiff para resolver conflictos? Este sitio se trata de hacer / responder preguntas sobre vim.
Martin York

Depende del caso de uso, supongo. Si estoy trabajando en un código que vive de forma remota, seguramente usaré vimdiff. Si estoy trabajando localmente en mi máquina de desarrollo, usaré Meld, ya que proporciona una interfaz de usuario rica en funciones para ayudar al desarrollador a realizar combinaciones complejas de 3 vías.
Eric Sabelhaus

1
@EricSabelhaus: Para mí, el término feature rich UIes engañoso; vimdiff puede no tener una buena interfaz de usuario, definitivamente tiene muchas funciones. También encuentro vim un entorno mucho más productivo que todos los editores de GUI que he usado (pero lo he usado durante mucho tiempo y fue una curva de aprendizaje empinada). Tengo más curiosidad si Meld hace algo que vim no hace que haría que valiera la pena incluso mirar.
Martin York

No puedo decir específicamente si tiene un conjunto de características más robusto, pero definitivamente está en el mismo ámbito que vimdiff.
Eric Sabelhaus

Respuestas:


18

Normalmente uso git en la línea de comando.

Pero cuando hay un conflicto de fusión, uso Vim para resolverlos (personalmente lo hago con el complemento fugitivo). Nota: fugitivo es bueno para mucha manipulación de git desde Vim. Mi característica favorita es la diferencia de 3 vías de un conflicto de fusión.

git admite esto en vimdiff a través de git mergetool. He instalado fugitivo pero puedes configurarlo manualmente (Gracias @ Jay Thompson).

Configuración manual:

git config --global merge.tool vimdiff
git mergetool <file with conflicts>

El resultado es ligeramente diferente al que se describe a continuación (no lo he usado personalmente). Pero el principio es el mismo, pero tiene una cuarta ventana en la parte inferior que contiene el resultado.

ingrese la descripción de la imagen aquí

Configurar con fugitivo

vim-fugitive es un complemento git wrapper / integración para Vim; puede hacer muchas cosas, y resolver conflictos es una de ellas.

<Install the Fugitive Plugin>
vim <file with conflicts>
:Gdiff
  1. Vista 2 (izquierda): el código que estaba en su sucursal.
  2. Vista 1 (centro): el código combinado (con conflictos)
  3. Vista 3 (derecha): el código que se fusionó con su código.

Ahora puede extraer y obtener texto de las otras dos vistas en la vista central (que contendrá todas las correcciones manuales). Una vez que haya resuelto todos los conflictos manualmente, simplemente salga de vimdiff

ingrese la descripción de la imagen aquí

Aunque puede usar :diffget <view number>y :diffput <view number>para tirar y empujar cosas entre las vistas. Personalmente no me parece muy útil. Todo el código ya está en la vista central. Así que solo me gusta editar esa vista manualmente hasta que se resuelva el conflicto. Sin embargo, poder ver ambas versiones del código a ambos lados de la ventana de mi editor es extremadamente útil.

También una muy buena demostración de su uso aquí


1
Si no desea usar o instalar Fugitive por alguna razón, también puede simplemente configurar git config --global merge.tool vimdiffy luego ejecutar git mergetoolpara iniciar vim en modo diff.
Jay Thompson

¿Esto es compatible con el estilo "diff3" de conflictos de fusión, donde se muestran los "ancestros comunes fusionados"?
alxndr

@alxndr: no había oído hablar de diff3 antes. Pero después de un rápido google. El resultado de un conflicto de fusión en git (y otro control de fuente que he usado) es el mismo que a diff3 -E. Entonces, las imágenes anteriores se generan a partir de archivos que tienen estos marcadores en ellas.
Martin York

Ahora que miro de cerca, la primera captura de pantalla muestra el estilo de fusión diff3; el panel superior central "BASE" es el ancestro común, del cual se separaron los paneles izquierdo y derecho.
alxndr

1
Es importante recordar que cada una de estas 4 vistas es solo un búfer. Esto significa que puede abrir otra pestaña (o incluso permanecer en la misma ventana) y elegir solo los buffers que desea ver en un momento dado. No hay razón para mantener las 4 ventanas abiertas a la vez si no las está usando todas.
Cody Poll
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.