diff options
author | Junio C Hamano <gitster@pobox.com> | 2020-10-27 15:09:50 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2020-10-27 15:09:51 -0700 |
commit | f3cfeb3078ce4af0ac764515795f7e0849a88931 (patch) | |
tree | 2c50c6975c647cfe709b5051a14145a93ae9726d /builtin/checkout.c | |
parent | Merge branch 'sb/clone-origin' (diff) | |
parent | t2016: add a NEEDSWORK about the PERL prerequisite (diff) | |
download | tgif-f3cfeb3078ce4af0ac764515795f7e0849a88931.tar.xz |
Merge branch 'dl/checkout-p-merge-base'
"git checkout -p A...B [-- <path>]" did not work, even though the
same command without "-p" correctly used the merge-base between
commits A and B.
* dl/checkout-p-merge-base:
t2016: add a NEEDSWORK about the PERL prerequisite
add-patch: add NEEDSWORK about comparing commits
Doc: document "A...B" form for <tree-ish> in checkout and switch
builtin/checkout: fix `git checkout -p HEAD...` bug
Diffstat (limited to 'builtin/checkout.c')
-rw-r--r-- | builtin/checkout.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/builtin/checkout.c b/builtin/checkout.c index 0951f8fee5..2e69ed24f2 100644 --- a/builtin/checkout.c +++ b/builtin/checkout.c @@ -471,6 +471,19 @@ static int checkout_paths(const struct checkout_opts *opts, if (opts->patch_mode) { const char *patch_mode; + const char *rev = new_branch_info->name; + char rev_oid[GIT_MAX_HEXSZ + 1]; + + /* + * Since rev can be in the form of `<a>...<b>` (which is not + * recognized by diff-index), we will always replace the name + * with the hex of the commit (whether it's in `...` form or + * not) for the run_add_interactive() machinery to work + * properly. However, there is special logic for the HEAD case + * so we mustn't replace that. + */ + if (rev && strcmp(rev, "HEAD")) + rev = oid_to_hex_r(rev_oid, &new_branch_info->commit->object.oid); if (opts->checkout_index && opts->checkout_worktree) patch_mode = "--patch=checkout"; @@ -481,7 +494,7 @@ static int checkout_paths(const struct checkout_opts *opts, else BUG("either flag must have been set, worktree=%d, index=%d", opts->checkout_worktree, opts->checkout_index); - return run_add_interactive(new_branch_info->name, patch_mode, &opts->pathspec); + return run_add_interactive(rev, patch_mode, &opts->pathspec); } repo_hold_locked_index(the_repository, &lock_file, LOCK_DIE_ON_ERROR); |