Skip to content

Commit 26734da

Browse files
committed
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
2 parents 35a62bb + eb20e63 commit 26734da

File tree

2 files changed

+39
-6
lines changed

2 files changed

+39
-6
lines changed

builtin/branch.c

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ static int branch_merged(int kind, const char *name,
150150
if (!reference_rev)
151151
reference_rev = head_rev;
152152

153-
merged = in_merge_bases(rev, reference_rev);
153+
merged = reference_rev ? in_merge_bases(rev, reference_rev) : 0;
154154

155155
/*
156156
* After the safety valve is fully redefined to "check with
@@ -160,7 +160,7 @@ static int branch_merged(int kind, const char *name,
160160
* a gentle reminder is in order.
161161
*/
162162
if ((head_rev != reference_rev) &&
163-
in_merge_bases(rev, head_rev) != merged) {
163+
(head_rev ? in_merge_bases(rev, head_rev) : 0) != merged) {
164164
if (merged)
165165
warning(_("deleting branch '%s' that has been merged to\n"
166166
" '%s', but not yet merged to HEAD."),
@@ -235,11 +235,8 @@ static int delete_branches(int argc, const char **argv, int force, int kinds,
235235
}
236236
branch_name_pos = strcspn(fmt, "%");
237237

238-
if (!force) {
238+
if (!force)
239239
head_rev = lookup_commit_reference(the_repository, &head_oid);
240-
if (!head_rev)
241-
die(_("Couldn't look up commit object for HEAD"));
242-
}
243240

244241
for (i = 0; i < argc; i++, strbuf_reset(&bname)) {
245242
char *target = NULL;

t/t3200-branch.sh

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,42 @@ test_expect_success 'git branch -M and -C fail on detached HEAD' '
279279
test_cmp expect err
280280
'
281281

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+
282318
test_expect_success 'git branch -v -d t should work' '
283319
git branch t &&
284320
git rev-parse --verify refs/heads/t &&

0 commit comments

Comments
 (0)