为什么git mergetool会在vimdiff中打开4个窗口?(我希望是3个)

8mmmxcuj  于 2022-11-11  发布在  Git
关注(0)|答案(5)|浏览(140)

当我遇到冲突时,我尝试使用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?

r7s23pms

r7s23pms1#

作为替代方案,您是否考虑过使用fugitive
我不打算骗你; vim可能是有史以来最好的Git Package 器。
有一个很好的Vimcast,X1 E1 F1 X,作者是德鲁·尼尔。这是关于逃犯系列的一部分。
Vimcasts网站是了解更多关于vim的好地方。
要在合并工具时使用逃逸项,可以使用以下方法。

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

注意:您可能要将vim变更为mvimgvim
Fugitive提供的不仅仅是一个合并工具脚本,所以请确保您阅读了文档和/或查看了vimcast。

rn0zuynd

rn0zuynd2#

经过大量的研究发布mergetool与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个窗口模式下的基本窗口(中心窗口)抓取。
这可帮了大忙了!
我的~/.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

我希望这对你(和那些走到这里的人)有帮助。

6l7fqoea

6l7fqoea3#

注意:虽然您只能使用3个窗口,如Dr Becoanswer中所述
vim -d -c "wincmd l" "$LOCAL" "$MERGED" "$REMOTE"')、

git 2.8增强了4窗口模式(2016年3月)

2016年1月29日,第一张专辑《X1 e2f1x》发行。
(由Junio C Hamano -- gitster --合并到commit 82c17b7,2016年2月17日)
git mergetool“的vimdiff后端已经被调整为按照与大多数从左到右阅读的人的期望相匹配的顺序来排列和编号缓冲区,然后自上而下并基于该顺序“在头脑中”将缓冲区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缓冲区重新排序

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

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

在Git 2.31(2021年第一季度)中,合并工具只会考虑3个面板,而不是4个。
参见Seth House ( whiteinge )commit 30bb808(2021年2月13日)。
(2021年2月25日,由Junio C Hamano -- gitster --commit cadae71中合并)
第1011章:添加vimdiff 1合并工具变体
签署人:赛斯大厦
试验人:大卫阿吉拉尔
这又增加了另一个vimdiff/gvimdiff变量,并将冲突表示为'LOCAL'和'REMOTE'之间的双向差异。
未打开“合并”,这偏离了标准,因此在启动时将用法文本作为Vim消息回显,以指导用户如何继续和如何中止。
Vimdiff非常适合于双向比较,因此这是一个更简单、更流线化的冲突解决方案的选项。
例如:仅使用语法突出显示来传达两个以上文件之间的差异是困难的;当仅使用两个缓冲器时,用于在缓冲器之间获得和放置改变的默认Vimdiff命令不需要用户手动指定源或目的地缓冲器。
与其他直接比较“LOCAL”和“REMOTE”的合并工具一样,此工具在与新的mergetool.hideResolved设置配合使用时将受益匪浅。
Arthur Bowers在评论中报告使用了:

git config --global mergetool.vimdiff.cmd \
'$merge_tool_path -f -d -c "4wincmd w | \
 wincmd J" "$LOCAL" "$BASE" "$REMOTE" "$MERGED"'
ha5z0ras

ha5z0ras4#

稍微修改一下this page中的命令:

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

然后执行以下命令:git mergetool .

:我也使用 * vibvant *,并强烈推荐使用。

xdnvmnnf

xdnvmnnf5#

我支持逃犯的建议。
你也可以试试splice.vim。它是一个Vim插件,设计用来作为git或mercurial合并工具的插入式替代。它允许你轻松地混合冲突的不同视图。它也非常快速、直接,并且在使合并更加直观方面做得很好。这里有一个screencast
您列出的文件是:
1.包含冲突的本地文件。
1.要合并到的分支中的文件。
1.合并来源分支中的文件。
1.这个文件在两个分支的祖先或节点中都是一样的。这个文件对于弄清楚发生了什么非常有用!
希望这对你有帮助。

相关问题