From: Johannes Schindelin <johannes.schindelin@xxxxxx> This fixes a segmentation fault. The bug is caused by dereferencing `new_branch_info->commit` when it is `NULL`, which is the case when the tree-ish argument is actually a tree, not a commit-ish. This was introduced in 5602b500c3c (builtin/checkout: fix `git checkout -p HEAD...` bug, 2020-10-07), where we tried to ensure that the special tree-ish `HEAD...` is handled correctly. Signed-off-by: Johannes Schindelin <johannes.schindelin@xxxxxx> --- checkout -p: handle tree arguments correctly again I literally just ran into this segmentation fault after rebasing Git for Windows onto -rc1, and did not really think that the regression was introduced in the v2.30.0 cycle, but was proven wrong by my investigation: it was introduced by v2.30.0-rc0151^23. Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-819%2Fdscho%2Fcheckout-p-empty-tree-v1 Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-819/dscho/checkout-p-empty-tree-v1 Pull-Request: https://github.com/gitgitgadget/git/pull/819 builtin/checkout.c | 2 +- t/t2016-checkout-patch.sh | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/builtin/checkout.c b/builtin/checkout.c index 9b82119129a..8b567b0424d 100644 --- a/builtin/checkout.c +++ b/builtin/checkout.c @@ -482,7 +482,7 @@ static int checkout_paths(const struct checkout_opts *opts, * properly. However, there is special logic for the HEAD case * so we mustn't replace that. */ - if (rev && strcmp(rev, "HEAD")) + if (rev && new_branch_info->commit && strcmp(rev, "HEAD")) rev = oid_to_hex_r(rev_oid, &new_branch_info->commit->object.oid); if (opts->checkout_index && opts->checkout_worktree) diff --git a/t/t2016-checkout-patch.sh b/t/t2016-checkout-patch.sh index d91a329eb31..abfd586c32b 100755 --- a/t/t2016-checkout-patch.sh +++ b/t/t2016-checkout-patch.sh @@ -123,4 +123,9 @@ test_expect_success PERL 'none of this moved HEAD' ' verify_saved_head ' +test_expect_success PERL 'empty tree can be handled' ' + test_when_finished "git reset --hard" && + git checkout -p $(test_oid empty_tree) -- +' + test_done base-commit: 6d3ef5b467eccd2769f1aa1c555d317d3c8dc707 -- gitgitgadget