有哪些“vimdiff”差异工具/合并工具?

10
当我运行git difftool --tool-helpgit mergetool --tool-help命令时,我看到以下内容:
  • vimdiff
  • vimdiff1
  • vimdiff2
  • vimdiff3
这些不同的“版本”是什么?我猜它们使用不同的选项启动Vim,但这些选项是什么?它们是否有文档记录?
2个回答

8

很遗憾,它们似乎没有被记录在任何地方。

相关源代码在这里。请注意,vimdiffnvimdiffgvimdiff都是使用同一个脚本实现的。

Difftool

当作为差异工具调用时,它们都执行相同的操作:

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

当作为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

每个LocalRemoteBase(如果存在)都将被打开但隐藏。 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,这将调用我们上面指定的命令。

1
最近(2022年),Documentation/mergetools/vimdiff.txt 文档中提到:
此外,为了向后兼容之前的 Git 版本,您还可以将 vimdiff 或任何变体(例如:vimdiff3nvimdiff1 等)附加 123,以使用预定义的布局。
换句话说,使用 --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 将会打开带有三列(LOCALMERGEDREMOTE)的 gvim
Git 2.37.3(2022 年第 3 季度)应该能更好地工作,它修复了 "vimdiff3" 的回归问题。
请参见 提交 34133d9提交 b6014ee提交 ffcc33f提交 60184ab提交 66dd83a提交 79db50d提交 d619183(2022年8月10日)由 Felipe Contreras(felipec 提交。
(由 Junio C Hamano -- 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.


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接