同时使用 Vimdiff 和 git

同时使用 Vimdiff 和 git

我使用 vimdiff 作为 git 的 difftool。

假设我更改了 12 个文件。问题是,有时我运行git diff并在第四或第五个文件附近看到一些我想编辑/更改的内容。有时我需要在此之外进行一些更改。问题是我不能就这样:qa回去继续 hacking,因为 vimdiff 中会弹出六七个 diff。:qa如果不每次我想中止 git diff 时都查看所有这些文件,那就太乏味了。

有没有办法将 vimdiff 设置为 git 的 difftool,以便所有差异都在同一个 vim 实例中打开,例如在单独的选项卡中?

答案1

你可以使用已发布的 vim 插件这里. 然后你只需要设置 difftool:

[multidiff]
  tool = vd -f

作为一个替代应用程序,我建议使用meld它来显示已修改的文件 - 然后您可以只选择您想要查看差异的文件。

查看截图在这里举个例子。

进一步听取 Marcos 的有用评论,作为第三种(手动替代方案),如果您想使用,vimdiff我建议meld在脚本中遵循以下策略(可能python):

  • 使用git diff-files --name-statusgit diff-index --name-status --cached HEAD识别需要检查的文件。
  • 获取这些文件的缓存版本并放置在/tmp/
  • 一次打开所有这些文件 - 已更改的文件及其缓存版本 -vimdiff尽管从您需要的意义上来说很可能无法实现 - 请参阅下文。

但是,由于vimdiff它本身似乎无法处理多个不同的选项卡,因此我建议您使用上面的其他建议之一。

答案2

一个非常简单的解决方法是在 ~/.gitconfig 文件中添加此选项

[difftool]
    tool = vimdiff $LOCAL $REMOTE
    prompt = true

这样,在每次文件比较之前,系统都会提示您,您可以通过回答“否”来跳过文件,或者使用 Ctrl+C 中止文件比较

例子:

$ git difftool
Viewing: 'file1.js'
Launch 'vimdiff' [Y/n]: y
2 files to edit

Viewing: 'file2.js'
Launch 'vimdiff' [Y/n]: n

答案3

这是我使用的。它要求您使用vim 逃犯

[alias] dt = "!f() { vim -p $(git diff --name-only) +\"tabdo Gdiff $@\" +tabfirst; }; f"

git dt然后将在一个单独的选项卡中打开每个不同的对。然后:tabclose关闭单个对,或者:qa退出。

来源

答案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 <commit1> <commit2>

相关内容