Revert "checkout: retire --ignore-other-worktrees in favor of --force"
authorJunio C Hamano <gitster@pobox.com>
Sun, 12 Jul 2015 16:38:21 +0000 (09:38 -0700)
committerJunio C Hamano <gitster@pobox.com>
Sun, 12 Jul 2015 16:38:21 +0000 (09:38 -0700)
This reverts commit 0d1a1517835a10818f2d40d8780a268dbb5e20ce.

When trying to switch to a different branch, that happens to be
checked out in another working tree, the user shouldn't have to
give up the other safety measures (like protecting the local changes
that overlap the difference between the branches) while defeating
the "no two checkouts of the same branch" safety.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/git-checkout.txt
builtin/checkout.c
builtin/worktree.c
index 6c3085d72d99e2fdbd013a75c657cc7ee47df71b..efe6a026f132b040cc47d847bbdb4f284c2a0133 100644 (file)
@@ -111,9 +111,6 @@ 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::
@@ -228,6 +225,12 @@ 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
index 01c7c30d54f475ab50fc2cae7f9d33e94b0f2a98..57545543ebcc46ef28ca4a22d399b5476de7af0b 100644 (file)
@@ -35,6 +35,7 @@ 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;
@@ -902,8 +903,7 @@ 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'; use --force to override"),
-           new->name, gitdir.buf);
+       die(_("'%s' is already checked out at '%s'"), new->name, gitdir.buf);
 done:
        strbuf_release(&path);
        strbuf_release(&sb);
@@ -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->force)
+                   !opts->ignore_other_worktrees)
                        check_linked_checkouts(new);
                free(head_ref);
        }
@@ -1198,6 +1198,8 @@ 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(),
        };
 
index 050b443dc008e4da542147edae391735426844c4..69248ba0a352de82f59a117b9ba4ed4e6af74a4d 100644 (file)
@@ -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, "--force");
+               argv_array_push(&cmd, "--ignore-other-worktrees");
        if (new_branch)
                argv_array_pushl(&cmd, "-b", new_branch, NULL);
        if (new_branch_force)