path: root/builtin
diff options
authorConrad Irwin <>2011-08-20 21:49:48 (GMT)
committerJunio C Hamano <>2011-08-22 23:00:36 (GMT)
commit55c4a673070f40f2ef12d0be269e95f1df6825a9 (patch)
treef3167659326c1308f6dfe3600ec0b57200cef335 /builtin
parent1be9d84b2ed18c2b2e2d6a459d2b6d48d5ab86e5 (diff)
Prevent force-updating of the current branch
"git branch -M <foo> <current-branch>" allows updating the current branch which HEAD points, without the necessary house-keeping that git reset normally does to make this operation sensible. It also leaves the reflog in a confusing state (you would be warned when trying to read it). "git checkout -B <current branch> <foo>" is also partly vulnerable to this bug; due to inconsistent pre-flight checks it would perform half of its task and then abort just before rewriting the branch. Again this manifested itself as the index file getting out-of-sync with HEAD. "git branch -f" already guarded against this problem, and aborts with a fatal error. Update "git branch -M", "git checkout -B" and "git branch -f" to share the same check before allowing a branch to be created. These prevent you from updating the current branch. We considered suggesting the use of "git reset" in the failure message but concluded that it was not possible to discern what the user was actually trying to do. Signed-off-by: Conrad Irwin <> Signed-off-by: Junio C Hamano <>
Diffstat (limited to 'builtin')
2 files changed, 4 insertions, 14 deletions
diff --git a/builtin/branch.c b/builtin/branch.c
index 3142daa..40f885c 100644
--- a/builtin/branch.c
+++ b/builtin/branch.c
@@ -566,11 +566,7 @@ static void rename_branch(const char *oldname, const char *newname, int force)
die(_("Invalid branch name: '%s'"), oldname);
- if (strbuf_check_branch_ref(&newref, newname))
- die(_("Invalid branch name: '%s'"), newname);
- if (resolve_ref(newref.buf, sha1, 1, NULL) && !force)
- die(_("A branch named '%s' already exists."), newref.buf + 11);
+ validate_new_branchname(newname, &newref, force);
strbuf_addf(&logmsg, "Branch: renamed %s to %s",
oldref.buf, newref.buf);
diff --git a/builtin/checkout.c b/builtin/checkout.c
index ca855d7..ddefec0 100644
--- a/builtin/checkout.c
+++ b/builtin/checkout.c
@@ -1071,15 +1071,9 @@ int cmd_checkout(int argc, const char **argv, const char *prefix)
if (opts.new_branch) {
struct strbuf buf = STRBUF_INIT;
- if (strbuf_check_branch_ref(&buf, opts.new_branch))
- die(_("git checkout: we do not like '%s' as a branch name."),
- opts.new_branch);
- if (ref_exists(buf.buf)) {
- opts.branch_exists = 1;
- if (!opts.new_branch_force)
- die(_("git checkout: branch %s already exists"),
- opts.new_branch);
- }
+ opts.branch_exists = validate_new_branchname(opts.new_branch, &buf, !!opts.new_branch_force);