How can I view the output of `git show` in a diff viewer like meld, kdiff3, etc
Solution 1
You can use git difftool
to show a single commit.
Say you want to see the commit with the sha1 abc123
:
git difftool abc123~1 abc123
(~1
tells git to move to the previous commit, so abc123~1
is the commit before abc123
)
If you use this regularly, you could make a custom git command to make it easier:
Create a file called
git-showtool
somewhere on your$PATH
with the following contents:git difftool $1~1 $1
Give that file execute permissions:
chmod +x ~/path/to/git-showtool
Use the command
git showtool <sha1 or tag or ...>
- Profit.
Solution 2
Building on georgebrock's response, you can create an alias in .gitconfig, something like this:
showtool = "!showci () { rev=${1:-HEAD}; git difftool $rev~1 $rev; }; showci $1"
Then you can run it with git showtool abc123
(without needing to create a separate shell script for this). If you leave out the revision it will default to HEAD.
Solution 3
Translating sagittarian's suggestion for the less git savvy, add this to your global .gitconfig file which resides in C:\Users[user name] if you are a windows user:
[alias]
showtool = "!showci () { rev=${1:-HEAD}; git difftool $rev~1 $rev; }; showci $1"
or you can execute the following command in the get bash shell:
git config --global alias.showtool '!showci () { rev=${1:-HEAD}; git difftool $rev~1 $rev; }; showci $1'
which will make the change to the .gitconfig file for you.
Solution 4
Building on sagitarrian's answer, here's a small change for more generic rev syntax:
showtool = "!showci () { rev=$(git rev-parse \"${*:-HEAD}\"); git difftool $rev~1 $rev; }; showci"
I use rev-parse
to transparently allow complex rev expressions.
I removed the $1
at the end, since the alias is called followed by the arguments; it passes unnoticed when using only $1
but breaks $*
behaviour.
This allows doing nice things like:
git showtool :/some nasty bug
Solution 5
Geogrebrock answer is fine, but can be improved thus:
commit=$1
shift
git difftool $commit~1 $commit $@
Put it in executable (chmod +x) file somewhere in $PATH.
Now you can pass additional arguments, for example specify what files you want to see (and ignore others):
$ git showtool 6a40ec6ffb9338b0548aefab92fded1bffb1648a -- src-cmn/
Buttons840
Updated on June 06, 2022Comments
-
Buttons840 almost 2 years
There are many SO questions that show how to view the output of a
git diff
command in a diff viewer like meld usinggit difftool
or otherwise. I am not asking aboutgit diff
though.I want to see the output of
git show <previous commit sha1>
in a diff viewer like meld. How can I do this? -
Buttons840 over 9 yearsI agree a git alias would probably be better. Thanks for the suggestion.
-
user2291758 about 9 yearsalso, you should cross-check what commit you are going to view and whether it contains many changed files. because meld is going to open one after the other consecutively
-
jpierson about 7 yearsUnfortunately I get the following error. Launch '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
-
StormRider almost 7 yearsI strongly prefer this solution :) And I passed --dir-diff to the difftool command to be even more convenient for me.
-
Abdul Rauf almost 6 years
git show $commit
is not equivalent togit difftool $commit~1 $commit
if we are reviewing a merge commit. git show presents the merge commit in a special format as produced bygit diff-tree --cc $commit
. See git-scm.com/docs/git-show -
jocull almost 6 yearsYou can use the
^
to do parent commits also likegit difftool abc123^ abc123
. Apply multiple times to go up the tree higher likeabc123^^^
-
ericcurtin over 3 yearsSomebody should merge this nice and simple tool to mainline git
-
David Cook about 3 yearsEquivalent shell command:
git config --global alias.showtool '!showci () { rev=$(git rev-parse "${*:-HEAD}"); git difftool $rev~1 $rev; }; showci'
(I wasn't able to suggest the edit)