Hi, Josh Chia (谢任中) wrote: > On git 1.7.7.3, when I try to "git branch -M master" when I'm already > on a branch 'master', I get this error message: > Cannot force update the current branch > > On 1.7.6.4, the command succeeds. > > Is this intended? Yes, but it probably wasn't a good idea. How about this patch? A reproduction recipe (preferrably in the form of a patch to t/t3200-branch.sh would be welcome. -- >8 -- Subject: treat "git branch -M master master" as a no-op again Before v1.7.7-rc2~1^2~2 (Prevent force-updating of the current branch, 2011-08-20), commands like "git branch -M topic master" could be used even when "master" was the current branch, with the somewhat counterintuitive result that HEAD would point to some place new while the index and worktree kept the content of the old commit. This is not a very sensible operation and the result is what almost nobody would expect, so erroring out in this case was a good change. However, there is one exception to the "it's usually not obvious what it would mean to overwrite the current branch by another one" rule. Namely: git branch -M master master is clearly meant to be a no-op, even if you are on the master branch. And in the latter case, it can be abbreviated: git branch -M master This seems like a valuable exception to allow, because then "git branch -M foo" would _always_ be allowed --- either 'foo' is not the current branch, and it does the obvious thing, or 'foo' is the current branch, and nothing happens. Buildbot uses this idiom and was broken in 1.7.7 (it would emit the message "Cannot force update the current branch"). Reported-by: Soeren Sonnenburg <sonne@xxxxxxxxxx> Reported-by: Josh Chia (谢任中) Signed-off-by: Jonathan Nieder <jrnieder@xxxxxxxxx> --- builtin/branch.c | 9 ++++++++- 1 files changed, 8 insertions(+), 1 deletions(-) diff --git a/builtin/branch.c b/builtin/branch.c index 51ca6a02..24f33b24 100644 --- a/builtin/branch.c +++ b/builtin/branch.c @@ -568,6 +568,7 @@ static void rename_branch(const char *oldname, const char *newname, int force) unsigned char sha1[20]; struct strbuf oldsection = STRBUF_INIT, newsection = STRBUF_INIT; int recovery = 0; + int clobber_head_ok; if (!oldname) die(_("cannot rename the current branch while not on any.")); @@ -583,7 +584,13 @@ static void rename_branch(const char *oldname, const char *newname, int force) die(_("Invalid branch name: '%s'"), oldname); } - validate_new_branchname(newname, &newref, force, 0); + /* + * A command like "git branch -M currentbranch currentbranch" cannot + * cause the worktree to become inconsistent with HEAD, so allow it. + */ + clobber_head_ok = !strcmp(oldname, newname); + + validate_new_branchname(newname, &newref, force, clobber_head_ok); strbuf_addf(&logmsg, "Branch: renamed %s to %s", oldref.buf, newref.buf); -- 1.7.8.rc3 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html