threads / discuss / 7294

[wishlist] graphical diff

Subject: [wishlist] graphical diff

## tl;dr

11 messages between Mar 18, 2007 and Mar 19, 2007.

replies: 10people: 5as markdown or json

Raimund Bauer· Mar 18, 2007, 13:16 UTC · lore

I think it would be really helpful (especially for newbies like me) to have an option like

git diff --gui [revisions] <singe path spec>
to fire up a graphical diff viewer (similar to what git-mergetool does).

Another good place to start a graphical diff from is probably gitk from a context-menu for the changed files in the lower right pane.

Thoughts?
-- 
best regards

  Ray
Robin Rosenberg· Mar 18, 2007, 15:06 UTC · re: Raimund Bauer · lore

Re: [wishlist] graphical diff

söndag 18 mars 2007 14:16 skrev Raimund Bauer:
Show 12 quoted lines
> I think it would be really helpful (especially for newbies like me) to
> have an option like
> 
> git diff --gui [revisions] <singe path spec>
> 
> to fire up a graphical diff viewer (similar to what git-mergetool does).
> 
> Another good place to start a graphical diff from is probably gitk from
> a context-menu for the changed files in the lower right pane.
> 
> Thoughts?
> 

Fine, except it is not likely to be my favourite gui. But you don't have to wait, you can get a gui easily today.

Pipe the output to another tool. Kompare is such a tool which can take a patch and compare it. It does not have to a single file. You can diff two trees and compare. You'll need at kdesdk version 3.5.5 (or 3.5.6) or the patch in http://bugs.kde.org/show_bug.cgi?id=131717 for kompare to display git diffs.

git diff HEAD^..HEAD | kompare -
As for other gui's I don't know which ones work easily out of the box. 
Eclipse will soon have recursive diff mode for git. Seems to work here, so I'll probably submit it soon). 
-- robin
Johannes Schindelin· Mar 18, 2007, 23:09 UTC · re: Robin Rosenberg · lore

Re: [wishlist] graphical diff

Hi,
On Sun, 18 Mar 2007, Robin Rosenberg wrote:
Show 5 quoted lines
> söndag 18 mars 2007 14:16 skrev Raimund Bauer:
> > I think it would be really helpful (especially for newbies like me) to
> > have an option like
> > 
> > git diff --gui [revisions] <singe path spec>

And how do you set _what_ gui you want? Everybody has her pet diff-viewer (mine is less, BTW).

Show 6 quoted lines
> Fine, except it is not likely to be my favourite gui. But you don't have 
> to wait, you can get a gui easily today.
>
> [...] 
> 
> git diff HEAD^..HEAD | kompare -

BTW here, "kompare -" does not work as expected. It shows an empty diff. At any rate, have you tried something like "GIT_PAGER='kompare -' git diff HEAD^..HEAD"?

This reminds me that I always wanted to be able to set the pager from the command line, so I can set an alias easily:

-- snipsnap -- [PATCH] Allow setting the pager from the command line

The command `git` already allows piping the output into a pager with `-p`. Now also allow to set the pager with `-p=<pager-cmd>`.

With this, it is possible to make an alias of command/pager combos, like this:

	$ git config alias.showmore '-p=more show'
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
---
 Documentation/git.txt |    8 +++++---
 git.c                 |    7 ++++++-
 2 files changed, 11 insertions(+), 4 deletions(-)
diff --git a/Documentation/git.txt b/Documentation/git.txt
index 0b1203e..5634b30 100644
--- a/Documentation/git.txt
+++ b/Documentation/git.txt
@@ -9,7 +9,7 @@ git - the stupid content tracker
 SYNOPSIS
 --------
 [verse]
-'git' [--version] [--exec-path[=GIT_EXEC_PATH]] [-p|--paginate]
+'git' [--version] [--exec-path[=GIT_EXEC_PATH]] [-p|--paginate][=<pager-cmd>]
 	[-n|--name-rev] [-t|--name-rev-by-tags] [--bare]
 	[--git-dir=GIT_DIR] [--help] COMMAND [ARGS]
 
@@ -75,8 +75,10 @@ OPTIONS
 	environment variable. If no path is given 'git' will print
 	the current setting and then exit.
 
--p|--paginate::
-	Pipe all output into 'less' (or if set, $PAGER).
+-p|--paginate[=<pager-cmd>]::
+	Pipe all output into 'less'. You can override this by
+	"=<pager-cmd>", or setting the environment variables $GIT_PAGER
+	or $PAGER (in that order).
 
 -n|--name-rev:
 	Try naming all SHA1s, and page the result (see
diff --git a/git.c b/git.c
index fca1dfb..76b126d 100644
--- a/git.c
+++ b/git.c
@@ -4,7 +4,7 @@
 #include "quote.h"
 
 const char git_usage_string[] =
-	"git [--version] [--exec-path[=GIT_EXEC_PATH]] [-p|--paginate] [--bare] [--git-dir=GIT_DIR] [--help] COMMAND [ARGS]";
+	"git [--version] [--exec-path[=GIT_EXEC_PATH]] [-p|--paginate][=pager_cmd] [--bare] [--git-dir=GIT_DIR] [--help] COMMAND [ARGS]";
 
 static void prepend_to_path(const char *dir, int len)
 {
@@ -58,6 +58,11 @@ static int handle_options(const char*** argv, int* argc)
 			}
 		} else if (!strcmp(cmd, "-p") || !strcmp(cmd, "--paginate")) {
 			setup_pager();
+		} else if (!prefixcmp(cmd, "-p=") ||
+				!prefixcmp(cmd, "--paginate=")) {
+			const char *equal = strchr(cmd, '=');
+			setenv("GIT_PAGER", equal + 1, 1);
+			setup_pager();
 		} else if (!strcmp(cmd, "-n") || !strcmp(cmd, "--name-rev"))
 			setup_name_rev_pager(0);
 		else if (!strcmp(cmd, "-t") ||
-- 
1.5.0.4.2713.g4ff1
Robin Rosenberg· Mar 18, 2007, 23:51 UTC · re: Johannes Schindelin · lore

Re: [wishlist] graphical diff

måndag 19 mars 2007 00:09 skrev Johannes Schindelin:
> On Sun, 18 Mar 2007, Robin Rosenberg wrote:
> > git diff HEAD^..HEAD | kompare -
> 
> BTW here, "kompare -" does not work as expected. It shows an empty diff. 

I think that's what the older kompare did. That why mentioned that you need the verson from 3.5.5, or even 3.5.6 for this to work.

> At any rate, have you tried something like "GIT_PAGER='kompare -' git diff 
> HEAD^..HEAD"?
Doesn't work here. Shows empty diff...

but AH, that's because of the colored-diff settings. I you have color.diff or color.status set to true neither version will work. With auto the first one will, but not the second.

-- robin
Johannes Schindelin· Mar 19, 2007, 00:09 UTC · re: Robin Rosenberg · lore

Re: [wishlist] graphical diff

Hi,
On Mon, 19 Mar 2007, Robin Rosenberg wrote:
Show 9 quoted lines
> måndag 19 mars 2007 00:09 skrev Johannes Schindelin:
> 
> > At any rate, have you tried something like "GIT_PAGER='kompare -' git 
> > diff HEAD^..HEAD"?
>
> Doesn't work here. Shows empty diff...
> 
> but AH, that's because of the colored-diff settings. I you have 
> color.diff or color.status set to true neither version will work.

I wonder why we still have "color.diff=true", which is wrong in almost _all_ cases (instead it should be auto).

> With auto the first one will, but not the second.

That is to be expected... Git actually expects the pager to be just that, a pager. So you have to say

$ GIT_PAGER='kompare -' git diff --no-color HEAD^..HEAD

Hth, Dscho

Raimund Bauer· Mar 19, 2007, 08:14 UTC · re: Johannes Schindelin · lore

RE: [wishlist] graphical diff

On Monday, March 19, Johannes Schindelin wrote:
Show 10 quoted lines
> > söndag 18 mars 2007 14:16 skrev Raimund Bauer:
> > > I think it would be really helpful (especially for 
> newbies like me) 
> > > to have an option like
> > > 
> > > git diff --gui [revisions] <singe path spec>
> 
> And how do you set _what_ gui you want? Everybody has her pet 
> diff-viewer 
> (mine is less, BTW).

Maybe with a git.gui config option (like merge.tool)? Or by specifying on the commandline:

git diff --gui=<my-gui-differ> ...
And <my-gui-differ> = xxdiff | kompare | tkdiff | ...
-- 
best regards

  Ray
Johannes Schindelin· Mar 19, 2007, 13:00 UTC · re: Raimund Bauer · lore

RE: [wishlist] graphical diff

Hi,
On Mon, 19 Mar 2007, Raimund Bauer wrote:
Show 18 quoted lines
> On Monday, March 19, Johannes Schindelin wrote:
> > > söndag 18 mars 2007 14:16 skrev Raimund Bauer:
> > > > I think it would be really helpful (especially for 
> > newbies like me) 
> > > > to have an option like
> > > > 
> > > > git diff --gui [revisions] <singe path spec>
> > 
> > And how do you set _what_ gui you want? Everybody has her pet 
> > diff-viewer 
> > (mine is less, BTW).
> 
> Maybe with a git.gui config option (like merge.tool)?
> Or by specifying on the commandline:
> 
> git diff --gui=<my-gui-differ> ...
> 
> And <my-gui-differ> = xxdiff | kompare | tkdiff | ...

Have you actually looked at the patch I sent? It is more logical to say "git -p=<bla> diff ..." when the option "-p" (without "=") already exists.

Ciao, Dscho

Raimund Bauer· Mar 19, 2007, 16:44 UTC · re: Johannes Schindelin · lore

RE: [wishlist] graphical diff

Hi,
On Mon, 2007-03-19 at 14:00 +0100, Johannes Schindelin wrote:
Show 9 quoted lines
> > Maybe with a git.gui config option (like merge.tool)?
> > Or by specifying on the commandline:
> > 
> > git diff --gui=<my-gui-differ> ...
> > 
> > And <my-gui-differ> = xxdiff | kompare | tkdiff | ...
> 
> Have you actually looked at the patch I sent? It is more logical to say 
> "git -p=<bla> diff ..." when the option "-p" (without "=") already exists.

I have, and I can't see your patch doing what I want. Sorry if I haven't made myself clear what I want, but I was thinking about a shortcut for something like the following example sequence:

$ git show v1.4.0:git.c > git.c.v1.4.0 $ git show v1.4.4:git.c > git.c.v1.4.4 $ tkdiff git.c.v1.4.0 git.c.v1.4.4 $ rm git.c.v1.4.0 git.c.v1.4.4

Replace tkdiff with the differ of your choice.

At least for comparing 2 single blobs that behavior should be well defined. For comparing multiple blobs, checking them out in 2 separate directories and starting the differ with the directories could work, but I'm more after the single-file case for now ... and that's also the one that should be easy to start from gitk.

If there's a way to do that by setting the pager I'll be happy to do so ;-)

> Ciao,
> Dscho
-- 
best regards

  Ray
Johannes Schindelin· Mar 19, 2007, 16:49 UTC · re: Raimund Bauer · lore

RE: [wishlist] graphical diff

Hi,
On Mon, 19 Mar 2007, Raimund Bauer wrote:
> $ git show v1.4.0:git.c > git.c.v1.4.0
> $ git show v1.4.4:git.c > git.c.v1.4.4
> $ tkdiff git.c.v1.4.0 git.c.v1.4.4
> $ rm git.c.v1.4.0 git.c.v1.4.4
This almost looks like a script! Why don't you make it one?

Ciao, Dscho

Raimund Bauer· Mar 19, 2007, 20:29 UTC · re: Johannes Schindelin · lore

RE: [wishlist] graphical diff

On Mon, 2007-03-19 at 17:49 +0100, Johannes Schindelin wrote:
Show 10 quoted lines
> Hi,
> 
> On Mon, 19 Mar 2007, Raimund Bauer wrote:
> 
> > $ git show v1.4.0:git.c > git.c.v1.4.0
> > $ git show v1.4.4:git.c > git.c.v1.4.4
> > $ tkdiff git.c.v1.4.0 git.c.v1.4.4
> > $ rm git.c.v1.4.0 git.c.v1.4.4
> 
> This almost looks like a script! Why don't you make it one?

Because I had hoped that someone more familiar with git and scripting than me can come up with something, that 1.) also works in the multi-file case 2.) can take all the usual object and revision specifiers that git diff takes.

And then there's gitk integration ...
But I'll take a look at it ;-)
> Ciao,
> Dscho
-- 
best regards

  Ray
Christian MICHON· Mar 18, 2007, 21:39 UTC · re: Raimund Bauer · lore

Re: [wishlist] graphical diff

On 3/18/07, Raimund Bauer <ray007@gmx.net> wrote:
Show 12 quoted lines
> I think it would be really helpful (especially for newbies like me) to
> have an option like
>
> git diff --gui [revisions] <singe path spec>
>
> to fire up a graphical diff viewer (similar to what git-mergetool does).
>
> Another good place to start a graphical diff from is probably gitk from
> a context-menu for the changed files in the lower right pane.
>
> Thoughts?
>

gvimdiff is pretty cool. Have a look at the archives, I asked recently how to perform this, and a few solutions came out (you need a sane shell, and the abilities to create fifos).

I'd use it everyday if a true vim/gvim explorer plugin would exist (and it's hard to code!).

-- 
Christian

← back to recent threads