tag - ¿Cómo hago que git abra automáticamente la herramienta de mezcla si hay un conflicto de fusión?
resolver conflictos git (3)
Siempre puedes usar alias
alias ''git-merge''=''git merge && git mergetool''
alias ''git-rebase''=''git rebase && git mergetool''
alias ''git-pull''=''git pull && git mergetool''
Y / o escriba un script de ayuda en esta línea
#/bin/bash
git $*
[ "$(git ls-files –abbrev –unmerged | wc -l)" -gt 0 ] && git mergetool
y entonces
alias git=''~/.git/git-script''
No hay una forma directa de invocar mergetool, ya que es solo una de varias maneras de fusionarse (ver "CÓMO RESOLVER CONFLICTOS" en man 1 git-merge).
¿Cómo hago que git ejecute git mergetool
automáticamente para cualquier conflicto de fusión? Esto debería aplicarse a todas las fusiones, utilizando merge
, rebase
, pull
, etc.
Hasta donde yo sé, no hay forma de porcelana para hacerlo.
Puedes tener un wrapper alrededor de git como este (archivo git_mergetool.sh
, en tu ruta, +x
):
#!/bin/bash
SEARCH="CONFLICT"
OUTPUT=$(git "$@" 2>&1 | tee /dev/tty)
if `echo ${OUTPUT} | grep -i "${SEARCH}" 1>/dev/null 2>&1`
then
git mergetool
fi
Luego agrega un alias:
echo alias git=/"git_mergetool.sh/" >> ~/.bashrc
Cada vez que invocas git, el contenedor verifica si aparece la palabra "CONFLICTO". Si lo hace, wrapper lanza mergetool.
Esto se puede mejorar agregando una frase más precisa a $SEARCH
(como "Falló la fusión automática; soluciona los conflictos y luego confirma el resultado") y también verifica si el primer argumento ( $1
) está en la lista de comandos que resulta en un conflicto ( pull
, merge
, etc ...). De lo contrario, terminará analizando una gran cantidad de datos innecesarios si la salida del comando git es demasiado larga.
No puedes (todavía) hacer que Git haga esto.
Esto puede o no ser una solución aceptable.
Crea una función en tu ~/.bashrc
:
git()
{
if [[ $1 == "merge" ]] || [[ $1 == "rebase" ]] || [[ $1 == "pull" ]]; then
command git "$@"
rc=$?
if [[ $rc == 1 ]]; then
echo "There are conflicts, better run git-mergetool!!!"
# There might be some other condition that returns a ''1'',
# if so you can add another check like this:
# if grep Conflicts $(git --git-dir)/MERGE_MSG;
command git mergetool
fi
else
command git "$@"
fi
}
Mergetool no se invoca cuando se combina:
$ git merge non_conflicting_branch
Merge made by the ''recursive'' strategy.
bar | 0
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 bar
Se usa Mergetool cuando hay conflictos:
$ git merge conflicting_branch
Auto-merging foo
CONFLICT (content): Merge conflict in foo
Automatic merge failed; fix conflicts and then commit the result.
There are Conflicts, better run git-mergetool!!!
Mergetool no recibe otros errores:
$ git merge adasds
fatal: adasds - not something we can merge