Ayuda de ABDiff

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:

  1. Abre el archivo en un editor y elimina los marcadores de conflicto.
  2. Prepara el archivo resuelto con git add.

Para solucionar el conflicto en una herramienta externa ejecuta:

git mergetool

git 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:

  1. Configuración merge.tool.
  2. $GIT_MERGE_TOOL variable de entorno.
  3. 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.swift

Se 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:

  1. Configuración diff.tool.
  2. $GIT_DIFF_TOOL variable de entorno.
  3. Detección automática de herramientas conocidas en $PATH.
  4. Vuelve a vimdiff.