Pregunta

Cuando Git detecta un conflicto durante la fusión, el comportamiento predeterminado es llenar el archivo con <<< >>> === marcadores.

Esto está bien la mayor parte del tiempo, pero a veces me gustaría resolver conflictos de manera diferente y me gustaría que GIT cree archivos distintos:

  • Versión original,
  • Versión A, A,
  • Versión cambiada B.

¿Cómo lograr eso?


Si no hay un comando simple para crear esos archivos de una vez (lo cual es algo sorprendente), ¿tal vez hay una manera de extender GIT para que lo haga? Una costumbre mergetool ¿o algo? Solo una idea.


Solución:

Me conformé con una variante de Respuesta de @Karl Bielefeldt:

saveFiles.sh

#!bash
BASE=$1
LOCAL=$2
REMOTE=$3
MERGED=$4

cp "$BASE" "$MERGED.git_BASE"
cp "$LOCAL" "$MERGED.git_LOCAL"
cp "$REMOTE" "$MERGED.git_REMOTE"

# never mark the conflict as merged
exit 1 

configuración

mergetool.savefiles.cmd=/path/to/savefiles.sh $BASE $LOCAL $REMOTE $MERGED
mergetool.savefiles.trustexitcode=true
¿Fue útil?

Solución

Crea un archivo llamado savefiles.sh Con el siguiente contenido:

#!/usr/bin/bash

cp $1 /path/to/BASE
cp $2 /path/to/LOCAL
cp $3 /path/to/REMOTE

Ejecute el siguiente comando dentro de su repositorio:

git config mergetool.savefiles.cmd "/path/to/savefiles.sh \$BASE \$LOCAL \$REMOTE"

Agrega un --global Si desea cambiarlo por otro repositorio.

Luego, para ejecutar este Mergetool personalizado, use:

git mergetool --tool=savefiles

Otros consejos

Si desea ir sin Mergetool y simplemente muestre o guarde los archivos en los Estados Unidos que menciona, el índice contiene los diferentes estados del archivo conflictivo. Puede mostrar (y redirigir a un archivo si lo desea) con:

$ git show :1:file.txt  # the file in a common ancestor of both branches
$ git show :2:file.txt  # the version from HEAD.
$ git show :3:file.txt  # the version from MERGE_HEAD.

Sin embargo, el uso de una herramienta de fusión gráfica le muestra una vista de 3 paneles del archivo conflictivo. Eso es generalmente lo que hace la gente, así que solo elige tu herramienta favorita y vea cómo vincularla con git mergetool llamar.

Resumen

git mergetool -y -t bogus <file>

Trabaja para mí con Git 1.7.9.5 / Ubuntu 12.04 y Msysgit 1.9.4 / Windows 7 x64.

Explicación

Me gustaría que git cree archivos distintos

Estaba buscando lo mismo. Caso en cuestión: al invocar git mergetool -t kdiff3, git aparentemente trata de superarme invocando a KDiff3 con una codificación dura --auto bandera que instruye a KDIFF3 que resuelva automáticamente los conflictos y salga sin mostrarme la GUI o que me permita participar en el proceso (ver también). Cuando eso sucedió y Kdiff3 resolvió los conflictos mal, fui a buscar esto.

Cuando invoco mergetool como así (donde bogus es una cadena que no es un identificador de herramienta de combinación válida [por ejemplo, no en la salida de git mergetool --tool-help Si su versión de Git tiene eso]), lo siguiente sucede:

  • Informa "herramienta de fusión desconocida falsa"

  • El índice y file están intactos

  • Se generan los siguientes archivos (donde {num} es un entero que es el mismo en todos los archivos creados por esta invocación):

    file.BACKUP.{num}
    file.BASE.{num}
    file.LOCAL.{num}
    file.REMOTE.{num}
    

file.BACKUP.{num} es idéntico a file.

Notas

Pienso que el -y Debe ser innecesario si mergetool.prompt se establece en false. Y, según la documentación, parece en versiones más nuevas de Git -t implica -y.

los -t La parte se puede acortar aún más, por ejemplo -t x o -t 0.

Si tiene múltiples archivos no molestos, no parece haber ninguna forma de lograr que genere estas versiones para más de un archivo a la vez. Por ejemplo, si tiene archivos inaliñados files/file1 y files/file2, cualquiera de los siguientes solo generará estas versiones (copia de seguridad, base, local, remota) para file1:

git mergetool -y -t x
git mergetool -y -t x files
git mergetool -y -t x files/file1 files/file2

Sin embargo, si resuelve los conflictos en file1 y correr git mergetool Nuevamente, pasará al siguiente archivo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top