Acabo de fusionar una rama en mi maestro 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 a continuación. No sé cómo usar vimdiff. ¿Qué significa cada panel aquí y cómo debo proceder para solucionar el conflicto de fusión?
159
Respuestas:
Los cuatro buffers proporcionan una vista diferente del mismo archivo. El búfer superior izquierdo (LOCAL) es el aspecto del archivo en su rama de destino (en lo que se está fusionando). El búfer superior derecho (REMOTO) es el aspecto del archivo en su rama de origen (desde donde se está fusionando). El buffer intermedio (BASE) es el ancestro común de los dos (por lo que puede comparar cómo las versiones izquierda y derecha se han separado entre sí).
Puedo estar equivocado en el siguiente punto. Creo que la fuente 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 REMOTE ha realizado 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 realizado cambios desde BASE en los mismos lugares que REMOTE).
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. Extraiga los cambios de LOCAL si no desea los cambios REMOTOS. Extraiga los cambios desde REMOTO si lo prefiere a los cambios LOCALES. Tire de BASE si cree que tanto REMOTE como LOCAL están equivocados. ¡Haz algo completamente diferente si tienes una idea mejor! Al final, los cambios que realice aquí son los que realmente se comprometerán.fuente
:x
o:w
(:x
también sale) más 'volver'.vim
.La respuesta de @ chepner es excelente, me gustaría agregar algunos detalles sobre la parte de la pregunta "¿cómo debo proceder para solucionar el conflicto de fusión?" Si observa cómo usar realmente vimdiff en este caso, se detalla 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. (vea también ¿Cómo salgo del editor Vim? ). Git le preguntará si la fusión se completó, responda conn
.Si desea usar vimdiff, aquí hay algunos atajos útiles. Esto supone que conoce los conceptos básicos de Vim (navegación e inserción / modo normal):
:diffget LO
:diffget RE
:diffget BA
:wqa
:cquit
: ¿Cómo cancela un git diff externo?No parece posible agregar trozos de conflicto locales y remotos sin pegar copias o accesos directos personalizados: /vi/10534/is-there-a-way-to-take-both- when-using-vim-as-merge-tool, que es una pena, ya que add add es un tipo de conflicto tan común.
Para evitar que vimdiff le pida que presione enter cada vez que se inicia, agregue a su
.vimrc
:como se menciona en: /vi/771/how-can-i-suppress-the-press-enter-prompt-when-opening-files-in-diff-mode
Puede buscar en Internet otros atajos de vimdiff. He encontrado este útil: https://gist.github.com/hyamamoto/7783966
fuente
:diffget
.La mejor herramienta de combinación para reemplazar vimdiff
Esto es algo irónico, pero es a lo que terminé convergiendo como vimmer después de probar vimdiff.
Para resolver un conflicto de fusión, lo que casi siempre necesito es ver:
para luego tratar de juntarlos a ambos.
Mientras que vimdiff muestra BASE, LOCAL y REMOTE en la pantalla:
No sé cómo hacer que muestre claramente esos dos diferenciales que necesito además de mirar a la derecha, a la izquierda, a la izquierda, varias veces.
Además, LOCAL y REMOTO ya son visibles en los marcadores de conflicto de git merge, por lo que no obtengo mucho de una herramienta que los muestra nuevamente.
Por lo tanto, en su lugar, creé mi propio "difftool" pequeño que realmente muestra los diffs que me faltaba:
~ / bin / cirosantilli-mergetool
GitHub aguas arriba .
E instálalo con:
Ahora, cuando lo haces:
muestra los dos diferenciales que quiero en el terminal, por ejemplo, algo junto:
Entonces puedes ver aquí los dos diferenciales descargados en la terminal:
RealView_BASE_15560.py
vsRealView_LOCAL_15560.py
RealView_BASE_15560.py
vsRealView_REMOTE_15560.py
Si las diferencias son grandes, solo buscaré mis superpoderes tmux .
Sí, usted pierde algunos accesos directos que proporciona vimdiff, pero en general la resolución de conflictos requiere copiar y pegar cuidadosamente las dos versiones, lo que puedo hacer bien dentro de una sesión vim normal con los marcadores de conflicto git.
Observar y diferenciar archivos mientras se
vimdiff
está ejecutandoAntes de sentarme y automatizar mi configuración perfecta
cirosantilli-mergetool
, esto es lo que estaba haciendo para obtener los dos diferenciales que necesitaba.Mientras se
git mergetool
está ejecutandovimdiff
, si hay un conflicto en un archivo llamado, digamosmain.py
, git genera archivos para cada una de las versiones, nombradas como:en el mismo directorio
main.py
donde1367
está el PID de git mergetool y, por lo tanto, un entero "aleatorio", como se menciona en: En un conflicto de git merge, ¿cuáles son los archivos BACKUP, BASE, LOCAL y REMOTE que se generan?Entonces, para ver las diferencias que quiero, primero encuentro los archivos generados
git status
y luego abro nuevos terminales y hago un vimdiff entre los pares de archivos que me interesan:Juntos con
git mergetool
, esta información ayuda MUCHO a descubrir lo que está sucediendo rápidamente!Además, incluso mientras se está ejecutando mergetool, solo puede abrir el archivo:
directamente y edítelo allí si cree que va a ser más fácil con una ventana de editor más grande.
Salta directamente para fusionar conflictos
Mientras
]c
salta al siguiente punto de diferencia dentro de vimdiff, no siempre hay un conflicto de fusión allí.Para ayudar con esto, tengo en mi
~/.vimrc
:que encuentra los conflictos directamente.
git imerge
Quizás la mejor opción es simplemente renunciar al uso de vimdiff y confiar en vim + git imerge regular, que se mencionó en: ¿Cómo puedo averiguar qué compromisos de Git causan conflictos? dado que la curva de aprendizaje de vimdiff es molesta y no cumple las funciones que más necesitamos.
fuente