threads / bug / 54321

[BUG] git checkout -p HEAD...

Subject: [BUG] git checkout -p HEAD...

## tl;dr

2 messages between Sep 29, 2020 and Sep 29, 2020.

replies: 1people: 2as markdown or json

Denton Liu· Sep 29, 2020, 06:18 UTC · lore
Hi all,
git checkout -p <commit>... is broken:
	$ git checkout HEAD... -p
	usage: git diff-index [-m] [--cached] [<common-diff-options>] <tree-ish> [<path>...]
	common diff options:
	  -z            output diff-raw with lines terminated with NUL.
	  -p            output patch format.
	  -u            synonym for -p.
	  --patch-with-raw
			output both a patch and the diff-raw format.
	  --stat        show diffstat instead of patch.
	  --numstat     show numeric diffstat instead of patch.
	  --patch-with-stat
			output a patch and prepend its diffstat.
	  --name-only   show only names of changed files.
	  --name-status show names and status of changed files.
	  --full-index  show full object name on index lines.
	  --abbrev=<n>  abbreviate object names in diff-tree header and diff-raw.
	  -R            swap input file pairs.
	  -B            detect complete rewrites.
	  -M            detect renames.
	  -C            detect copies.
	  --find-copies-harder
			try unchanged files as candidate for copy detection.
	  -l<n>         limit rename attempts up to <n> paths.
	  -O<file>      reorder diffs according to the <file>.
	  -S<string>    find filepair whose only one side contains the string.
	  --pickaxe-all
			show all files diff when -S is used and hit is found.
	  -a  --text    treat all files as text.
	Cannot close git diff-index --cached --numstat --summary HEAD... -- () at /home/denton/.local/libexec/git-core/git-add--interactive line 183.

The issue is simple: `HEAD...` is passed literally to `git diff-index` which does not know how to handle it. The fix is simple: figure out the OID and pass that instead.

One thing I'm not quite sure about is that in the documentation, the restore-related checkout options accept <tree-ish> and it's an implementation detail that the `<commit>...` form happens to work in the non-patch case. In fact, `git restore --source=HEAD...` works too (unless -p is given as well).

So I lean on the side of fully supporting the `...` form for `git restore/checkout`. However, I understand if someone wishes to suggest "that was never valid to begin with; we should prohibit `...` from being used with restore-modes`.

Any opposition to fully supporting the `...` form?

Thanks, Denton

Junio C Hamano· Sep 29, 2020, 16:02 UTC · re: Denton Liu · lore

Re: [BUG] git checkout -p HEAD...

Denton Liu <liu.denton@gmail.com> writes:
Show 6 quoted lines
> So I lean on the side of fully supporting the `...` form for `git
> restore/checkout`. However, I understand if someone wishes to suggest
> "that was never valid to begin with; we should prohibit `...` from
> being used with restore-modes`.
>
> Any opposition to fully supporting the `...` form?

Not from me. The "-p" feature of various commands were bolted on as a mere afterthought and in a rather hacky way. I am not surprised if quality of their implementation differs from that of the primary codepaths. It did not help that they are implemented by diverting the control early to the "add--interactive" machinery from the primary control flow, and it may be a large, if not primary, source of differences in how command line options are handled by the "-p" codepath and the primary codepath in these commands.

Making "-p" behave more like the primary modes of operation in these commands would be a welcome move, I would think. I hope that it got much easier to access the "add--interactive" machinery from C these days; probably it is a good time to make that move.

Thanks.

← back to recent threads