threads / patch / 16073

patchImplement git-staged, an alias for 'git diff --cached'.

Subject: [PATCH] Implement git-staged, an alias for 'git diff --cached'.

## tl;dr

25 messages between Oct 28, 2008 and Oct 29, 2008. Diffs are folded; open one to read it.

replies: 24people: 10as markdown or json

David Symonds· Oct 28, 2008, 23:39 UTC · lore
Signed-off-by: David Symonds <dsymonds@gmail.com>
---
  This isn't a particularly serious patch, but is very relevant to our
  current discussion at GitTogether '08.
 .gitignore    |    1 +
 Makefile      |    1 +
 git-staged.sh |    8 ++++++++
 3 files changed, 10 insertions(+), 0 deletions(-)
 create mode 100755 git-staged.sh
Show changes to 3 files +10 −0

.gitignore, Makefile, git-staged.sh

diff --git a/.gitignore b/.gitignore
index bbaf9de..9353d19 100644
--- a/.gitignore
+++ b/.gitignore
@@ -118,6 +118,7 @@ git-show
 git-show-branch
 git-show-index
 git-show-ref
+git-staged
 git-stash
 git-status
 git-stripspace
diff --git a/Makefile b/Makefile
index d6f3695..1b23e53 100644
--- a/Makefile
+++ b/Makefile
@@ -262,6 +262,7 @@ SCRIPT_SH += git-rebase.sh
 SCRIPT_SH += git-repack.sh
 SCRIPT_SH += git-request-pull.sh
 SCRIPT_SH += git-sh-setup.sh
+SCRIPT_SH += git-staged.sh
 SCRIPT_SH += git-stash.sh
 SCRIPT_SH += git-submodule.sh
 SCRIPT_SH += git-web--browse.sh
diff --git a/git-staged.sh b/git-staged.sh
new file mode 100755
index 0000000..bfd36e7
--- /dev/null
+++ b/git-staged.sh
@@ -0,0 +1,8 @@
+#!/bin/sh
+
+USAGE=''
+SUBDIRECTORY_OK='Yes'
+OPTIONS_SPEC=
+. git-sh-setup
+
+git diff --cached
-- 
1.6.0
Jeff King· Oct 28, 2008, 23:46 UTC · re: David Symonds · lore

Re: [PATCH] Implement git-staged, an alias for 'git diff --cached'.

On Tue, Oct 28, 2008 at 04:39:05PM -0700, David Symonds wrote:
Show 11 quoted lines
> --- /dev/null
> +++ b/git-staged.sh
> @@ -0,0 +1,8 @@
> +#!/bin/sh
> +
> +USAGE=''
> +SUBDIRECTORY_OK='Yes'
> +OPTIONS_SPEC=
> +. git-sh-setup
> +
> +git diff --cached
Do you even need to do sh-setup? How about
  #!/bin/sh
  exec git diff --cached "$@"
-Peff
David Symonds· Oct 28, 2008, 23:59 UTC · re: David Symonds · lore
Signed-off-by: David Symonds <dsymonds@gmail.com>
---
 .gitignore    |    1 +
 Makefile      |    1 +
 git-staged.sh |    2 ++
 3 files changed, 4 insertions(+), 0 deletions(-)
 create mode 100755 git-staged.sh
Show changes to 3 files +4 −0

.gitignore, Makefile, git-staged.sh

diff --git a/.gitignore b/.gitignore
index bbaf9de..9353d19 100644
--- a/.gitignore
+++ b/.gitignore
@@ -118,6 +118,7 @@ git-show
 git-show-branch
 git-show-index
 git-show-ref
+git-staged
 git-stash
 git-status
 git-stripspace
diff --git a/Makefile b/Makefile
index d6f3695..1b23e53 100644
--- a/Makefile
+++ b/Makefile
@@ -262,6 +262,7 @@ SCRIPT_SH += git-rebase.sh
 SCRIPT_SH += git-repack.sh
 SCRIPT_SH += git-request-pull.sh
 SCRIPT_SH += git-sh-setup.sh
+SCRIPT_SH += git-staged.sh
 SCRIPT_SH += git-stash.sh
 SCRIPT_SH += git-submodule.sh
 SCRIPT_SH += git-web--browse.sh
diff --git a/git-staged.sh b/git-staged.sh
new file mode 100755
index 0000000..85582ec
--- /dev/null
+++ b/git-staged.sh
@@ -0,0 +1,2 @@
+#!/bin/sh
+exec git diff --cached $*
-- 
1.6.0
Jeff King· Oct 29, 2008, 00:39 UTC · re: David Symonds · lore

Re: [PATCH] Implement git-staged, an alias for 'git diff --cached'.

On Tue, Oct 28, 2008 at 04:59:28PM -0700, David Symonds wrote:
Show 5 quoted lines
> --- /dev/null
> +++ b/git-staged.sh
> @@ -0,0 +1,2 @@
> +#!/bin/sh
> +exec git diff --cached $*
This is broken for arguments with spaces. Use "$@" instead.

But I think this isn't a serious patch anyway, so we are probably wasting too much time on it. ;P

-Peff
David Symonds· Oct 29, 2008, 00:44 UTC · re: Jeff King · lore
Signed-off-by: David Symonds <dsymonds@gmail.com>
---
 .gitignore    |    1 +
 Makefile      |    1 +
 git-staged.sh |    2 ++
 3 files changed, 4 insertions(+), 0 deletions(-)
 create mode 100755 git-staged.sh
Show changes to 3 files +4 −0

.gitignore, Makefile, git-staged.sh

diff --git a/.gitignore b/.gitignore
index bbaf9de..9353d19 100644
--- a/.gitignore
+++ b/.gitignore
@@ -118,6 +118,7 @@ git-show
 git-show-branch
 git-show-index
 git-show-ref
+git-staged
 git-stash
 git-status
 git-stripspace
diff --git a/Makefile b/Makefile
index d6f3695..1b23e53 100644
--- a/Makefile
+++ b/Makefile
@@ -262,6 +262,7 @@ SCRIPT_SH += git-rebase.sh
 SCRIPT_SH += git-repack.sh
 SCRIPT_SH += git-request-pull.sh
 SCRIPT_SH += git-sh-setup.sh
+SCRIPT_SH += git-staged.sh
 SCRIPT_SH += git-stash.sh
 SCRIPT_SH += git-submodule.sh
 SCRIPT_SH += git-web--browse.sh
diff --git a/git-staged.sh b/git-staged.sh
new file mode 100755
index 0000000..66a5e33
--- /dev/null
+++ b/git-staged.sh
@@ -0,0 +1,2 @@
+#!/bin/sh
+exec git diff --cached "$@"
-- 
1.6.0
Johannes Schindelin· Oct 29, 2008, 01:02 UTC · re: David Symonds · lore

Re: [PATCH] Implement git-staged, an alias for 'git diff --cached'.

Hi,
On Tue, 28 Oct 2008, David Symonds wrote:
Show 9 quoted lines
> diff --git a/.gitignore b/.gitignore
> index bbaf9de..9353d19 100644
> --- a/.gitignore
> +++ b/.gitignore
> @@ -118,6 +118,7 @@ git-show
>  git-show-branch
>  git-show-index
>  git-show-ref
> +git-staged

Would it not be better to teach "git show --staged" to do that, and to add a command pair "git stage <file>" and "git unstage <file>" to do the obvious?

Ciao, Dscho

Jeff King· Oct 29, 2008, 00:58 UTC · re: Johannes Schindelin · lore

Re: [PATCH] Implement git-staged, an alias for 'git diff --cached'.

On Wed, Oct 29, 2008 at 02:02:29AM +0100, Johannes Schindelin wrote:
Show 5 quoted lines
> > +git-staged
> 
> Would it not be better to teach "git show --staged" to do that, and to add 
> a command pair "git stage <file>" and "git unstage <file>" to do the 
> obvious?

Yes, I think half of the discussion went on IRC. But I don't think "git staged" is a good idea. I think a "--staged" alias for "--cached" in "git diff" makes a lot more sense.

-Peff
Wincent Colaiuta· Oct 29, 2008, 10:59 UTC · re: David Symonds · lore

Re: [PATCH] Implement git-staged, an alias for 'git diff --cached'.

El 29/10/2008, a las 1:44, David Symonds escribió:
> +SCRIPT_SH += git-staged.sh
Isn't this exactly what aliases are for?
   git config --global alias.staged "diff --cached"
(Rather than adding yet another command...)
Wincent
Johannes Schindelin· Oct 29, 2008, 15:08 UTC · re: Wincent Colaiuta · lore

Re: [PATCH] Implement git-staged, an alias for 'git diff --cached'.

Hi,
On Wed, 29 Oct 2008, Wincent Colaiuta wrote:
Show 7 quoted lines
> El 29/10/2008, a las 1:44, David Symonds escribió:
> 
> > +SCRIPT_SH += git-staged.sh
> 
> Isn't this exactly what aliases are for?
>   git config --global alias.staged "diff --cached"
> (Rather than adding yet another command...)

The difference being, of course, that we do not ship default aliases (and neither do we plan to...).

So saying "this is what aliases are for" you ask for _newbies_ to add it for themselves. We are talking the same newbies who should be helped by that command, and typically do not know that there are Git aliases yet.

Even worse, just sum the times it takes everybody to make that alias, and then compare with the time it would take to include something like David posted in git.git. It should be obvious that the time balance is absolutely horrible.

Ciao, Dscho

Stephan Beyer· Oct 29, 2008, 15:22 UTC · re: Johannes Schindelin · lore

Re: [PATCH] Implement git-staged, an alias for 'git diff --cached'.

Hi,
Johannes Schindelin wrote:
> So saying "this is what aliases are for" you ask for _newbies_ to add it 
> for themselves.  We are talking the same newbies who should be helped by 
> that command, and typically do not know that there are Git aliases yet.
I'm not sure if yet more commands really help newbies.

I *see* the problem that talking about the index, the cache and the staging area can be difficult to newbies. But then I'd rather vote for "git diff --staged" (instead of --cached) or "git show --staged" (both make sense in some way). Perhaps it is even sufficient to add a help text to "git status", like this:

 # Changes to be committed:
 #   (use "git reset HEAD <file>..." to unstage)
+#   (use "git diff --cached" to see a diff of staged files)

For me, a "git staged" feels wrong without a "git stage" (alias for "git add") and "git unstage <file>" (alias for "git reset <file>"). And I think the list of examples can easily be continued.

Regards,
  Stephan
-- 
Stephan Beyer <s-beyer@gmx.net>, PGP 0x6EDDD207FCC5040F
Johannes Schindelin· Oct 29, 2008, 15:48 UTC · re: Stephan Beyer · lore

Re: [PATCH] Implement git-staged, an alias for 'git diff --cached'.

Hi,
On Wed, 29 Oct 2008, Stephan Beyer wrote:
> For me, a "git staged" feels wrong without a "git stage" (alias for "git 
> add") and "git unstage <file>" (alias for "git reset <file>"). And I 
> think the list of examples can easily be continued.
http://article.gmane.org/gmane.comp.version-control.git/99340

Thanks, Dscho

Wincent Colaiuta· Oct 29, 2008, 16:16 UTC · re: Johannes Schindelin · lore

Re: [PATCH] Implement git-staged, an alias for 'git diff --cached'.

El 29/10/2008, a las 16:08, Johannes Schindelin escribió:
Show 29 quoted lines
> Hi,
>
> On Wed, 29 Oct 2008, Wincent Colaiuta wrote:
>
>> El 29/10/2008, a las 1:44, David Symonds escribió:
>>
>>> +SCRIPT_SH += git-staged.sh
>>
>> Isn't this exactly what aliases are for?
>>  git config --global alias.staged "diff --cached"
>> (Rather than adding yet another command...)
>
> The difference being, of course, that we do not ship default aliases  
> (and
> neither do we plan to...).
>
> So saying "this is what aliases are for" you ask for _newbies_ to  
> add it
> for themselves.  We are talking the same newbies who should be  
> helped by
> that command, and typically do not know that there are Git aliases  
> yet.
>
> Even worse, just sum the times it takes everybody to make that  
> alias, and
> then compare with the time it would take to include something like  
> David
> posted in git.git.  It should be obvious that the time balance is
> absolutely horrible.

Git already has too many commands. Adding more is not going to clear up newbie confusion, and will only waste time because people will complain about it and ask why there is this kind of duplication.

W
Johannes Schindelin· Oct 29, 2008, 17:03 UTC · re: Wincent Colaiuta · lore

Re: [PATCH] Implement git-staged, an alias for 'git diff --cached'.

Hi,
On Wed, 29 Oct 2008, Wincent Colaiuta wrote:
> Git already has too many commands. Adding more is not going to clear up 
> newbie confusion, and will only waste time because people will complain 
> about it and ask why there is this kind of duplication.

I completely disagree. If the existing set of commands causes confusion, we need to deprecate those parts and add new commands. Even if we have a ton of commands already.

It does not need to hurt, either. Just think of init-db. Ever heard of it? We still have it, yet it is not relevant.

Ciao, Dscho

Pascal Obry· Oct 29, 2008, 17:13 UTC · re: Johannes Schindelin · lore

Re: [PATCH] Implement git-staged, an alias for 'git diff --cached'.

Johannes Schindelin a écrit :
Show 6 quoted lines
> I completely disagree.  If the existing set of commands causes confusion, 
> we need to deprecate those parts and add new commands.  Even if we have a 
> ton of commands already.
> 
> It does not need to hurt, either.  Just think of init-db.  Ever heard of 
> it?  We still have it, yet it is not relevant.

In this specific case adding a new command as an alias for a command+option seems wrong! I much prefer adding the alias --staged for --cached - as proposed now - if it can make things easier for new comers.

Pascal.
-- 
--|------------------------------------------------------
--| Pascal Obry                           Team-Ada Member
--| 45, rue Gabriel Peri - 78114 Magny Les Hameaux FRANCE
--|------------------------------------------------------
--|              http://www.obry.net
--| "The best way to travel is by means of imagination"
--|
--| gpg --keyserver wwwkeys.pgp.net --recv-key C1082595
Wincent Colaiuta· Oct 29, 2008, 17:42 UTC · re: Johannes Schindelin · lore

Re: [PATCH] Implement git-staged, an alias for 'git diff --cached'.

El 29/10/2008, a las 18:03, Johannes Schindelin escribió:
Show 15 quoted lines
> Hi,
>
> On Wed, 29 Oct 2008, Wincent Colaiuta wrote:
>
>> Git already has too many commands. Adding more is not going to  
>> clear up
>> newbie confusion, and will only waste time because people will  
>> complain
>> about it and ask why there is this kind of duplication.
>
> I completely disagree.  If the existing set of commands causes  
> confusion,
> we need to deprecate those parts and add new commands.  Even if we  
> have a
> ton of commands already.

The confusion isn't at the command level; it's at the switch/option level. The solution isn't to add a new command.

> It does not need to hurt, either.  Just think of init-db.  Ever  
> heard of
> it?  We still have it, yet it is not relevant.

The comparison isn't really valid. init-db is effectively invisible, but you're talking about adding a new "in your face" porcelain command.

W
Teemu Likonen· Oct 29, 2008, 18:30 UTC · re: Wincent Colaiuta · lore

Re: [PATCH] Implement git-staged, an alias for 'git diff --cached'.

Wincent Colaiuta (2008-10-29 18:42 +0100) wrote:
Show 7 quoted lines
> El 29/10/2008, a las 18:03, Johannes Schindelin escribió:
>> I completely disagree. If the existing set of commands causes
>> confusion, we need to deprecate those parts and add new commands.
>> Even if we have a ton of commands already.
>
> The confusion isn't at the command level; it's at the switch/option
> level. The solution isn't to add a new command.

I don't remember being confused in particular area but I think it's a _very_ good thing that the following three are behind the same "diff" command:

    git diff
    git diff --cached       (or --staged)
    git diff HEAD
It's also good idea to pretty much always teach those three together.
David Kågedal· Oct 29, 2008, 20:24 UTC · re: Teemu Likonen · lore

Re: [PATCH] Implement git-staged, an alias for 'git diff --cached'.

Teemu Likonen <tlikonen@iki.fi> writes:
Show 17 quoted lines
> Wincent Colaiuta (2008-10-29 18:42 +0100) wrote:
>
>> El 29/10/2008, a las 18:03, Johannes Schindelin escribió:
>>> I completely disagree. If the existing set of commands causes
>>> confusion, we need to deprecate those parts and add new commands.
>>> Even if we have a ton of commands already.
>>
>> The confusion isn't at the command level; it's at the switch/option
>> level. The solution isn't to add a new command.
>
> I don't remember being confused in particular area but I think it's a
> _very_ good thing that the following three are behind the same "diff"
> command:
>
>     git diff
>     git diff --cached       (or --staged)
>     git diff HEAD

One irregularity hear is that there is no way to explicitly say what you want to compare against the index (the staging area). Diff compares two things to each other, and a more regular and general way to express what it does would be something like

    git diff STAGE WORKTREE   (like "git diff" today)
    git diff HEAD WORKTREE    (like "git diff HEAD" today)
    git diff WORKTREE HEAD    (like "git diff -R HEAD" today)
    git diff HEAD STAGE       (like "git diff --cached" today)
    git diff commit STAGE     (like "git diff --cached commit" today)

To me, it isn't obvious that --cached changes the thing you *compare* rather than the thing you compare *against*. I think it would be useful to have a way of explicitly stating what you compare, something like what I wrote above, and then having useful shortcuts for common cases (like that no arguments compares the work tree against the stage).

-- 
David Kågedal
Johannes Schindelin· Oct 29, 2008, 19:23 UTC · re: Wincent Colaiuta · lore

Re: [PATCH] Implement git-staged, an alias for 'git diff --cached'.

Hi,
On Wed, 29 Oct 2008, Wincent Colaiuta wrote:
Show 14 quoted lines
> El 29/10/2008, a las 18:03, Johannes Schindelin escribió:
> 
> >On Wed, 29 Oct 2008, Wincent Colaiuta wrote:
> >
> > >Git already has too many commands. Adding more is not going to clear 
> > >up newbie confusion, and will only waste time because people will 
> > >complain about it and ask why there is this kind of duplication.
> >
> >I completely disagree.  If the existing set of commands causes 
> >confusion, we need to deprecate those parts and add new commands.  
> >Even if we have a ton of commands already.
> 
> The confusion isn't at the command level; it's at the switch/option 
> level. The solution isn't to add a new command.

Seems that at leat one guy who does Git training disagrees with you, _in addition_ to me.

Ciao, Dscho

Wincent Colaiuta· Oct 29, 2008, 19:44 UTC · re: Johannes Schindelin · lore

Re: [PATCH] Implement git-staged, an alias for 'git diff --cached'.

El 29/10/2008, a las 20:23, Johannes Schindelin escribió:
Show 23 quoted lines
> Hi,
>
> On Wed, 29 Oct 2008, Wincent Colaiuta wrote:
>
>> El 29/10/2008, a las 18:03, Johannes Schindelin escribió:
>>
>>> On Wed, 29 Oct 2008, Wincent Colaiuta wrote:
>>>
>>>> Git already has too many commands. Adding more is not going to  
>>>> clear
>>>> up newbie confusion, and will only waste time because people will
>>>> complain about it and ask why there is this kind of duplication.
>>>
>>> I completely disagree.  If the existing set of commands causes
>>> confusion, we need to deprecate those parts and add new commands.
>>> Even if we have a ton of commands already.
>>
>> The confusion isn't at the command level; it's at the switch/option
>> level. The solution isn't to add a new command.
>
> Seems that at leat one guy who does Git training disagrees with you,  
> _in
> addition_ to me.

That's what I call a "zero value" addition to the thread, seeing as anyone reading the thread _already_ knows the opinions of the participants who've posted.

Adding a separate command to an already overwhelming command set in order to address confusion about options to "git diff" is a case of "duct-tape UI design".

Wincent
Stephan Beyer· Oct 29, 2008, 01:01 UTC · re: Jeff King · lore

Re: [PATCH] Implement git-staged, an alias for 'git diff --cached'.

Hi,
Show 10 quoted lines
> > --- /dev/null
> > +++ b/git-staged.sh
> > @@ -0,0 +1,2 @@
> > +#!/bin/sh
> > +exec git diff --cached $*
> 
> This is broken for arguments with spaces. Use "$@" instead.
> 
> But I think this isn't a serious patch anyway, so we are probably
> wasting too much time on it. ;P
I'm still not understanding, what it's for.
Usability? Because doing
	git config --global alias.staged 'diff --cached'
is lame?
Regards,
  Stephan
PS: Btw, if ever meant serious, it's missing an insertion into
    command-list.txt and serious documentation.
    But I think you know that. :-)
-- 
Stephan Beyer <s-beyer@gmx.net>, PGP 0x6EDDD207FCC5040F
Jeff King· Oct 29, 2008, 01:05 UTC · re: Stephan Beyer · lore

Re: [PATCH] Implement git-staged, an alias for 'git diff --cached'.

On Wed, Oct 29, 2008 at 02:01:07AM +0100, Stephan Beyer wrote:
> I'm still not understanding, what it's for.
> Usability? Because doing
> 	git config --global alias.staged 'diff --cached'
> is lame?

You are missing some of the context, which is that we just had a big in-person debate about how the staged nomenclature is confusing. We call things "cached", "staged", and "index", depending on the command.

So this is an attempt to rectify that.
-Peff
Brandon Casey· Oct 29, 2008, 14:33 UTC · re: Jeff King · lore

Re: [PATCH] Implement git-staged, an alias for 'git diff --cached'.

Jeff King wrote:
Show 8 quoted lines
> On Wed, Oct 29, 2008 at 02:01:07AM +0100, Stephan Beyer wrote:
> 
>> I'm still not understanding, what it's for.
>> Usability? Because doing
>> 	git config --global alias.staged 'diff --cached'
>> is lame?
> 
> You are missing some of the context,

Yeah, it would have been nice if there was audio. Anyone take minutes, possibly?

btw the term "staged" makes perfect sense to me, whereas "cached" was not intuitively obvious to me.

-brandon
Jeff King· Oct 29, 2008, 15:19 UTC · re: Brandon Casey · lore

Re: [PATCH] Implement git-staged, an alias for 'git diff --cached'.

On Wed, Oct 29, 2008 at 09:33:08AM -0500, Brandon Casey wrote:
> > You are missing some of the context,
> 
> Yeah, it would have been nice if there was audio.
> Anyone take minutes, possibly?

There's no audio. Some of the slides will be available. I took notes on at least one of the discussions, which I will try to summarize and post. And I think some of the discussion will end up as patches, which will hopefully provide full justification in their commit messages. ;)

-Peff
Pascal Obry· Oct 29, 2008, 14:58 UTC · re: David Symonds · lore

Re: [PATCH] Implement git-staged, an alias for 'git diff --cached'.

What about :
   $ git config --global alias.staged "diff --cached"
I'm using this since some time.
-- 
--|------------------------------------------------------
--| Pascal Obry                           Team-Ada Member
--| 45, rue Gabriel Peri - 78114 Magny Les Hameaux FRANCE
--|------------------------------------------------------
--|              http://www.obry.net
--| "The best way to travel is by means of imagination"
--|
--| gpg --keyserver wwwkeys.pgp.net --recv-key C1082595
Felipe Contreras· Oct 29, 2008, 19:49 UTC · re: David Symonds · lore

Re: [PATCH] Implement git-staged, an alias for 'git diff --cached'.

On Wed, Oct 29, 2008 at 1:39 AM, David Symonds <dsymonds@gmail.com> wrote:
> Signed-off-by: David Symonds <dsymonds@gmail.com>
> ---
>  This isn't a particularly serious patch, but is very relevant to our
>  current discussion at GitTogether '08.

I've thought about some commands like: git stage $file (git add $file) git unstage $file (git reset $file)

Perhaps git stage add git stage rm

And then your proposal would fit with: git stage diff

Or something like that.
-- 
Felipe Contreras

← back to recent threads