如果存在合并冲突,如何使git自动打开合并工具?

如果存在合并冲突,如何使git自动打开合并工具?,git,merge,mergetool,Git,Merge,Mergetool,对于任何合并冲突,如何使git自动运行git mergetool?这应该适用于所有合并,使用merge,rebase,pull,等等。您可以始终使用alias alias 'git-merge'='git merge && git mergetool' alias 'git-rebase'='git rebase && git mergetool' alias 'git-pull'='git pull && git mergetool' 和/或沿

对于任何合并冲突,如何使git自动运行
git mergetool
?这应该适用于所有合并,使用
merge
rebase
pull
,等等。

您可以始终使用alias

alias 'git-merge'='git merge && git mergetool'
alias 'git-rebase'='git rebase && git mergetool'
alias 'git-pull'='git pull && git mergetool'
和/或沿这些行编写帮助器脚本

#/bin/bash
git $*
[ "$(git ls-files –abbrev –unmerged | wc -l)" -gt 0 ] && git mergetool
然后

alias git='~/.git/git-script'

没有直接调用mergetool的方法,因为它只是几种合并方法中的一种(请参阅man 1 git merge中的“如何解决冲突”)

据我所知,没有直接的方法

您可以像这样在git周围有一个包装器(文件
git\u mergetool.sh
,在您的路径上,
+x
):

然后添加别名:

echo alias git=\"git_mergetool.sh\" >> ~/.bashrc
每次调用git时,包装器都会检查是否弹出“CONFLICT”一词。如果有,包装器将启动合并工具

这可以通过向
$SEARCH
添加更精确的短语(如“自动合并失败;修复冲突,然后提交结果”)以及检查第一个参数(
$1
)是否在导致合并冲突的命令列表中(
pull
merge
等)来改进。否则,如果git命令输出太长,您将解析大量不必要的数据。

您还不能让git这样做


这可能是也可能不是可接受的解决方法

~/.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
}
合并工具在合并时不被调用:

$ 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:

$ 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:

$ git merge adasds
fatal: adasds - not something we can merge

正如我提到的,我只想在发生冲突时调用
mergetool
。“合并的几种方式中只有一种”的论点不令人信服。是的,有多种方法,但选择其中一种作为默认方法是很合理的。如果没有冲突,git mergetool不会做任何事情。也许你可以使用,例如
签出后
(我不知道在合并过程中是否真的调用了它。
合并后
需要成功的合并)@TobiasKienzler你可能知道些什么。如果你能想出一个有效的解决方案,我会给你这个问题的奖励。@QuinnStrahl我认为目前不存在一个钩子,它在导致合并的各个命令之前执行,所以可能是最简单的解决方案。或者修改git源代码以实现一个
预合并
钩子功能,在这种情况下,您当然可以让git根据配置设置在冲突时运行mergetool……嗯,好的。谢谢你的帮助。我想我会提交一个补丁。@QuinnStrahl如果您现在已经提交了一个补丁,我希望这里有一个链接:)是否可以不有效地混淆git?@QuinnStrahl您可以命名script
git
(不带文件扩展名)并在实际git可执行文件之前输入您的路径。但这几乎只是另一种别名。所以不,我不知道有什么方法可以在不使用git.别名的情况下实现这一点,应该是可行的,但是冲突正则表达式需要改进。我认为它目前将在任何地方接收到它,即使是在diff输出中。至少你可以按行位置(例如锚点)过滤,也许还可以展开文本。这并不是让git自动打开mergetool,而是让shell这样做。为什么要向下投票?这本质上是一种更干净的方法来实现罗西波夫的答案。它如何更干净?您缺少某些类型的冲突(例如
git stash pop
)。因为他不按命令过滤,所以这不是问题。正如您自己所注意到的,当前代码将在任何状态为1的错误上启动
git mergetool
。我无法确定是否存在任何其他返回值为1的错误,因为git返回值通常未记录。但是我还没有找到一个不是合并冲突的。@QuinnStrahl git还不能做到这一点,那么通过shell实现它是一个错误的答案吗?
$ git merge adasds
fatal: adasds - not something we can merge