Cuando hay una colisión durante git merge
, abro una herramienta de combinación llamada Meld . Abre tres archivos LOCAL, BASE y REMOTE. Como he leído LOCAL es mi rama local, BASE es un ancestro común y REMOTE es la rama que se fusionará.
Ahora a mi pregunta: ¿qué versión del archivo se usará finalmente? ¿Es a distancia? Si es así, ¿puedo editarlo como quiera, independientemente de lo que haya en la rama BASE, por ejemplo?
merge.conflictstyle
opción de configuración establecida endiff3
lugar de la predeterminadamerge
.HEAD
,<<<<<
y=====
señales, significa que no hay conflicto en absoluto. En este caso, la ventana central no estará vacía, mostrará el resultado de la fusión, pero no habrá una parte "roja"<<<<<<
,======
ni>>>>>>
marcadores en el panel central (es decir, la versión BASE); y, a veces, el panel central estará vacío, como informó aGr. Tal vez esta diferencia se deba a diferentes configuraciones. Cuando comienzo a la herramienta Meld, existirán los siguientes archivos, suponiendo que el nombre del archivo en el repositorio esX.java
:X.java
,X.java.orig
,X.java.BACKUP.#
,X.java.BASE.#
,X.java.LOCAL.#
,X.java.REMOTE.#
,, donde#
es un número. Al llamar al resultado de fusión, la versión BASE es confusa; FUSIONADO sería mejor.Meld tiene una función de fusión de 3 vías oculta activada al pasar el cuarto parámetro:
Los paneles derecho e izquierdo se abren en modo de solo lectura, por lo que no puede fusionarse accidentalmente al revés. El panel central muestra el resultado de la fusión. Para los conflictos, muestra la versión base para que pueda ver todos los bits importantes: texto original en el medio y modificaciones conflictivas en ambos lados. Finalmente, cuando presiona el botón "Guardar", se escribe el archivo $ MERGED, exactamente como lo esperaba git.
El archivo ~ / .gitconfig que uso contiene la siguiente configuración:
esto abre meld con 3 pestañas, la 1ra y 2da pestaña que contiene los diferenciales simples que estoy tratando de fusionar, y la 3ra pestaña, abierta por defecto, muestra la vista de fusión de 3 vías.
Ahora, la razón por la cual la función está oculta es que aún no está lo suficientemente pulida. Es muy útil como lo es ahora, pero Kai Willadsen, el autor de la fusión, señaló algunas arrugas que necesitan ser eliminadas. Por ejemplo, no hay GUI para iniciar el modo de fusión de 3 vías, la sintaxis de la línea de comandos es un poco arcana, y tal. Si hablas python y tienes algo de tiempo libre, ya sabes qué hacer.
Editar: en las versiones más nuevas de Meld, la sinax ha cambiado ligeramente. Esto estaba en los comentarios, pero pertenece a la respuesta.
El comando meld ahora usa la opción --output, por lo que la última línea del fragmento anterior debería ser:
fuente
--output
para el resultado $ MERGED. Descubrí esto mientras miraba el script de lanzamiento de fusión que venía con mi versión de git: github.com/git/git/blob/master/mergetools/meld--output option
. Vea esta línea en el script de lanzamiento:"$merge_tool_path" --output "$MERGED" "$LOCAL" "$BASE" "$REMOTE"
cmd = meld $LOCAL $BASE $REMOTE --auto-merge --output $MERGED
. Por lo tanto, esto abre 3 pestañas (a la antigua usanza), combina automáticamente fusiones no conflictivas en el medio, donde el medio es $ MERGED, y se usará como salida de resolución de conflictos.--output=<file>
o-o <file>
, veameld --help
Hay 4 archivos involucrados:
$LOCAL
El archivo en la rama donde se está fusionando; intacto por el proceso de fusión cuando se le muestra$REMOTE
El archivo en la rama desde donde se está fusionando; intacto por el proceso de fusión cuando se le muestra$BASE
El ancestro común de $ LOCAL y $ REMOTE, es decir. el punto donde las dos ramas comenzaron a desviar el archivo considerado; intacto por el proceso de fusión cuando se le muestra$MERGED
El archivo parcialmente fusionado, con conflictos; este es el único archivo tocado por el proceso de fusión y, en realidad, nunca se muestra enmeld
El
$MERGED
archivo es el que contiene las<<<<<<
,>>>>>>
,=====
(y, tal vez,||||||
marcadores) (que entra en conflicto delimitan). Este es el archivo que edita manualmente para corregir conflictos.La edición manual de conflictos y la edición visual de conflictos se realizan en diferentes archivos y presentan diferentes informaciones.
Cuando se utiliza el mergetool (asumir
meld
), los archivos que están viendo el mismo son:$LOCAL
,$BASE
,$REMOTE
. Tenga en cuenta que no ve el$MERGED
archivo, aunque esto se pasa como un parámetro oculto parameld
para escribir el resultado de la edición allí.En otras palabras, en
meld
, está editando el archivo en el medio, el$BASE
archivo, y selecciona todos los cambios de la izquierda o de la derecha manualmente . Es un archivo limpio, no tocado por el proceso de fusión. La única falla es que, cuando guarda, no guarda en el$BASE
archivo, pero en el cuarto parámetro oculto demeld
, ese es el$MERGED
archivo (que ni siquiera ve). El$BASE
archivo no contiene conflictos ni fusiones parciales exitosas porque no es el$MERGED
archivo .En la edición visual, al presentarle el
$BASE
archivo (en lugar del$MERGED
archivo)git
básicamente descarta todos sus intentos de hacer la fusión (esos intentos son visibles, si lo desea, en el archivo $ MERGED) y le permite hacer la fusión por completo a partir de cero .La conclusión es que en los conflictos de fusión manual y visual no está mirando los mismos archivos, pero el resultado final está escrito en el mismo archivo (ese es el
$MERGED
archivo).La corrección manual de los conflictos se realiza en
$MERGED
porquegit
no tiene medio de presentarle tres archivos, por lo que aplasta a la información de los tres archivos ($LOCAL
,$BASE
,$REMOTE
) en ese$MERGED
archivo.Pero las herramientas visuales tienen los medios para mostrarles tres archivos: te muestran los
$LOCAL
,$BASE
,$REMOTE
archivos. Usted va a recoger los cambios de las$LOCAL
y los$REMOTE
archivos y usted está trayendo a los que en el$BASE
archivo, completamente re-construcción e incluso sobrescribir el fallido intento de fusionar ese es el$MERGED
archivo.fuente
$LOCAL
,$REMOTE
,$BASE
y la salida inicialmente igual a$BASE
, pero que es diferente de$MERGED
en que no tiene el intento de git para combinar los archivos y las marcas de conflicto y así sucesivamente. De hecho, esa sería la forma de usar estas herramientas que es más similar al enfoque de 3 paneles de LOCAL / REMOTE / BASE + OUTPUT, que no se muestra combinado. El cuarto panel simplemente le permite separar la base de la salida.La solución de Cosmin funciona, pero el archivo $ BASE se actualiza, no $ MERGED . Esto actualizará el archivo $ MERGED :
Fusión:
v1.8.4
fuente
cmd = meld --auto-merge --output $MERGED $LOCAL $BASE $REMOTE
--diff $BASE $LOCAL --diff $BASE $REMOTE
al final? para mí en 1.8.4, esto funciona bien (hasta donde puedo ver):cmd = meld --auto-merge --output $MERGED $LOCAL $BASE $REMOTE
Con Meld 1.7, la solución de Tomek Bury ya no funciona.
La configuración predeterminada no me satisfizo:
En cambio para Meld> = 1.7 sugiero una de las otras dos soluciones.
Primera solución :
Segunda solución :
.gitconfig
Copie y pegue esto en su
.gitconfig
archivo para obtener las soluciones como se describe anteriormente:Copie y pegue esto en un
.gitconfig.local
archivo para configurar meld17 o meld16 solo para esta máquina en caso de que use su .gitconfig en varias máquinas:fuente
cmd = meld $LOCAL $BASE $REMOTE --auto-merge
, el panel central será el $ BASE, y no el $ MERGE que realmente se utiliza como salida de resolución de conflictos.Descubrí que ninguno de los archivos predeterminados mostrados se estaba guardando. meld se mostraba
$LOCAL
,$REMOTE
y$BASE
por defecto. Para que funcione, necesitaba hacer meld show en$MERGED
lugar de$BASE
. Poniendo esto en mi lo~/.gitconfig
arregló para mí:Estoy usando Arch, con:
fuente
Por alguna razón, las versiones más nuevas de fusión no muestran líneas de marcador agregadas para conflictos (<<<<<<<, =======, >>>>>>>). Si desea ver esas líneas, debe instalar meld v 1.3.3 o anterior.
fuente
Consulte la respuesta de Saad para obtener la respuesta correcta.
Con meld 1.8.1 en Ubuntu estaba obteniendo el
y agregando la salida - antes de que $ MERGED me lo arreglara:
fuente