This allows passing a tree-ish git reset -p without specifying a pathspec. Requiring a commit in this situation appears to be an oversight, and support for a tree-ish is documented by git-reset's manpage. ( https://github.com/git/git/blob/d9f6f3b6195a0ca35642561e530798ad1469bd41/Documentation/git-reset.txt#L12 ) An alternative implementation of this change would move the if (patch_mode) { ... return; } check before the rev parsing logic, offloading validation of the rev argument when in patch mode to the git-add--interactive logic. This would be possible as the parsed oid is not passed to git-add--interactive. ( https://github.com/git/git/blob/d9f6f3b6195a0ca35642561e530798ad1469bd41/builtin/reset.c#L341-L346 ) Nika Layzell (1): reset: parse rev as tree-ish in patch mode builtin/reset.c | 2 +- t/t7105-reset-patch.sh | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) base-commit: 5fa0f5238b0cd46cfe7f6fa76c3f526ea98148d9 Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-474%2Fmystor%2Freset-interactive-treeish-v2 Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-474/mystor/reset-interactive-treeish-v2 Pull-Request: https://github.com/gitgitgadget/git/pull/474 Range-diff vs v1: 1: 338c2777f7 ! 1: a608dc8368 reset: parse rev as tree-ish in patch mode @@ -2,12 +2,22 @@ reset: parse rev as tree-ish in patch mode - Relaxes the commit requirement for the rev argument when running - git-reset in patch mode without pathspec. + Since 2f328c3d ("reset $sha1 $pathspec: require $sha1 only to be + treeish", 2013-01-14), we allowed "git reset $object -- $path" to reset + individual paths that match the pathspec to take the blob from a tree + object, not necessarily a commit, while the form to reset the tip of the + current branch to some other commit still must be given a commit. - The revision argument to git-reset is parsed as either a commit or - tree-ish depending on mode. Previously, if no pathspec was provided, - the rev argument was parsed as a commit unconditionally. + Like resetting with paths, "git reset --patch" does not update HEAD, and + need not require a commit. The path-filtered form, "git reset --patch + $object -- $pathspec", has accepted a tree-ish since 2f328c3d. + + "git reset --patch" is documented as accepting a <tree-ish> since + bf44142f ("reset: update documentation to require only tree-ish with + paths", 2013-01-16). Documentation changes are not required. + + Loosen the restriction that requires a commit for the unfiltered "git + reset --patch $object". Signed-off-by: Nika Layzell <nika@xxxxxxxxxxxxxxx> @@ -37,6 +47,20 @@ + verify_saved_state bar && + test_i18ngrep "Apply" output +' ++ ++test_expect_success PERL 'git reset -p HEAD^:dir/foo (blob fails)' ' ++ set_and_save_state dir/foo work work && ++ test_must_fail git reset -p HEAD^:dir/foo && ++ verify_saved_state dir/foo && ++ verify_saved_state bar ++' ++ ++test_expect_success PERL 'git reset -p aaaaaaaa (unknown fails)' ' ++ set_and_save_state dir/foo work work && ++ test_must_fail git reset -p aaaaaaaa && ++ verify_saved_state dir/foo && ++ verify_saved_state bar ++' + # The idea in the rest is that bar sorts first, so we always say 'y' # first and if the path limiter fails it'll apply to bar instead of -- gitgitgadget