From: Nish Aravamudan <nish.aravamudan@canonical.com>
To: git@vger.kernel.org
Cc: gitster@pobox.com
Subject: Undocumented change in `git branch -M` behavior
Date: Wed, 23 Aug 2017 13:13:34 -0700 [thread overview]
Message-ID: <20170823201334.bz42s6t5ti4jdaqm@pitfall> (raw)
Hello,
Hopefully, I've got this right -- I noticed a change in behavior in git
with Ubuntu 17.10, which recently got 2.14.1. Specifically, that when in
an orphaned branch, -M ends up moving HEAD to the new branch name,
clobbering the working tree. As far as I know, from the manpages,
orphaned branches are still supported and should work?
I think an example will demonstrate more than words (the following are
done in LXD containers, hence the root user):
# git --version
git version 2.14.1
# mkdir test && cd test && git init .
Initialized empty Git repository in /root/test/.git/
# git checkout -b a
Switched to a new branch 'a'
# touch testfile && git add testfile && git commit -m 'initial commit'
[a (root-commit) 6061193] initial commit
Committer: root <root@precious-magpie.lxd>
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 testfile
# git checkout --orphan master
Switched to a new branch 'master'
# git status
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: testfile
# git reset --hard && git status
On branch master
No commits yet
nothing to commit (create/copy files and use "git add" to track)
# git branch -M a b
# git status
On branch b
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
deleted: testfile
This is very unexpected. I force-renamed a branch I wasn't currently
checked out to and now I'm checked out to it *and* I have staged file
removals (I think what is effectively happening is my current working
directory (empty) is being staged into the new branch, but I'm not
100%).
For comparision, on 17.04:
# git --version
git version 2.11.0
# mkdir test && cd test && git init .
Initialized empty Git repository in /root/test/.git/
# git checkout -b a
Switched to a new branch 'a'
# touch testfile && git add testfile && git commit -m 'initial commit'
[a (root-commit) f8d0d53] initial commit
Committer: root <root@honest-sturgeon.lxd>
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 testfile
# git checkout --orphan master
Switched to a new branch 'master'
# git status
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: testfile
# git reset --hard && git status
On branch master
No commits yet
nothing to commit (create/copy files and use "git add" to track)
# git branch -M a b
# git status
On branch master
Initial commit
nothing to commit (create/copy files and use "git add" to track)
This is what I expect to see, the branch rename has no effect on HEAD.
I haven't yet bisected this (but I can if necessary). My initial
suspicion is
https://github.com/git/git/commit/70999e9ceca47e03b8900bfb310b2f804125811e#diff-d18f86ea14e2f1e5bff391b2e54438cb
where a comparison between the oldname of the branch and HEAD was
performed before attempting to move HEAD (so that HEAD followed to the
new branch name, I believe). That change was dropped, though and perhaps
the new check in replace_each_worktree_head_symref of
strcmp(oldref, worktrees[i]->head_ref)
does not work for orphaned branches? I am unfamiliar with all the
details of the git internals, so please correct me if I'm wrong!
Thanks,
Nish
--
Nishanth Aravamudan
Ubuntu Server
Canonical Ltd
next reply other threads:[~2017-08-23 20:13 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-08-23 20:13 Nish Aravamudan [this message]
2017-08-24 5:32 ` Undocumented change in `git branch -M` behavior Kevin Daudt
2017-08-24 8:59 ` Duy Nguyen
2017-08-24 10:41 ` [PATCH] Fix branch renaming not updating HEADs correctly Nguyễn Thái Ngọc Duy
2017-08-24 19:04 ` Nish Aravamudan
2017-08-27 5:39 ` Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170823201334.bz42s6t5ti4jdaqm@pitfall \
--to=nish.aravamudan@canonical.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.