GIT: cree automáticamente archivos distintos para versiones en conflicto
-
26-10-2019 - |
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
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 intactosSe 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.