Git fork

Merge branch 'jk/branch-delete-detached'

Fix a bug where `git branch -d` did not work on an orphaned HEAD.

* jk/branch-delete-detached:
branch: gracefully handle '-d' on orphan HEAD

+39 -6
+3 -6
builtin/branch.c
··· 150 150 if (!reference_rev) 151 151 reference_rev = head_rev; 152 152 153 - merged = in_merge_bases(rev, reference_rev); 153 + merged = reference_rev ? in_merge_bases(rev, reference_rev) : 0; 154 154 155 155 /* 156 156 * After the safety valve is fully redefined to "check with ··· 160 160 * a gentle reminder is in order. 161 161 */ 162 162 if ((head_rev != reference_rev) && 163 - in_merge_bases(rev, head_rev) != merged) { 163 + (head_rev ? in_merge_bases(rev, head_rev) : 0) != merged) { 164 164 if (merged) 165 165 warning(_("deleting branch '%s' that has been merged to\n" 166 166 " '%s', but not yet merged to HEAD."), ··· 235 235 } 236 236 branch_name_pos = strcspn(fmt, "%"); 237 237 238 - if (!force) { 238 + if (!force) 239 239 head_rev = lookup_commit_reference(the_repository, &head_oid); 240 - if (!head_rev) 241 - die(_("Couldn't look up commit object for HEAD")); 242 - } 243 240 244 241 for (i = 0; i < argc; i++, strbuf_reset(&bname)) { 245 242 char *target = NULL;
+36
t/t3200-branch.sh
··· 279 279 test_cmp expect err 280 280 ' 281 281 282 + test_expect_success 'git branch -d on orphan HEAD (merged)' ' 283 + test_when_finished git checkout main && 284 + git checkout --orphan orphan && 285 + test_when_finished "rm -rf .git/objects/commit-graph*" && 286 + git commit-graph write --reachable && 287 + git branch --track to-delete main && 288 + git branch -d to-delete 289 + ' 290 + 291 + test_expect_success 'git branch -d on orphan HEAD (merged, graph)' ' 292 + test_when_finished git checkout main && 293 + git checkout --orphan orphan && 294 + git branch --track to-delete main && 295 + git branch -d to-delete 296 + ' 297 + 298 + test_expect_success 'git branch -d on orphan HEAD (unmerged)' ' 299 + test_when_finished git checkout main && 300 + git checkout --orphan orphan && 301 + test_when_finished "git branch -D to-delete" && 302 + git branch to-delete main && 303 + test_must_fail git branch -d to-delete 2>err && 304 + grep "not fully merged" err 305 + ' 306 + 307 + test_expect_success 'git branch -d on orphan HEAD (unmerged, graph)' ' 308 + test_when_finished git checkout main && 309 + git checkout --orphan orphan && 310 + test_when_finished "git branch -D to-delete" && 311 + git branch to-delete main && 312 + test_when_finished "rm -rf .git/objects/commit-graph*" && 313 + git commit-graph write --reachable && 314 + test_must_fail git branch -d to-delete 2>err && 315 + grep "not fully merged" err 316 + ' 317 + 282 318 test_expect_success 'git branch -v -d t should work' ' 283 319 git branch t && 284 320 git rev-parse --verify refs/heads/t &&