git difftool --tool-help
或git mergetool --tool-help
命令时,我看到以下内容:
vimdiff
vimdiff1
vimdiff2
vimdiff3
很遗憾,它们似乎没有被记录在任何地方。
相关源代码在这里。请注意,vimdiff
、nvimdiff
和gvimdiff
都是使用同一个脚本实现的。
当作为差异工具调用时,它们都执行相同的操作:
vim -R -f -d \
-c 'wincmd l' \
-c 'cd $GIT_PREFIX' \
"$LOCAL" "$REMOTE"
-R
和diff模式-d
启动Vim。有关diff模式的信息,请参阅manpage vimdiff(1)
和Vim帮助页面diff.txt
。
当作为mergetool调用时,这些选项的行为会有所不同。
在下面的图表中,Local
对应于"ours",Remote
对应于"theirs",Base
对应于"merge base",而Merge
是实际保存到工作树(并且如果解决成功,则被暂存到索引中)的文件。
vimdiff
如果存在"merge base",窗口布局如下:
# | Local | Base | Remote |
# | --------------------- |
# | Merge |
vim -f -d \
-c '4wincmd w | wincmd J' \
"$LOCAL" "$BASE" "$REMOTE" "$MERGED"
# | | | |
# | Local | Merge | Remote |
# | | | |
vim -f -d \
-c 'wincmd l' \
"$LOCAL" "$MERGED" "$REMOTE"
vimdiff1
布局如下:
# | | |
# | Local | Remote |
# | | |
vim -f -d "$LOCAL" "$REMOTE"
ret="$?"
if test "$ret" -eq 0
then
cp -- "$LOCAL" "$MERGED"
fi
Local
在成功后将保存到工作树中,取代Merged
的位置。
vimdiff2
布局与没有合并基础的vimdiff
相同。
vimdiff3
每个Local
、Remote
和Base
(如果存在)都将被打开但隐藏。 Merged
将被打开并可见。您可以使用:buffer
命令在这些缓冲区之间切换。
# With Base
vim -f -d \
-c 'hid | hid | hid' \
"$LOCAL" "$REMOTE" "$BASE" "$MERGED"
# Without Base
vim -f -d \
-c 'hid | hid' \
"$LOCAL" "$REMOTE" "$MERGED"
让我们创建一个 vimdiff4
工具,它使用与 vimdiff-with-Base
相同的布局,但省略了 Base 部分。
将以下内容添加到您的 Git 配置中(例如:$XDG_CONFIG_HOME/git/config
):
[mergetool "nvimdiff4"]
# Like "nvimdiff", but always ignore $BASE.
cmd = nvim -f -d -c '$wincmd w' -c 'wincmd J' $LOCAL $REMOTE $MERGED
git mergetool --tool-help
时,您将在输出中看到一行新内容: user-defined:
nvimdiff4.cmd nvim -d -c '$wincmd w' -c 'wincmd J' $LOCAL $REMOTE $MERGED
git mergetool --tool=nvimdiff4
,这将调用我们上面指定的命令。Documentation/mergetools/vimdiff.txt
文档中提到:vimdiff
或任何变体(例如:vimdiff3
、nvimdiff1
等)附加 1
、2
或 3
,以使用预定义的布局。--tool=[g,n,]vimdiffx
和使用 --tool=[g,n,]vimdiff
并设置配置变量 mergetool.[g,n,]vimdiff.layout
是一样的,其中 x=1
时的布局是 "@LOCAL, REMOTE"
,x=2
时的布局是 "LOCAL, MERGED, REMOTE"
,x=3
时的布局是 "MERGED"
。--tool=gvimdiff2
将会打开带有三列(LOCAL
、MERGED
和 REMOTE
)的 gvim
。vimdiff3
" 的回归问题。felipec
) 提交。gitster
-- 在 提交 4d8074b 中合并,2022年8月18日)
mergetools
: vimdiff: 修复单窗口布局Cc: Fernando Ramos
Signed-off-by: Felipe Contreras
Reviewed-by: Fernando Ramos
Layouts with a single window other than "
MERGED
" do not work (e.g. "LOCAL
" or "MERGED+LOCAL
").This is because as the documentation of
bufdo
says:The last buffer (or where an error occurred) becomes the current buffer.
And we do always do
bufdo
the end.Additionally, we do it only once, when it should be per tab.
Fix this by doing it once per tab right after it's created and before any buffer is switched.