Git diff y merge
Git realiza diffs, merges y cambios de base utilizando sus propios algoritmos internos. Estas operaciones son deterministas y totalmente automatizadas: Git nunca depende de herramientas externas.
Sin embargo, hay situaciones en las que se requiere el juicio humano. Por ejemplo, cuando los cambios deben evaluarse visual o semánticamente en lugar de textualmente. En esos casos, Git puede invocar herramientas externas para ayudar con la inspección, no con la toma de decisiones.
Un ejemplo común en macOS es FileMerge.app, que se instala con las herramientas de línea de comandos de Xcode y Git puede iniciarlo como ayuda de diff o merge.
Merge
Cuando Git mergea ramas y no puede conciliar los cambios, escribe marcadores de conflicto en cada archivo en conflicto, luego detiene el merge y notifica al usuario. Para cada archivo con marcadores de conflicto se registran tres etapas en el índice de Git: común nuestro y de ellos. En este punto, el repositorio se encuentra en un estado de merge en conflicto y Git espera a que se resuelvan todos los conflictos.
Dado un archivo en conflicto File.swift los archivos
generados
Para solucionar el conflicto manualmente edita el archivo:
- Abre el archivo en un editor y elimina los marcadores de conflicto.
- Prepara el archivo resuelto con
git add.
Para solucionar el conflicto en una herramienta externa ejecuta:
git mergetoolgit mergetool inicia la herramienta una vez para cada
archivo en conflicto, pasando las rutas BASE, la nuestra, la de ellos y
los resultados de merge a la herramienta. Git espera a que la
herramienta salga antes de iniciar el siguiente archivo. El código de
salida de la aplicación para cada archivo determina si el archivo está
marcado como resuelto o no. También tiene la opción de ejecutar
explícitamente git add <file> para marcarlo como
preparado.
Si hay varias herramientas de merge configuradas, Git elige la primera que se encuentra en esta lista:
- Configuración
merge.tool. $GIT_MERGE_TOOLvariable de entorno.- Detección automática de herramientas instaladas conocidas.
Invocando la herramienta externa
Para cada archivo en conflicto Example.swift Git crea
archivos adicionales que se ven aquí:
Example_BACKUP_70842.swift
Example_BASE_70842.swift
Example_LOCAL_70842.swift
Example_REMOTE_70842.swift
Example.swift
El número de sufijo cambia para cada invocación. Luego invoca la
herramienta con un comando configurado como vimos en Git Integration. Para
abd el comando es
abd --base Example_BASE_70842.swift --local Example_LOCAL_70842.swift --remote Example_REMOTE_70842.swift --result Example.swiftSe supone que la herramienta elimina los marcadores de conflicto y sale normalmente. Esto indica que el conflicto se ha resuelto.
Diff
Si invocas git difftool, Git enumera los archivos
modificados e inicia la herramienta externa para cada par de archivos.
Git ignora el código de retorno, por lo que este flujo de trabajo solo
es útil para realizar una inspección visual.
Normalmente es mejor simplemente arrastrar y soltar los archivos que
quieres comparar. Pero si prefieres comparar todos los ficheros con
cambios, ejecuta git difftool. La herramienta externa
invocada es la primera que se encuentra en esta lista:
- Configuración
diff.tool. $GIT_DIFF_TOOLvariable de entorno.- Detección automática de herramientas conocidas en
$PATH. - Vuelve a
vimdiff.