如何在vim中并排查看多个git diff

时间:2010-03-11 19:34:57

标签: git vim diff

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

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

有人有任何想法吗?

5 个答案:

答案 0 :(得分:7)

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

  1. 打开包含新vim标签更改的文件:

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

  2. 对于每个缓冲区,使用vcscommand vim plugin

    将diff传递给当前的HEAD

    :VCSVimDiff

  3. 这可以很好地了解差异,但不是补丁形式。

    我还会坚持git diff

    修改

    如下面的Dave所述,可以使用

    组合步骤1和2
    vim -p $(git diff --name-only) -c "tabdo VCSVimDiff"
    

答案 1 :(得分:4)

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

因为我使用了fugitive.vim,所以我将上面的内容用于我最常用的用例,查看最后两次提交之间的差异:

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

将所有更改加载到标签页比使用git difftool按顺序排列它们要好得多。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

example_texts = ['سلام دنیا']
chars = tf.strings.unicode_split(example_texts, input_encoding='UTF-8')
print(chars)

<tf.RaggedTensor [[b'\xd8\xb3', b'\xd9\x84', b'\xd8\xa7', b'\xd9\x85', b' ', b'\xd8\xaf', 
b'\xd9\x86', b'\xdb\x8c', b'\xd8\xa7']]>

这样称呼它: #!/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"

答案 4 :(得分:0)

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

请注意,它不是plugin manager compatible,因此您需要通过将tab-multi-diff.vim复制到.vim/plugin来手动安装。

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