repositorio - git push tag
¿Qué versión del archivo git finalmente se utilizará: LOCAL, BASE o REMOTO? (8)
Cuando hay una colisión durante la git merge
, abro una herramienta de fusión llamada Meld . Abre tres archivos LOCAL, BASE y REMOTO. Como leí LOCAL es mi rama local, BASE es antecesor común y REMOTO es la rama que se fusionará.
Ahora a mi pregunta: ¿qué versión del archivo finalmente se utilizará? ¿Es REMOTO? Si es así, ¿puedo editarlo como quiera, independientemente de lo que haya en la rama BASE, por ejemplo?
Con Meld 1.7, la solución de Tomek Bury ya no funciona.
La configuración predeterminada no me satisfacía:
En cambio, para Meld> = 1.7 sugiero una de las otras dos soluciones.
Primera solución :
meld $LOCAL $BASE $REMOTE --auto-merge
Segunda solución :
meld $LOCAL $MERGED $REMOTE
.gitconfig
Copie y pegue esto en su archivo .gitconfig
para obtener las soluciones como se describió anteriormente:
[merge]
tool = meld16
[mergetool "meld17"]
# use this for Meld >=1.7
# see http://.com/a/22911793/859591
# second solution:
cmd = meld $LOCAL $MERGED $REMOTE
# first solution:
#cmd = meld $LOCAL $BASE $REMOTE --auto-merge
[mergetool "meld16"]
cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE --output $MERGED
[include]
# requires git v1.7.10+
path = .gitconfig.local
Copie y pegue esto en un archivo .gitconfig.local
para establecer meld17 o meld16 solo para esta máquina en caso de que use su .gitconfig en varias máquinas:
# This is a host specific config file!
# Note that git 1.7.10+ is needed
# http://.com/a/9733277/859591
[merge]
tool = meld17
Descubrí que ninguno de los archivos predeterminados mostrados se estaba guardando. meld mostró $LOCAL
, $REMOTE
y $BASE
de forma predeterminada. Para hacerlo funcionar, necesitaba hacer $MERGED
show $MERGED
lugar de $BASE
. Al poner esto en mi ~/.gitconfig
solucioné para mí:
[merge]
tool = mymeld
[mergetool "mymeld"]
cmd = meld "$LOCAL" "$MERGED" "$REMOTE"
Estoy usando Arch, con:
$ git --version
git version 1.8.2
$ meld --version
meld 1.7.1
Es el que está en el medio: BASE
.
De hecho, BASE
no es el ancestro común, sino la fusión a medio terminar donde los conflictos se marcan con >>>>
y <<<<
.
Puede ver los nombres de los archivos en la parte superior de la ventana de edición de meld.
Ver la captura de pantalla aquí
Puede editar el archivo BASE
como lo desee con o sin el uso de comandos de fusión.
También puede deshacerse de Meld y simplemente edite el archivo con su editor de texto favorito.
- El código entre los
<<<< HEAD
y=====
es el de su archivo local antes de la fusión. - El código entre
====
y>>>> <branch name>
es el del archivo remoto.
Hay 4 archivos involucrados:
$LOCAL
El archivo en la rama donde se está fusionando; no tocado por el proceso de fusión cuando se le muestra$REMOTE
El archivo en la rama desde donde se fusiona; no tocado por el proceso de fusión cuando se le muestra$BASE
El antecesor común de $ LOCAL y $ REMOTO, es decir. el punto donde las dos ramas comenzaron a desviar el archivo considerado; no tocado 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 te mostró enmeld
El archivo $MERGED
es el que contiene los marcadores <<<<<<
, >>>>>>
, =====
(y, tal vez, ||||||
) (que delimitan los conflictos). Este es el archivo que edita manualmente para corregir conflictos.
La edición manual de conflictos y la edición de conflictos visuales se realizan en diferentes archivos y presentan diferentes informaciones.
Al usar mergetool (assume meld), los archivos que se ven en él son: $LOCAL
, $BASE
, $REMOTE
. Tenga en cuenta que no ve el archivo $MERGED
, aunque esto se pasa como un parámetro oculto para meld
y escribir allí el resultado de la edición.
En otras palabras, en meld
, estás editando el archivo en el medio, el archivo $BASE
, y eliges todos los cambios desde la izquierda o desde la derecha manualmente . Es un archivo limpio, no tocado por el proceso de fusión. El único problema es que, al guardar, no se guarda en el archivo $BASE
, sino en el cuarto parámetro oculto de meld
, que es el archivo $MERGED
(que ni siquiera se ve). El archivo $BASE
no contiene conflictos ni fusiones parciales exitosas porque no es el archivo $MERGED
.
En la edición visual, al presentarle el archivo $BASE
(en lugar del archivo $MERGED
), git
básicamente descarta todos sus intentos de realizar la fusión (esos intentos son visibles, si lo desea, en el archivo $ MERGED) y le permite para hacer completamente la fusión desde cero .
La conclusión es que en los conflictos de fusión manuales y visuales no se buscan los mismos archivos, sino que el resultado final se escribe en el mismo archivo (es decir, el archivo $MERGED
).
La corrección manual de los conflictos se realiza en $MERGED
porque git
no tiene la intención de presentarle tres archivos, por lo que elimina la información de los tres archivos ( $LOCAL
, $BASE
, $REMOTE
) en ese archivo $MERGED
.
Pero las herramientas visuales tienen los medios para mostrarle tres archivos: le muestran los archivos $LOCAL
, $BASE
, $REMOTE
. Está eligiendo cambios de los archivos $LOCAL
y $REMOTE
y los está incorporando al archivo $BASE
, reconstruyendo por completo e incluso sobrescribiendo el intento fallido de fusión que es el archivo $MERGED
.
La solución de Cosmin funciona, pero el archivo $ BASE se actualiza, no $ MERGED . Esto actualizará el archivo $ MERGED :
Meld: v1.8.4
[merge]
conflictstyle = diff3
tool = mymeld
[mergetool "mymeld"]
cmd = meld --auto-merge --output $MERGED $LOCAL $BASE $REMOTE --diff $BASE $LOCAL --diff $BASE $REMOTE
Meld tiene una función oculta de combinación de 3 vías activada al pasar en el 4 ° parámetro:
meld $LOCAL $BASE $REMOTE $MERGED
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 esperaba git.
El archivo ~ / .gitconfig que uso contiene la siguiente configuración:
[merge]
tool = mymeld
conflictstyle = diff3
[mergetool "mymeld"]
cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE $MERGED
esto abre la fusión con 3 pestañas, 1ra y 2da pestañas que contienen las diferencias simples que intento 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 porque todavía no está lo suficientemente pulida. Es muy útil como lo es ahora, pero Kai Willadsen, el autor de meld, señaló algunas arrugas que deben ser resueltas. Por ejemplo, no hay una 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 habla Python y tiene algo de tiempo en sus manos, ya sabe qué hacer.
Editar: en las versiones más nuevas de Meld, el synax ha cambiado ligeramente. Esto fue 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 de arriba debería ser:
cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE --output $MERGED
Por alguna razón, las versiones más nuevas de meld no muestran líneas de marcador agregadas para conflictos (<<<<<<<, =======, >>>>>>>). Si desea ver esas líneas, debe instalar meld v 1.3.3 o anterior.
Por favor, vea la respuesta de Saad para la respuesta correcta.
Con meld 1.8.1 en Ubuntu estaba obteniendo el
número incorrecto de argumentos suministrados a --diff
y agregando el --output antes de $ MERGED lo solucionó para mí:
[mergetool "mymeld"]
cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE --output $MERGED