How can I view the output of `git show` in a diff viewer like meld, kdiff3, etc

13,012

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:

  1. Create a file called git-showtool somewhere on your $PATH with the following contents:

    git difftool $1~1 $1
    
  2. Give that file execute permissions:

    chmod +x ~/path/to/git-showtool
    
  3. Use the command git showtool <sha1 or tag or ...>

  4. 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/
Share:
13,012
Buttons840
Author by

Buttons840

Updated on June 06, 2022

Comments

  • Buttons840
    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 using git difftool or otherwise. I am not asking about git 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
    Buttons840 over 9 years
    I agree a git alias would probably be better. Thanks for the suggestion.
  • user2291758
    user2291758 about 9 years
    also, 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
    jpierson about 7 years
    Unfortunately 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
    StormRider almost 7 years
    I strongly prefer this solution :) And I passed --dir-diff to the difftool command to be even more convenient for me.
  • Abdul Rauf
    Abdul Rauf almost 6 years
    git show $commit is not equivalent to git difftool $commit~1 $commit if we are reviewing a merge commit. git show presents the merge commit in a special format as produced by git diff-tree --cc $commit. See git-scm.com/docs/git-show
  • jocull
    jocull almost 6 years
    You can use the ^ to do parent commits also like git difftool abc123^ abc123. Apply multiple times to go up the tree higher like abc123^^^
  • ericcurtin
    ericcurtin over 3 years
    Somebody should merge this nice and simple tool to mainline git
  • David Cook
    David Cook about 3 years
    Equivalent 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)