【问题标题】:How can I view multiple git diffs side by side in vim如何在 vim 中并排查看多个 git 差异
【发布时间】:2021-03-26 10:36:39
【问题描述】:

我希望能够运行一个在 vim 中打开 git diff 的命令,并为 diff 集中的每个文件提供一个选项卡。

因此,例如,如果我在工作树中更改了文件 foo.txt 和 bar.txt 并运行命令,我会看到 vim 打开有两个选项卡。第一个选项卡将包含我的工作树中的 foo.txt 和存储库中的 foo.txt 之间的并排差异,第二个选项卡将包含 bar.txt 的并排差异。

有人有什么想法吗?

【问题讨论】:

    标签: git vim diff


    【解决方案1】:

    改编自 Benjamin Bannier + Dave Kirby 对于逃犯用户的上述回答。

    因为我使用 fugitive.vim,所以我针对我最常见的用例调整了上述内容,查看了最后 2 次提交之间的差异:

    vim -p $(git diff --name-only HEAD~1 HEAD) -c "tabdo :Gdiff HEAD~1"
    

    将所有更改加载到选项卡中比使用git difftool 按顺序浏览它们要好得多。

    【讨论】:

    • 这就是我要找的答案,现在我只需要一个别名就完成了,谢谢。
    【解决方案2】:

    我会这样做的方式(虽然它不是一个命令)

    1. 在新的vim 选项卡中打开带有更改的文件:

      vim -p $(git diff --name-only)

    2. 对于每个缓冲区,使用 vcscommand vim plugin 获取与当前 HEAD 的差异

      :VCSVimDiff

    这可以很好地看出差异,尽管不是补丁形式。

    对于其他任何事情,我都会坚持git diff

    编辑

    就像 Dave 在下面写的那样,步骤 1 和 2 可以通过使用结合起来

    vim -p $(git diff --name-only) -c "tabdo VCSVimDiff"
    

    【讨论】:

    • 您可以将其组合成一个命令,该命令可以放入一个shell脚本或函数中。 (前面未经测试的代码): vim -p $(git diff --name-only) -c "tabdo VCSVimDiff"
    • 我尝试了单行和两部分命令。它只对打开的最后一个选项卡进行比较。其他选项卡必须调用 :VCSVimDiff。解决方案?.. 我想让所有标签都运行差异。
    • 与单个参考文件相比,许多本地文件的差异gvim -p <file list> -c "tabdo vert diffsplit ref.log"
    【解决方案3】:

    虽然它不能完全满足您的需求,但 git difftool 可能是您最好的选择。 'git difftool --tool=vimdiff --no-prompt HEAD' 的开箱即用行为是为工作目录中的每个文件按顺序启动 vimdiff 并进行更改。

    【讨论】:

    • 非常有用。全部内置于 git 和 vim 中。没有麻烦,没有大惊小怪。
    【解决方案4】:

    我想出了以下脚本来实现 git difftoll + vimdiff 提供的行为,但使用制表符:

    #!/bin/bash
    
    commit1=$1
    commit2=$2
    
    files=`git diff ${commit1} ${commit2} --name-only`
    
    cmd="set nosplitright | set nobackup | set noswapfile"
    
    EXE="| silent exe"
    
    for f in $files; do
        if [ -z "$commit2" ]; then
            cmd+="$EXE ':tabnew $f'"
        else
            cmd+="$EXE ':tabnew | f <${commit2}>/${f} | setlocal buftype=nofile | 0read ! git show ${commit2}:$f'"
        fi
        cmd+="$EXE ':0 | filetype detect'"
        cmd+="$EXE ':vnew | f <${commit1}>/${f} | setlocal buftype=nofile | 0read ! git show ${commit1}:$f'"
        cmd+="$EXE ':0 | filetype detect'"
        cmd+="$EXE ':windo diffth'"
    done
    cmd+="$EXE 'bd 1 | tabfirst'"
    
    vim -c "$cmd"
    

    这样称呼它: vimgd &lt;commit1&gt; &lt;commit2&gt;

    【讨论】:

      【解决方案5】:

      这个简单的插件对我有用:TabMultiDiff。它基本上为传递给 vim 的每对文件创建一个差异选项卡。该选项卡以每对中的第二个文件命名。

      注意不是plugin manager compatible,所以需要手动安装,将tab-multi-diff.vim复制到.vim/plugin

      这是比较两对简单文件(aaa/aab 和 aac/aad)的屏幕截图。请注意,我也使用vim-scripts/diffchar.vim,这就是突出显示单个字符的原因。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-12
        • 2013-11-17
        • 2012-12-07
        • 1970-01-01
        • 1970-01-01
        • 2011-12-01
        • 1970-01-01
        相关资源
        最近更新 更多