Skip to content

Commit 4970bed

Browse files
committed
branch: update the message to refuse touching a branch in-use
The "git branch -f" command can refuse to force-update a branch that is used by another worktree. The original rationale for this behaviour was that updating a branch that is checked out in another worktree, without making a matching change to the index and the working tree files in that worktree, will lead to a very confused user. "git diff HEAD" will no longer give a useful patch, because HEAD is a commit unrelated to what the index and the working tree in the worktree were based on, for example. These days, the same mechanism also protects branches that are being rebased or bisected, and the same machanism is expected to be the right place to add more checks, when we decide to protect branches undergoing other kinds of operations. We however forgot to rethink the messaging, which originally said that we are refusing to touch the branch because it is "checked out" elsewhere, when d2ba271 (branch: check for bisects and rebases, 2022-06-14) started to protect branches that are being rebased or bisected. The spirit of the check has always been that we do not want to disrupt the use of the same branch in other worktrees. Let's reword the message slightly to say that the branch is "used by" another worktree, instead of "checked out". We could teach the branch.c:prepare_checked_out_branches() function to remember why it decided that a particular branch needs protecting (i.e. was it because it was checked out? being bisected? something else?) in addition to which worktree the branch was in use, and use that in the error message to say "you cannot force update this branch because it is being bisected in the worktree X", etc., but it is dubious that such extra complexity is worth it. The message already tells which directory the worktree in question is, and it should be just a "chdir" away for the user to find out what state it is in, if the user felt curious enough. So let's not go there yet. Helped-by: Josh Sref <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent aa9166b commit 4970bed

File tree

2 files changed

+6
-6
lines changed

2 files changed

+6
-6
lines changed

branch.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -471,7 +471,7 @@ int validate_new_branchname(const char *name, struct strbuf *ref, int force)
471471

472472
if ((path = branch_checked_out(ref->buf)))
473473
die(_("cannot force update the branch '%s' "
474-
"checked out at '%s'"),
474+
"used by worktree at '%s'"),
475475
ref->buf + strlen("refs/heads/"), path);
476476

477477
return 1;

t/t2407-worktree-heads.sh

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ test_expect_success !SANITIZE_LEAK 'refuse to overwrite: worktree in bisect' '
5858
git -C wt-4 bisect good wt-1 &&
5959
6060
test_must_fail git branch -f wt-4 HEAD 2>err &&
61-
grep "cannot force update the branch '\''wt-4'\'' checked out at.*wt-4" err
61+
grep "cannot force update the branch '\''wt-4'\'' used by worktree at.*wt-4" err
6262
'
6363

6464
test_expect_success !SANITIZE_LEAK 'refuse to overwrite: worktree in rebase (apply)' '
@@ -68,7 +68,7 @@ test_expect_success !SANITIZE_LEAK 'refuse to overwrite: worktree in rebase (app
6868
test_must_fail git -C wt-2 rebase --apply conflict-2 &&
6969
7070
test_must_fail git branch -f wt-2 HEAD 2>err &&
71-
grep "cannot force update the branch '\''wt-2'\'' checked out at.*wt-2" err
71+
grep "cannot force update the branch '\''wt-2'\'' used by worktree at.*wt-2" err
7272
'
7373

7474
test_expect_success !SANITIZE_LEAK 'refuse to overwrite: worktree in rebase (merge)' '
@@ -78,7 +78,7 @@ test_expect_success !SANITIZE_LEAK 'refuse to overwrite: worktree in rebase (mer
7878
test_must_fail git -C wt-2 rebase conflict-2 &&
7979
8080
test_must_fail git branch -f wt-2 HEAD 2>err &&
81-
grep "cannot force update the branch '\''wt-2'\'' checked out at.*wt-2" err
81+
grep "cannot force update the branch '\''wt-2'\'' used by worktree at.*wt-2" err
8282
'
8383

8484
test_expect_success !SANITIZE_LEAK 'refuse to overwrite: worktree in rebase with --update-refs' '
@@ -90,7 +90,7 @@ test_expect_success !SANITIZE_LEAK 'refuse to overwrite: worktree in rebase with
9090
for i in 3 4
9191
do
9292
test_must_fail git branch -f can-be-updated HEAD 2>err &&
93-
grep "cannot force update the branch '\''can-be-updated'\'' checked out at.*wt-3" err ||
93+
grep "cannot force update the branch '\''can-be-updated'\'' used by worktree at.*wt-3" err ||
9494
return 1
9595
done
9696
'
@@ -150,7 +150,7 @@ test_expect_success 'refuse to overwrite when in error states' '
150150
for i in 1 2
151151
do
152152
test_must_fail git branch -f fake-$i HEAD 2>err &&
153-
grep "cannot force update the branch '\''fake-$i'\'' checked out at" err ||
153+
grep "cannot force update the branch '\''fake-$i'\'' used by worktree at" err ||
154154
return 1
155155
done
156156
'

0 commit comments

Comments
 (0)