Skip to content

Commit

Permalink
checkout: retire --ignore-other-worktrees in favor of --force
Browse files Browse the repository at this point in the history
As a safeguard, checking out a branch already checked out by a different
worktree is disallowed. This behavior can be overridden with
--ignore-other-worktrees, however, this option is neither obvious nor
particularly discoverable. As a common safeguard override, --force is
more likely to come to mind. Therefore, overload it to also suppress the
check for a branch already checked out elsewhere.

Signed-off-by: Eric Sunshine <sunshine@sunshineco.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Eric Sunshine authored and Junio C Hamano committed Jul 7, 2015
1 parent 1eb07d8 commit 0d1a151
Show file tree
Hide file tree
Showing 3 changed files with 7 additions and 12 deletions.
9 changes: 3 additions & 6 deletions Documentation/git-checkout.txt
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,9 @@ OPTIONS
+
When checking out paths from the index, do not fail upon unmerged
entries; instead, unmerged entries are ignored.
+
By default, checking out a branch already checked out in another worktree
is disallowed. This overrides that safeguard.

--ours::
--theirs::
Expand Down Expand Up @@ -225,12 +228,6 @@ This means that you can use `git checkout -p` to selectively discard
edits from your current working tree. See the ``Interactive Mode''
section of linkgit:git-add[1] to learn how to operate the `--patch` mode.

--ignore-other-worktrees::
`git checkout` refuses when the wanted ref is already checked
out by another worktree. This option makes it check the ref
out anyway. In other words, the ref can be held by more than one
worktree.

<branch>::
Branch to checkout; if it refers to a branch (i.e., a name that,
when prepended with "refs/heads/", is a valid ref), then that
Expand Down
8 changes: 3 additions & 5 deletions builtin/checkout.c
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,6 @@ struct checkout_opts {
int writeout_stage;
int overwrite_ignore;
int ignore_skipworktree;
int ignore_other_worktrees;

const char *new_branch;
const char *new_branch_force;
Expand Down Expand Up @@ -903,7 +902,8 @@ static void check_linked_checkout(struct branch_info *new, const char *id)
strbuf_rtrim(&gitdir);
} else
strbuf_addstr(&gitdir, get_git_common_dir());
die(_("'%s' is already checked out at '%s'"), new->name, gitdir.buf);
die(_("'%s' is already checked out at '%s'; use --force to override"),
new->name, gitdir.buf);
done:
strbuf_release(&path);
strbuf_release(&sb);
Expand Down Expand Up @@ -1151,7 +1151,7 @@ static int checkout_branch(struct checkout_opts *opts,
char *head_ref = resolve_refdup("HEAD", 0, sha1, &flag);
if (head_ref &&
(!(flag & REF_ISSYMREF) || strcmp(head_ref, new->path)) &&
!opts->ignore_other_worktrees)
!opts->force)
check_linked_checkouts(new);
free(head_ref);
}
Expand Down Expand Up @@ -1198,8 +1198,6 @@ int cmd_checkout(int argc, const char **argv, const char *prefix)
N_("do not limit pathspecs to sparse entries only")),
OPT_HIDDEN_BOOL(0, "guess", &dwim_new_local_branch,
N_("second guess 'git checkout no-such-branch'")),
OPT_BOOL(0, "ignore-other-worktrees", &opts.ignore_other_worktrees,
N_("do not check if another worktree is holding the given ref")),
OPT_END(),
};

Expand Down
2 changes: 1 addition & 1 deletion builtin/worktree.c
Original file line number Diff line number Diff line change
Expand Up @@ -303,7 +303,7 @@ static int add(int ac, const char **av, const char *prefix)

argv_array_push(&cmd, "checkout");
if (force)
argv_array_push(&cmd, "--ignore-other-worktrees");
argv_array_push(&cmd, "--force");
if (new_branch)
argv_array_pushl(&cmd, "-b", new_branch, NULL);
if (new_branch_force)
Expand Down

0 comments on commit 0d1a151

Please sign in to comment.