[PATCH 0/2] worktree: treat a branch being rebased or bisected as checked out
- From
- Jasper Mayone <me@jaspermayone.com>
- Date
- Oct 30, 2026, 14:21 UTC
- Message-ID
- <20261030142137.54750-1-me@jaspermayone.com>
- In-Reply-To
- <20261024165311.57387-1-me@jaspermayone.com>
This replaces my "git worktree list --branch" patch [1]. In that thread Kristoffer pointed out that "git for-each-ref --merged <commit> --format='%(worktreepath)' refs/heads/" already finds the worktrees of merged branches, so a new option is not needed. What is missing is that %(worktreepath) ignores a branch while a worktree is rebasing or bisecting it, although "git worktree add" and "git branch -d" already treat that branch as checked out. Phillip agreed that this is a bug.
Ben then asked what happens if such a worktree is passed to "git worktree remove". Today it is removed, and the rebase or bisect state is lost with it, if the files happen to be clean. Phillip called that a bug too, and more likely to be hit once %(worktreepath) reports these worktrees, so it is fixed first.
1/2 makes "git worktree remove" refuse a worktree in the middle of a
rebase, "git am", bisect, or cherry-pick or revert sequence,
unless --force is given. 2/2 makes %(worktreepath), and so the "+" marker of "git branch",
name the worktree that is rebasing or bisecting a branch, as
prepare_checked_out_branches() in branch.c does. Branches that
"rebase --update-refs" will move are not included.Two things reviewers may want to decide differently:
* In the worktree that is doing the rebase, "git branch" now shows both "* (no branch, rebasing topic)" and "+ topic". I documented that rather than special-case the current worktree in the format that "git branch" builds, because %(worktreepath) itself should not depend on where it is run. If you would rather hide the "+" there, I can do that in "git branch" instead.
* A merge stopped with --no-commit is not checked by 1/2. Its staged changes already make "git status" report the worktree as unclean in the common case.
[1] https://lore.kernel.org/git/20261024165311.57387-1-me@jaspermayone.com/
Jasper Mayone (2): worktree remove: refuse a worktree in the middle of a rebase or bisect ref-filter: name the worktree of a branch being rebased or bisected
Documentation/git-branch.adoc | 5 ++- Documentation/git-for-each-ref.adoc | 4 +- Documentation/git-worktree.adoc | 11 +++-- builtin/worktree.c | 31 +++++++++++++- ref-filter.c | 60 +++++++++++++++++++++------ t/t2403-worktree-move.sh | 59 +++++++++++++++++++++++++++ t/t3203-branch-output.sh | 35 ++++++++++++++++ t/t6302-for-each-ref-filter.sh | 63 +++++++++++++++++++++++++++++ 8 files changed, 249 insertions(+), 19 deletions(-)
base-commit: b9e5cff1803ab24582201ef059516eb16014b9d9
-- 2.56.0