Re: [RFC/PATCH 0/2] New 'stage' command

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



David Kågedal <davidk@xxxxxxxxxxxxxx> writes:

> What do you mean? This was a suggestion for how git diff should
> work. I fail to see how you would need a WORKTREEANDTHEINDEX there.

You are talking only about "git diff".  I am talking about the whole git
suite, because you have to worry about how such a proposal would affect
other parts of the UI.

For example, what, if anything, should be done to "git grep --cached" and
"git apply --index"?  Leave them unchanged and only change "git diff"?

> I think this is a basic usability issue for a high-level porcelain
> command such as diff.

I do not think there is any usability issue.  Why do you think saying
STAGE in all capital makes it easier to _use_ instead of saying --cached
(or --index-only)?  In either way, you need to understand the underlying
concept, such as:

 - there are three distinct kinds of states: a committed state, the state
   in the index (aka "what you have staged so far to the index"), and the
   state in your work tree.

 - many commands understand that you want to operate on and/or inspect
   states in one or more of these states.  They default to what is often
   used (e.g. "git diff" compares the index and the work tree, "git grep"
   looks in the work tree, "git apply" patches the work tree [*1*]), but
   you can tell them to use different entities via options and arguments.

How does it help understanding any of the above to introduce STAGE?

The only difference I see is that you change "via options and arguments"
to "via arguments of different kinds, either a real commit object name or
some fake token that stands for the index or the work tree state".

Spelled out more explicitly, the current "options and arguments" works
this way:

   - when you want to work with a committed state (or more in general,
     with a tree-ish), you give the name of the commit;

   - when you want to work with the index, you say --cached;

   - when you want to work with both the index and the work tree at the
     same time, you say --index.

   - for all commands, working with work tree is the default, so there is
     no --work-tree option (we could add one, if you really want).

and the STAGE would work something like this:

   - when you want to work with a committed state (or more in general,
     with a tree-ish), you give the name of the commit;

   - when you want to work with the index, you say STAGE; not that you
     cannot have a ref called STAGE and if you have a file in the work
     tree whose name is STAGE you need to say "git command ... -- STAGE"
     to name the file, or "git command ... STAGE --" to clarify that you
     do not mean the file but you mean to use the fake toekn STAGE.

   - when you want to work with both the index and the work tree at the
     same time, you say STAGEANDWORKTREE (the same disambiguation caveat
     applies).

   - for all commands, working with work tree is the default, but you can
     still say WORKTREE (the same disambiguation caveat applies).

If anything, I think these capitalized fake tokens spread more confusion.

Sure, "git diff HEAD STAGED" and "git diff HEAD WORKTREE" may make the
command lines look as if what these fake tokens represent are "sort of"
commits, but that is only true while you are using a command that has
modes to work on the index and/or on the work tree.

These fake tokens do not work everywhere, and it is not an implementation
limit.  Fundamentally they cannot work everywhere.

Think.  What does "git log STAGE" mean?  Can you explain why it does not
make any sense?

The user needs to be aware that the index is NOT a commit to understand
why such a command line doesn't make sense _anyway_.

I think it is counterproductive for the learning curve of new people to
make these different concepts look as if they belong to the same family by
using STAGE (that look too similar to HEAD).  You seem to think it would
make it easier for them to learn if these different concepts are not
presented as different.  But they are different, and if new people start
with a false impression that these are "sort of" commits, they need to
unlearn that at some point, and that "some point" is not "advanced use".
Even bog standard "git log" exposes why hiding the conceptual differences
between these three states does not work.

Teach that different things are different, and express that in the UI.
That would avoid the confusion down the line.


[Footnote]

*1* "git apply" was originally done to replace use of "GNU patch" in
Linus's workflow because "patch" was deliberately too lenient, and as
such, it does not look at the index by default.  In a git repository, as
long as a patch does not contain creation of new files, this is a good
default, too.  You can "git apply incoming.patch && git diff -U20" to see
what the patch does in wider context, for example.  If "git apply --index"
were the default, the same can be done with "git diff -U20 HEAD" and it
won't risk forgetting new files.  But it is a huge backward incompatible
change that won't happen without deep thought.
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]