Git
当使用和作为mergetool解决合并冲突时Vim
,我(突然)得到了与我预期和习惯完全不同的视图。过去,我遵循这篇博文,结果是一个有四个窗口的视图:LOCAL | BASE | REMOTE
然后是下面的文件。现在,我也得到了四个窗口,但是LOCAL
然后LOCAL | LOCAL | file
。
我无法弄清楚问题是否出在Git
或Vim
。我删除了全局变量.gitconfig
以及,但都没有用。最后有用的是通过以下命令.vimrc
隐藏HOME
目录:Git
$ git merge octodog
$ HOME= git mergetool
我认为此行为与其中一个或两个工具的新软件版本有关,因为我以前没有遇到过这种情况。此问题也与目录和主机无关,它也发生在不同的机器上。
版本:
$ git --version
git version 2.37.1
$ vim --version
VIM - Vi IMproved 9.0
最小工作示例(从博客文章中压缩而来):
$ cd $(mktemp -d)
$ git init
$ # ––– config mergetool
$ git config merge.tool vimdiff
$ git config merge.conflictstyle diff3
$ git config mergetool.prompt false
$ # ––– create merge conflict
$ echo -e 'cat\ndog\noctopus\noctocat' > animals.txt
$ git add animals.txt
$ git commit -am 'Initial commit'
$ git checkout -b octodog
$ sed -i 's/octopus/octodog/' animals.txt
$ git commit -am "Replace octopus with an octodog"
$ git checkout master
$ sed -i 's/octopus/octoman/' animals.txt
$ git commit -am "Replace octopus with an octoman"
$ # ––– trigger behavior
$ git merge octodog
$ git mergetool
我该怎么做才能再次获得正确的差异视图?
答案1
这是 git 2.37 的一个错误(参见此处:https://lore.kernel.org/git/YshkFWZfBMbuN%[电子邮件保护]/t/#r8aa35632787d0df77458137267135c7a6c0d683d)。重新实现了 vimdiff 的调用方式,参见更新日志:
* "vimdiff[123]" mergetool drivers have been reimplemented with a
more generic layout mechanism.
这个重新实现似乎没有考虑splitbelow
和splitright
选项。
解决方法是,您可以降级到 git 版本2.36
(如 @romainl 的评论中所建议的),或者禁用splitbelow
和splitright
选项,直到修复发布。mergetool 驱动程序的作者似乎已经知道了这个问题(以及潜在的修复),因此希望它能很快得到解决。
答案2
就像@Ingo 的回答所说,这是 Git 2.37 中的一个错误;它在 Git 2.38 中已修复,因此升级到该版本也可以解决问题。