git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [RFC/PATCH] commit/status: show the index-worktree with -v -v

From
Michael J Gruber <git@drmicha.warpmail.net>
Date
Jan 16, 2015, 08:13 UTC
Message-ID
<54B8C82E.8000707@drmicha.warpmail.net>
In-Reply-To
<xmqq1tmv7qjg.fsf@gitster.dls.corp.google.com>
Junio C Hamano schrieb am 15.01.2015 um 21:11:
Show 88 quoted lines
> Michael J Gruber <git@drmicha.warpmail.net> writes:
> 
>> git commit and git status in long format show the diff between HEAD
>> and the index when given -v. This allows previewing a commit to be made.
>>
>> They also list tracked files with unstaged changes, but without a diff.
>>
>> Introduce '-v -v' which shows the diff between the index and the
>> worktree in addition to HEAD index diff. This allows to review unstaged
>> changes which might be missing from the commit.
>>
>> Signed-off-by: Michael J Gruber <git@drmicha.warpmail.net>
>> ---
>> Also, the git status man page does not mention -v at all, and the doc
>> for git status (long format) and the status parts of the git commit
>> man page should really be the same.
>>
>> In any case, this may have helped the OP with his amend oversight.
> 
> Hmm, does this show what change relative to HEAD is committed fully
> and then after that show what change relative to the index being
> commited remains in the working tree at the end?  
> 
> I do not think that output order is very helpful.  Two diffs to the
> same file next to each other may make it easier to notice, though.
> That is, not like this:
> 
> 	diff --git a/A b/A
>         ...
>         diff --git a/B b/B
>         ...
>         diff --git i/A w/A
>         ...
> 
> but like this:
> 
> 	diff --git a/A b/A
>         ...
>         diff --git i/A w/A
>         ...
>         diff --git a/B b/B
>         ...
> 
> or it may want to even be like this:
> 
> 	diff --git a/A b/A
>         ...
>         diff --git to-be-committed/A left-out-of-the-commit/A
>         ...
>         diff --git a/B b/B
>         ...
> 
> by using a custom, unusual and easy-to-notice prefixes.
> 
>>  Documentation/git-commit.txt | 4 ++++
>>  wt-status.c                  | 8 ++++++++
>>  2 files changed, 12 insertions(+)
>>
>> diff --git a/Documentation/git-commit.txt b/Documentation/git-commit.txt
>> index 1e74b75..f14d2ec 100644
>> --- a/Documentation/git-commit.txt
>> +++ b/Documentation/git-commit.txt
>> @@ -284,6 +284,10 @@ configuration variable documented in linkgit:git-config[1].
>>  	would be committed at the bottom of the commit message
>>  	template.  Note that this diff output doesn't have its
>>  	lines prefixed with '#'.
>> ++
>> +If specified twice, show in addition the unified diff between
>> +what would be committed and the worktree files, i.e. the unstaged
>> +changes to tracked files.
>>  
>>  -q::
>>  --quiet::
>> diff --git a/wt-status.c b/wt-status.c
>> index b54eac5..75674c2 100644
>> --- a/wt-status.c
>> +++ b/wt-status.c
>> @@ -874,6 +874,14 @@ static void wt_status_print_verbose(struct wt_status *s)
>>  		wt_status_add_cut_line(s->fp);
>>  	}
>>  	run_diff_index(&rev, 1);
>> +	if (s->verbose > 1) {
>> +		setup_work_tree();
>> +		if (read_cache_preload(&rev.diffopt.pathspec) < 0)
>> +			perror("read_cache_preload");
> 
> Hmm, as we have run diff-index already, we must have had the index
> loaded, no?  What is going on here?

It was late and simply calling run_diff_files() didn't work (because of the missing setup_work_tree()), so I added the lines from our diff.c and overlooked that read_cache_preload() must have happened somewhere already.

Show 8 quoted lines
>> +		rev.diffopt.a_prefix = 0; /* allow run_diff_files */
>> +		rev.diffopt.b_prefix = 0; /* to reset the prefixes */
> 
> This is not just "allow to reset the prefixes", but forces the use
> of mnemonic prefixes to make sure they look different from the
> normal "diff --cached" output that shows what is going to be
> committed.  If we were to do this, for consistency, we may want to
> use the mnemonic prefix for the "to be commited" part, no?
I guess here I got blinded by me default config which does that.
Show 6 quoted lines
> 
>> +		run_diff_files(&rev, 0);
>> +	}
>>  }
>>  
>>  static void wt_status_print_tracking(struct wt_status *s)

I really like your suggestion to use more verbose prefixes here for both cases. I guess we can do without additional subheadings for the diffs then.

As for the helpfulness, the intention was to show the diff for the two categories of changes which "git status" lists without diff already:

- changes to be committed (+index -HEAD) aka "git diff --cached"
- changes present in worktree not to be committed (+worktree -index) aka
"git diff"

The paths which would appear in the diff "+worktree -HEAD" are not mentioned in "git status" per se (as a category with subheading), although they fall into at least 1 of the 2 categories, of course.

Michael
Previous: Junio C HamanoNext: Michael J Gruber
Message 13 of 30 in “How to prevent empty git commit --amend”
  1. Ivo AnjoJan 13, 2015
  2. Daniel Knittl-FrankJan 13, 2015
  3. Ivo AnjoJan 13, 2015
  4. Michael J GruberJan 13, 2015
  5. Matthieu MoyJan 14, 2015
  6. Ivo AnjoJan 14, 2015
  7. Matthieu MoyJan 14, 2015
  8. Junio C HamanoJan 14, 2015
  9. Junio C HamanoJan 14, 2015
  10. commit/status: show the index-worktree with -v -vMichael J Gruber, Jan 15, 2015
  11. Junio C HamanoJan 15, 2015
  12. Junio C HamanoJan 15, 2015
  13. Michael J GruberJan 16, 2015
  14. 0/2 More diffs for commit/statusMichael J Gruber, Mar 3, 2015
  15. 1/2 t7508: test git status -vMichael J Gruber, Mar 3, 2015
  16. Junio C HamanoMar 3, 2015
  17. Junio C HamanoMar 3, 2015
  18. Michael J GruberMar 4, 2015
  19. Junio C HamanoMar 4, 2015
  20. 2/2 commit/status: show the index-worktree diff with -v -vMichael J Gruber, Mar 3, 2015
  21. Junio C HamanoMar 3, 2015
  22. Michael J GruberMar 4, 2015
  23. Junio C HamanoMar 4, 2015
  24. 0/3 More diffs for commit/statusMichael J Gruber, Mar 5, 2015
  25. Junio C HamanoMar 5, 2015
  26. Junio C HamanoMar 5, 2015
  27. Junio C HamanoMar 5, 2015
  28. 1/3 t7508: .gitignore 'expect' and 'output' filesMichael J Gruber, Mar 5, 2015
  29. 2/3 t7508: test git status -vMichael J Gruber, Mar 5, 2015
  30. 3/3 commit/status: show the index-worktree diff with -v -vMichael J Gruber, Mar 5, 2015

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.