为什么git mergetool在vimdiff中打开4个窗口?(我期待3)

Lai*_*uan 26 git vim vimdiff

当我遇到冲突时,我试图用git-mergetool它来解决它.我键入:

>git mergetool -t vimdiff
Run Code Online (Sandbox Code Playgroud)

vimdiff以4向开放,而不是3向开放.我在vimdiff的分割窗口看起来像:

:ls
  1 #a   "Gemfile.lock"                 line 1
  2 %a   "Gemfile.lock.LOCAL.4828.lock" line 1
  3  a   "Gemfile.lock.BASE.4828.lock"  line 0
  4  a   "Gemfile.lock.REMOTE.4828.lock" line 0
Run Code Online (Sandbox Code Playgroud)

这些是什么?我想要一个三向差异:目标文件,合并文件和工作文件.我该如何配置我的git或vimdiff?

Pet*_*ker 32

作为替代方案,你有没有想过使用逃犯

我不会骗你的; fugitive.vim很可能是有史以来最好的Git包装器.

有一个很棒的vimcast,Fugitive.vim -由Drew Neil 解决与vimdiff的合并冲突.这是逃犯系列的一部分.

Vimcasts网站了解更多关于vim的一个好地方.

要在合并工具时使用逃犯,可以使用以下方法.

git config --global mergetool.fugitive.cmd 'vim -f -c "Gdiff" "$MERGED"'
git config --global merge.tool fugitive
Run Code Online (Sandbox Code Playgroud)

注意:您可能想要更改vimmvimgvim.

除了作为合并工具脚本之外,Fugitive还提供了更多功能,因此请务必阅读文档和/或查看vimcast.


Dr *_*eco 9

经过大量的研究,发现与vimdiff和只有3个窗口合并工具,我想出了这个配置,允许我选择我想要3个窗口或默认的4个窗口:

git config --global merge.tool vimdiff
git config --global alias.mt mergetool

git config --global mergetool.merge3.cmd 'vim -d -c "wincmd l" "$LOCAL" "$MERGED" "$REMOTE"'
git config --global alias.m3 'mergetool -t merge3'
Run Code Online (Sandbox Code Playgroud)

现在您只需键入以下内容即可启动3个窗

git m3
Run Code Online (Sandbox Code Playgroud)

默认(4个窗口)仍将按预期工作:

git mt
Run Code Online (Sandbox Code Playgroud)

此外,您可能希望将此行添加到您~/.vimrc或的末尾/etc/vim/vimrc

 " shortcuts to vimdiff
 let mapleader=','
 let g:mapleader=','

 if &diff
    map <leader>1 :diffget LOCAL<CR>
    map <leader>2 :diffget BASE<CR>
    map <leader>3 :diffget REMOTE<CR>
 endif
Run Code Online (Sandbox Code Playgroud)

这将创建快捷方式,例如,1从左侧,3抓取,从右侧抓取(在两种模式下)以及,2从4窗口模式中从基座(中心窗口)抓取.

这有很大帮助!

我的~/.gitconfig文件看起来像这样:

[user]
        name = Dr Beco
        email = my@email
[merge]
        tool = vimdiff
[mergetool "merge3"]
        cmd = vim -d -c \"wincmd l\" \"$LOCAL\" \"$MERGED\" \"$REMOTE\"
[alias]
        lo = log --pretty=format:\"%h %ce %cd %s\" --graph
        co = checkout
        ci = commit
        cm = commit -a -m
        st = status
        br = branch
        m3 = mergetool -t merge3
        mt = mergetool
[diff]
        tool = vimdiff
Run Code Online (Sandbox Code Playgroud)

我希望这对你(以及那些到达这里的人)有所帮助.


e3m*_*eus 5

修改此页面中的命令:

git config --global mergetool.vimdiff3.cmd 'vim -f -d "$LOCAL" "$MERGED" "$REMOTE"'
git config --global merge.tool vimdiff3
Run Code Online (Sandbox Code Playgroud)
  • '合并'将是您的工作副本.
  • "本地"您尝试进行更改的分支中的文件
  • 从您尝试合并的分支"远程"传输文件.

然后执行命令:git mergetool.

注意:我也使用逃犯,强烈推荐它.


Von*_*onC 5

注意:虽然Beco博士答案
(vim -d -c "wincmd l" "$LOCAL" "$MERGED" "$REMOTE"')中描述的只能使用3个Windows ,
但4-windows模式增强了git 2.8(2016年3月)

请参阅Dickson Wong()提交的2300328(2016年1月29日).(由Junio C Hamano合并- -提交82c17b7,2016年2月17日)diwo
gitster

vimdiff" git mergetool" 的后端已经过调整,以便按照与从左到右阅读的大多数人的期望,然后自上而下的顺序排列和编号缓冲区,并将"缓冲区"1 2 3 4"精神上"分配给本地基础远程合并窗口基于该订单.

在内部,git现在将使用:

"$merge_tool_path" -f -d -c '4wincmd w | wincmd J' \
            "$LOCAL" "$BASE" "$REMOTE" "$MERGED"
Run Code Online (Sandbox Code Playgroud)

代替:

"$merge_tool_path" -f -d -c 'wincmd J' \
        "$MERGED" "$LOCAL" "$BASE" "$REMOTE"
Run Code Online (Sandbox Code Playgroud)

mergetool:在三向差异中重新排序vim/gvim缓冲区

调用默认(g)vimdiff三向合并时,合并文件作为第一个缓冲区加载,但作为第四个窗口移动到底部.
这导致vim在窗口位置(例如CTRL- W_w)上操作的命令与在缓冲区索引(例如do/ dp)上操作的命令之间断开连接.

此更改将缓冲区重新排序为具有与窗口相同的索引,同时将游标默认为合并结果作为底部窗口.