【问题标题】:What are the various "vimdiff" difftools/mergetools?什么是各种“vimdiff”difftools/mergetools?
【发布时间】:2021-09-14 01:13:47
【问题描述】:

当我运行git difftool --tool-helpgit mergetool --tool-help 时,我看到了:

  • vimdiff
  • vimdiff1
  • vimdiff2
  • vimdiff3

这些不同的“版本”是什么?我假设他们都以不同的选项启动 Vim,但选项是什么?它们是否记录在任何地方?

【问题讨论】:

    标签: git vimdiff mergetool


    【解决方案1】:

    不幸的是,它们似乎没有记录在任何地方。

    相关源码为here。请注意vimdiffnvimdiffgvimdiff 是如何使用相同的脚本实现的。

    差异工具

    当作为 difftool 调用时,它们都做同样的事情:

    vim -R -f -d \
      -c 'wincmd l' \
      -c 'cd $GIT_PREFIX' \
      "$LOCAL" "$REMOTE"
    

    这会以只读模式 -R 和差异模式 -d 启动 Vim。有关 diff 模式的信息,请参阅手册页 vimdiff(1) 和 Vim 帮助页 diff.txt

    合并工具

    当作为合并工具调用时,这些选项的行为会有所不同。

    在下图中,Local 对应“ours”,Remote 对应“theirs”,Base 对应“merge base”,Merge 是实际要保存到工作树(如果解析成功则暂存到索引)。

    vimdiff

    如果存在“合并基础”,则窗口布局为:

    # | 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,它将调用我们上面指定的命令。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-17
      • 1970-01-01
      • 2013-01-28
      • 2010-09-10
      • 1970-01-01
      相关资源
      最近更新 更多