How do I make git automatically run git mergetool
for any merge conflict? This should apply for all merges, using merge
, rebase
, pull
, etc.
You cannot (yet) make git do this.
This may or may not be an acceptable workaround.
Create a function in your ~/.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 isn't invoked when it merges:
$ git merge non_conflicting_branch
Merge made by the 'recursive' strategy.
bar | 0
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 bar
Mergetool is called when there are conflicts:
$ 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 is not called on other errors:
$ git merge adasds
fatal: adasds - not something we can merge
git stash pop
). Since he doesn't filter by command, that's not an issue. As you note yourself, the current code will launch git mergetool
on any error with 1 status. –
Ster git mergetool
automatically, and I highly doubt he cares whether it's git or the shell doing it. –
Yalonda You could always use alias
alias 'git-merge'='git merge && git mergetool'
alias 'git-rebase'='git rebase && git mergetool'
alias 'git-pull'='git pull && git mergetool'
And/or write a helper script along these lines
#/bin/bash
git $*
[ "$(git ls-files –abbrev –unmerged | wc -l)" -gt 0 ] && git mergetool
and then
alias git='~/.git/git-script'
There is no direct way of invoking mergetool, because it is only one of several ways to merge (see "HOW TO RESOLVE CONFLICTS" in man 1 git-merge).
mergetool
if there is a conflict. The "only one of several ways to merge" argument isn't convincing. Yes, there are multiple ways, but it's quite reasonable to want to choose one as the default. –
Ster As far as I know, there is no porcelain way to do it.
You can have a wrapper around git like this (file git_mergetool.sh
, on your path, +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
Then add alias:
echo alias git=\"git_mergetool.sh\" >> ~/.bashrc
Every time you invoke git, the wrapper will check if the word "CONFLICT" pops up. If it does - wrapper launches mergetool.
This can be improved by adding more precise phrase to $SEARCH
(like "Automatic merge failed; fix conflicts and then commit the result.") as well as by checking if first argument ($1
) is in the list of commands resulting in merge conflict (pull
, merge
, etc...). Otherwise you will end up parsing a lot of unnecessary data if git command output is too long.
git
(without file extension) and put in on your path before the actual git executable. But it is pretty much just another way of aliasing. So no, I don't know of a way to accomplish that without aliasing git. –
Confucius © 2022 - 2024 — McMap. All rights reserved.
post-checkout
(I don't know if it is actually invoked during a merge.post-merge
requires a successful merge) – Friederikepre-merge
hook functionality, in which case you could of course simply have git run mergetool on conflicts depending on a config setting anyway... – Friederike