gconflict es una interfaz de terminal Textual para resolver conflictos de Git.
La arquitectura sigue el flujo Textual TUI → services → Git/conflicts/filesystem → models.
Git es la fuente de verdad del estado del repositorio. La aplicación también
integra editores externos para editar el archivo seleccionado.
- Git disponible en el sistema
- Python 3.13 o superior, solo para la instalación local con
pip. El instalador de la versión oficial provee su propio Python.
En macOS y Linux, en arquitecturas x86_64 o arm64, con curl y Git
disponibles, puedes instalar la versión oficial más reciente con:
curl -fsSL https://raw.githubusercontent.com/Mane087/gconflict/main/scripts/install.sh | shNo necesitas tener Python instalado. El instalador descarga un uv privado y
un Python gestionado por uv dentro del directorio de instalación, de modo que
no depende del Python del sistema.
El instalador resuelve la última release publicada en GitHub e instala el
paquete desde esa etiqueta; no utiliza PyPI. Por defecto usa
~/.local/share/gconflict para la instalación y ~/.local/bin/gconflict para
el ejecutable. Si ~/.local/bin no está en tu PATH, añádelo antes de
ejecutar gconflict.
Puedes personalizar la instalación con las variables opcionales
GCONFLICT_VERSION, GCONFLICT_HOME, GCONFLICT_BIN_DIR y
GCONFLICT_PYTHON_VERSION (por defecto, 3.13).
Advertencia: curl | sh descarga y ejecuta código remoto inmediatamente.
Si prefieres inspeccionarlo antes, descarga el script, revísalo y ejecútalo
por separado:
curl -fsSL https://raw.githubusercontent.com/Mane087/gconflict/main/scripts/install.sh -o install.sh
less install.sh
sh install.shDesde una copia local del repositorio:
python -m pip install .Para desarrollo, usa una instalación editable con las dependencias opcionales:
.venv/bin/python -m pip install -e ".[dev]"El proyecto usa el empaquetado de setuptools y no requiere un paso de compilación personalizado.
gconflict [directory]directory es opcional y permite indicar el directorio del repositorio. Usa
--help para consultar las opciones disponibles y --version para mostrar la
versión instalada. En un entorno de desarrollo con instalación editable,
también puedes ejecutar .venv/bin/gconflict [directory].
- La TUI consulta los servicios; estos coordinan Git, el motor de conflictos y el sistema de archivos, usando los modelos de la aplicación.
- Solo los conflictos
CONTENTse pueden resolver. Los demás tipos muestran instrucciones y bloquean las acciones de modificación. - La vista previa aparece únicamente cuando todos los conflictos resolubles tienen una selección.
- El sistema de archivos conserva los metadatos relevantes y detecta cambios concurrentes antes de guardar, aunque esa comprobación mantiene una ventana residual de TOCTOU. Rechaza enlaces simbólicos y archivos no regulares.
- Guardar y ejecutar
git addson acciones independientes. No se ejecutan automáticamentecommit,--continueni--abort.
↑/↓yEnter: seleccionar un archivo.→/n: ir al siguiente conflicto.←/p: ir al conflicto anterior.c: elegir Current.i: elegir Incoming.b: elegir Both C-I.B: elegir Both I-C.u: quitar la resolución activa.e: abrir el archivo seleccionado en un editor externo.s: guardar la resolución. Requiere un archivoCONTENTcargado y todos sus conflictos resueltos; ejecuta el guardado.r: marcar el archivo como resuelto.Ctrl+Q: salir.
Las acciones c, i, b y B requieren un conflicto CONTENT. u elimina
la selección activa. e requiere un archivo seleccionado y vuelve a cargar su
estado. s requiere resoluciones completas para todos los conflictos
CONTENT y todos sus conflictos resueltos. r requiere un guardado exitoso
previo y validación de Git.
El ActionBar agrupa las acciones en CONFLICT, FILE y REPO. Se inicia
cerrado cuando collapsible_actions = true y solo se puede alternar haciendo
clic en la barra. Con false, permanece expandido y los clics no tienen
efecto. Los chips son informativos; no son controles de acción.
Las acciones mostradas son:
CONFLICT:c,i,b,B,e,u.FILE:s,r.REPO:up/down,Enter,q.
Next y Previous son combinaciones de teclado, no entradas del ActionBar.
La configuración opcional se lee únicamente desde
~/.config/gconflict/config.toml. Si el archivo no existe se usan los valores
predeterminados; las claves desconocidas se ignoran.
# Omite editor o theme para conservar None y la selección automática.
editor = "code --wait"
collapsible_actions = true
show_status_line = true
show_command_palette = true
theme = "textual-dark"El esquema admite estas claves:
editor: string mediante omisión. TOML no tiene un literalnull: omite esta clave para conservarNone. Un valor configurado no vacío tiene prioridad sobreGIT_EDITOR,VISUALyEDITOR; si la clave se omite o está vacía, se aplica la prioridad de las variables de entorno.collapsible_actions: booleano,truepor defecto. Confalse, las acciones permanecen expandidas y no muestran control para plegarlas.show_status_line: booleano,truepor defecto.show_command_palette: booleano,truepor defecto.theme: string mediante omisión. TOML no tiene un literalnull: omite esta clave para conservarNone. Debe nombrar un tema registrado en Textual.
Los valores predeterminados son editor = None,
collapsible_actions = true, show_status_line = true,
show_command_palette = true y theme = None. Las claves desconocidas se
ignoran. Cuando están presentes, editor y theme deben ser strings; las
demás opciones son booleanas.
Otro ejemplo mínimo para ocultar elementos de la interfaz es:
collapsible_actions = false
show_status_line = false
show_command_palette = falseUn TOML mal formado, un tipo inválido, un tema no registrado o un error de
lectura produce Configuration error y el código de salida 4. Un editor
configurado no vacío tiene prioridad sobre GIT_EDITOR, VISUAL y EDITOR; si
la clave se omite o está vacía, se aplica la prioridad de esas variables de
entorno. La orden se divide con shlex, sin shell, y el archivo objetivo debe
permanecer dentro del repositorio.
Cuando show_command_palette = true, Ctrl+P abre la paleta y oculta
Keys, Maximize y Minimize, pero conserva Theme, Quit y Screenshot.
Cuando es false, Ctrl+P no hace nada.
Comando estándar:
.venv/bin/python -m pytest -q --asyncio-mode=autoEjemplos de pruebas enfocadas:
.venv/bin/python -m pytest tests/git/test_repository.py -q --asyncio-mode=auto
.venv/bin/python -m pytest -q --asyncio-mode=auto -k test_save_calls_resolve_fileLa aplicación emite estos códigos de salida:
0: ejecución completada sin conflictos,--help,--versiono salida normal.2: el directorio no es un repositorio Git.4: argumentos inválidos o configuración inválida.