我该如何在meld、kdiff3等差异查看器中查看`git show`的输出?

65

有许多SO问题展示了如何使用git difftool或其他方式将git diff命令的输出在诸如meld之类的差异查看器中查看。然而,我并不是在询问git diff

我想在像meld这样的差异查看器中查看git show <previous commit sha1>的输出。我该怎么做?


2
gitkgitg等等都是常见的。 - twalberg
6个回答

70

你可以使用git difftool来显示单个提交。

比如,如果你想看sha1为abc123的提交:

git difftool abc123~1 abc123

(~1告诉git要移到前一个提交,因此abc123~1abc123之前的提交)

如果你经常使用这个功能,可以创建一个自定义git命令来使它更容易:

  1. 在你的$PATH中某个地方创建一个名为git-showtool的文件,并将以下内容复制进去:

  2. git difftool $1~1 $1
    
  3. 赋予该文件执行权限:

    chmod +x ~/path/to/git-showtool
    
  4. 使用命令 git showtool <SHA1或标签或...>

  5. 获得收益。

此外,您应该交叉检查要查看的提交以及它是否包含许多更改的文件。因为meld将一个接一个地连续打开。 - user2291758
很不幸,我遇到了以下错误。启动'p4mergetool' [Y/n]? Y /mingw64/libexec/git-core/git-mergetool--lib: eval: line 124: unexpected EOF while looking for matching `"' /mingw64/libexec/git-core/git-mergetool--lib: eval: line 125: syntax error: unexpected end of file - jpierson
2
如果我们正在审查一个合并提交,则git show $commitgit difftool $commit~1 $commit不等效。git showgit diff-tree --cc $commit生成的特殊格式呈现合并提交。请参见 https://git-scm.com/docs/git-show。 - Abdul Rauf
1
您可以使用^,例如git difftool abc123^ abc123来进行父级提交。多次应用可以向上跳树,例如abc123^^^ - jocull
有人应该将这个简单好用的工具合并到主线 Git 中。 - ericcurtin

30

在georgebrock的回答基础上,您可以在.gitconfig中创建一个别名,类似于这样:

showtool = "!showci () { rev=${1:-HEAD}; git difftool $rev~1 $rev; }; showci $1"

然后您可以使用 git showtool abc123 运行它(无需创建单独的 shell 脚本)。如果省略版本,它将默认为 HEAD。


1
我同意使用Git别名可能更好。感谢您的建议。 - Buttons840
我强烈倾向于这个解决方案 :) 并且我将 --dir-diff 传递给 difftool 命令,以便更加方便。 - StormRider

14

对于不太熟悉git的人,将Sagittarian的建议添加到您的全局.gitconfig文件中。如果您是Windows用户,该文件位于C:\ Users [用户名] 下:

[alias]
    showtool = "!showci () { rev=${1:-HEAD}; git difftool $rev~1 $rev; }; showci $1"

或者您可以在获取bash shell中执行以下命令:

git config --global alias.showtool '!showci () { rev=${1:-HEAD}; git difftool $rev~1 $rev; }; showci $1'

这将为您自动更改.gitconfig文件。


5

在sagitarrian的回答基础上,这里有一个更通用的rev语法的小改变:

showtool = "!showci () { rev=$(git rev-parse \"${*:-HEAD}\"); git difftool $rev~1 $rev; }; showci"

我使用rev-parse来透明地允许复杂的rev表达式。

我删除了结尾处的$1,因为别名被调用后跟随参数;当仅使用$1时不会引起注意,但会破坏$*的行为。

这使得可以做出很好的事情,例如:

git showtool :/some nasty bug

1
等效的Shell命令:git config --global alias.showtool '!showci () { rev=$(git rev-parse "${*:-HEAD}"); git difftool $rev~1 $rev; }; showci' - David Cook

2

Geogrebrock的回答不错,但可以进一步改进:

commit=$1
shift
git difftool $commit~1 $commit $@

将它放在可执行文件(chmod +x)中的某个$PATH位置。

现在您可以传递附加参数,例如指定要查看的文件(并忽略其他文件):

$ git showtool 6a40ec6ffb9338b0548aefab92fded1bffb1648a -- src-cmn/

1

PATH 中的 git-showcommit 文件(可执行文件)应该如下:

#!/bin/bash

git difftool --dir-diff $1^..$1

然后你可以通过 git showcommit HEAD 或者 git showcommit a5b26d5 来调用这个新工具。


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