28

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

>git mergetool -t vimdiff

它以 4 路而不是 3 路打开vimdiff。我在 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?

4

5 回答 5

35

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

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

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

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

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

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

注意:您可能需要更改vimmvimgvim

Fugitive 提供的不仅仅是一个合并工具脚本,因此请确保您阅读文档和/或查看 vimcast。

于 2011-09-06T00:46:22.807 回答
9

经过大量研究发布带有 vimdiff 和只有 3 个窗口的 mergetool,我想出了这个配置,它允许我选择何时需要 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 窗口模式下从基础(中心窗口)抓取。

这很有帮助!

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

我希望这对您(以及到达这里的人)有所帮助。

于 2013-11-05T01:42:41.167 回答
5

修改此页面中的命令:

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

然后你执行命令:git mergetool.

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

于 2011-09-06T14:43:44.600 回答
5

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

请参阅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"

代替:

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

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

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

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


在 Git 2.31(2021 年第一季度)中,mergetools 仅帮助考虑 3 个面板,而不是 4 个。

请参阅Seth House ( ) 的提交 30bb808(2021 年 2 月 13 日(由Junio C Hamano 合并 -- --cadae71 提交中,2021 年 2 月 25 日)whiteinge
gitster

mergetools/vimdiff: 添加 vimdiff1 合并工具变体

签名人:Seth House
测试人:David Aguilar

这增加了另一个 vimdiff/gvimdiff 变体,并将冲突呈现为 'LOCAL' 和 'REMOTE' 之间的双向差异。
'MERGED' 未打开,这偏离了规范,因此使用文本在启动时作为 Vim 消息回显,指示用户如何继续以及如何中止。

Vimdiff 非常适合双向差异,因此这是一种更简单、更精简的冲突解决方案。
例如:仅使用语法高亮很难传达两个以上文件之间的差异;当仅使用两个缓冲区时,用于在缓冲区之间获取和放置更改的默认 vimdiff 命令不需要用户手动指定源缓冲区或目标缓冲区。

与直接将“本地”与“远程”进行比较的其他合并工具一样,此工具在与新mergetool.hideResolved设置配对时会受益。

于 2016-02-18T13:02:42.457 回答
4

我会支持逃犯的建议。

你也可以试试splice.vim。这是一个 Vim 插件,旨在充当 git 或 mercurial 合并工具的替代品。它使您可以轻松地调整冲突的各种视图。它也非常快速、直接,并且在使合并更直观方面做得很好。这是一个截屏视频

您列出的文件是:

  1. 包含冲突的本地文件。
  2. 您要合并到的分支中的文件。
  3. 您要合并的分支中的文件。
  4. 两个分支祖先节点中的文件。该文件对于弄清楚发生了什么非常有用!

希望这可以帮助。

于 2011-09-06T08:34:02.290 回答