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

时间:2011-09-05 14:53:18

标签: git vim vimdiff

当我遇到冲突时,我尝试使用git-mergetool来解决它。我打字:

>git mergetool -t vimdiff

它以4向打开vimdiff,而不是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

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

5 个答案:

答案 0 :(得分:32)

作为替代方案,您是否考虑过使用fugitive

  

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

Drew Neil有一个很棒的vimcast Fugitive.vim - resolving merge conflicts with vimdiff。这是逃犯系列的一部分。

Vimcasts网站是了解更多有关vim的好地方。

要在合并工具时使用逃犯,您可以使用以下内容。

git config --global mergetool.fugitive.cmd 'vim -f -c "Gdiff" "$MERGED"'
git config --global merge.tool fugitive

注意:您可能希望将vim更改为mvimgvim

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

答案 1 :(得分: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'

现在你可以输入3个窗口:

git m3

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

git mt

此外,您可能希望将此行添加到~/.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

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

这很有帮助!

我的~/.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

我希望这可以帮助你(以及那些到达这里的人)。

答案 2 :(得分:5)

修改this page的命令:

git config --global mergetool.vimdiff3.cmd 'vim -f -d "$LOCAL" "$MERGED" "$REMOTE"'
git config --global merge.tool vimdiff3
  • '合并'将是您的工作副本。
  • '本地'您尝试进行更改的分支中的文件
  • '远程'来自您尝试合并的分支机构的文件。

然后执行命令:git mergetool

注意:我也使用逃犯并强烈推荐它。

答案 3 :(得分:5)

注意:虽然您只能使用Dr Beco&#39; answer中所述的3个Windows (vim -d -c "wincmd l" "$LOCAL" "$MERGED" "$REMOTE"'),
使用git 2.8增强了4-windows模式(2016年3月)

commit 2300328Dickson Wong (diwo)(2016年1月29日) Junio C Hamano -- gitster --在2016年2月17日commit 82c17b7合并)

  

&{34; vimdiff&#34; git mergetool后端已被调整安排   并按照与期望匹配的顺序编号缓冲区   大多数人从左到右阅读,然后自上而下并分配   缓冲区1 2 3 4&#34;精神上&#34;以本地基础远程合并窗口为基础   在那个订单上。

在内部,git现在将使用:

"$merge_tool_path" -f -d -c '4wincmd w | wincmd J' \
            "$LOCAL" "$BASE" "$REMOTE" "$MERGED"

而不是:

"$merge_tool_path" -f -d -c 'wincmd J' \
        "$MERGED" "$LOCAL" "$BASE" "$REMOTE"
  

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

     

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

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

答案 4 :(得分:4)

我将推荐逃犯。

你也可以尝试splice.vim。它是一个Vim插件,旨在充当git或mercurial mergetool drop-in替代品。它允许您轻松地改变冲突的各种观点。它也非常快速,直接,并且在使合并更直观方面做得很好。这是一个screencast

您列出的文件是:

  1. 包含冲突的本地文件。
  2. 您要合并的分支中的文件。
  3. 您要合并的分支中的文件。
  4. 该文件位于两个分支的ancesestor节点中。这个文件对于弄清楚发生了什么非常有用!
  5. 希望这有帮助。