From: Junio C Hamano Date: Mon, 07 Feb 2011 23:37:15 GMT Subject: Re: [1.8.0] git checkout refs/heads/foo checks out branch foo Message-ID: <7vaai7s9g4.fsf@alter.siamese.dyndns.org> In-Reply-To: <20110207220030.GA19357@elie> Jonathan Nieder writes: > Sverre Rabbelier wrote: > >> Now _that_ is an excellent usability improvement, assuming we want to >> encourage detaching HEAD... do we? > > Yes. > > -- 8< > Subject: commit: document --detach synonym for "git checkout foo^{commit}" > > For example, one might use this when making a temporary merge to test > that two topics work well together. > > This patch just documents the option. It is not meant for application > without an implementation and tests for the option. On top of v1.7.3.5-1-g0cb6ad3 (uk/checkout-ambiguous-ref)... builtin/checkout.c | 12 +++++++++--- 1 files changed, 9 insertions(+), 3 deletions(-) diff --git a/builtin/checkout.c b/builtin/checkout.c index 953abdd..141f6a3 100644 --- a/builtin/checkout.c +++ b/builtin/checkout.c @@ -685,6 +685,7 @@ int cmd_checkout(int argc, const char **argv, const char *prefix) char *conflict_style = NULL; int patch_mode = 0; int dwim_new_local_branch = 1; + int force_detach = 0; struct option options[] = { OPT__QUIET(&opts.quiet), OPT_STRING('b', NULL, &opts.new_branch, "branch", @@ -692,6 +693,7 @@ int cmd_checkout(int argc, const char **argv, const char *prefix) OPT_STRING('B', NULL, &opts.new_branch_force, "branch", "create/reset and checkout a branch"), OPT_BOOLEAN('l', NULL, &opts.new_branch_log, "create reflog for new branch"), + OPT_BOOLEAN(0, "detach", &force_detach, "detach the HEAD at named commit"), OPT_SET_INT('t', "track", &opts.track, "set upstream info for new branch", BRANCH_TRACK_EXPLICIT), OPT_STRING(0, "orphan", &opts.new_orphan_branch, "new branch", "new unparented branch"), @@ -726,6 +728,9 @@ int cmd_checkout(int argc, const char **argv, const char *prefix) if (opts.new_branch && opts.new_branch_force) die("-B cannot be used with -b"); + if ((opts.new_branch || opts.new_orphan_branch) && force_detach) + die("--detach cannot be used with -b/-B/--orphan"); + /* copy -B over to -b, so that we can just check the latter */ if (opts.new_branch_force) opts.new_branch = opts.new_branch_force; @@ -834,7 +839,8 @@ int cmd_checkout(int argc, const char **argv, const char *prefix) new.name = arg; setup_branch_path(&new); - if (check_ref_format(new.path) == CHECK_REF_FORMAT_OK && + if (!force_detach && + check_ref_format(new.path) == CHECK_REF_FORMAT_OK && resolve_ref(new.path, branch_rev, 1, NULL)) hashcpy(rev, branch_rev); else