Solución:
Git tiene --auto
codificado como una opción de línea de comandos para KDiff3, lo que hace que la GUI no se muestre si KDiff3 puede resolver automáticamente todos los conflictos. En la configuración de KDiff3 puede especificar opciones de línea de comando para ignorar, pero poniendo --auto
no funcionó para mí.
Como solución, configuré mi propia variante de KDiff3 como la herramienta de combinación:
git config --global mergetool.kdiff3NoAuto.cmd "kdiff3 --L1 "$MERGED (Base)" --L2 "$MERGED (Local)" --L3 "$MERGED (Remote)" -o "$MERGED" "$BASE" "$LOCAL" "$REMOTE""
Esto es muy similar a lo que Git usa por defecto para KDiff3, pero sin el --auto
bandera.
Ahora puedes llamar git mergetool -t kdiff3NoAuto
o configurar kdiff3NoAuto
como mergetool globalmente y KDiff3 siempre aparecerán al resolver conflictos.
Con respecto a la segunda parte de su pregunta, si realmente desea deshabilitar cualquier resolución automática, simplemente agregue --qall
al kdiff3
línea de comando arriba. Pero luego debe resolver manualmente todos los cambios en el archivo, incluso los que no resultaron en un conflicto de Git. El mejor escenario sería: KDiff3 muestra cómo Git fusionó los archivos y deja los conflictos abiertos para que el usuario elija.
El comentario de Bob esponja a la respuesta aceptada funcionó perfectamente para mí usando KDiff3 0.9.98.
Agregar --auto
para Opciones de línea de comando para ignorar: debajo
Settings | Configure KDiff3... | Integration tab.
KDiff3 aparece con el cuadro de diálogo Conflictos que indica No de conflictos no resueltos: 0, pero luego puede inspeccionar / modificar el estado combinado según sea necesario.
Un poco más conveniente que configurar su propia variante, ya que funcionará según lo previsto, ya sea desde git mergetool, Source Tree o cualquier herramienta que utilice mergetool.
El comportamiento de git mergetool
depende completamente de la herramienta de combinación elegida y de la línea de comando que Git le pasa. Por lo tanto, para cambiar su comportamiento, necesitas encontrar una línea de comando que haga lo que quieres y configurar Git para usar esa línea de comando.
Yo mismo tenía esta pregunta (específicamente con respecto a KDiff3), y la respuesta de PiQuer me ayudó en parte, pero me hizo pensar. Debería haber una forma de replicar el comportamiento predeterminado de Git exactamente para KDiff3, excepto sin el --auto
opción (que es lo que hace que KDiff3 no muestre la GUI).
Parece que la fuente del comando predeterminado para la herramienta de combinación KDiff3 está en el archivo git / mergetools / kdiff3. Parece un script de shell, ¡así que deberíamos poder copiarlo exactamente! Poniendo eso en una línea, quitando --auto
, y escapar de las cosas nos da esto:
git config --global mergetool.kdiff3.cmd "if "$base_present"; then "$merge_tool_path" --L1 "$MERGED (Base)" --L2 "$MERGED (Local)" --L3 "$MERGED (Remote)" -o "$MERGED" "$BASE" "$LOCAL" "$REMOTE" >/dev/null 2>&1; else "$merge_tool_path" --L1 "$MERGED (Local)" --L2 "$MERGED (Remote)" -o "$MERGED" "$LOCAL" "$REMOTE" >/dev/null 2>&1; fi"
los base_present
y merge_tool_path
Las variables no se mencionan específicamente en la documentación de Git como disponibles para su uso en mergetool.<tool>.cmd
, por lo que es posible que en algún momento en el futuro este comando no funcione como está. Sin embargo, podrían reemplazarse fácilmente con un comando para probar si BASE
se refiere a un archivo que existe y una ruta codificada para KDiff3, respectivamente.
Tenga en cuenta que el comando anterior reemplaza el comando predeterminado para Git kdiff3
fusionar herramienta en lugar de crear una separada.
Con respecto a un par de otros puntos en la pregunta original:
- los
trustExitCode
La configuración le dice a Git si el código de salida de la herramienta de combinación es una indicación adecuada de si la combinación se realizó correctamente. No afectará el comportamiento de la herramienta de combinación, sino más bien el comportamiento de Git una vez que la herramienta de combinación haya salido. Consulte el manual de git-mergetool. - La resolución automática que ves después de escribir.
git mergetool
todo se realiza mediante la propia herramienta de combinación.git mergetool
simplemente invoca la herramienta externa en las versiones de archivo que deben fusionarse.