Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Git "commits left behind" when switching back to a branch from detached head

Tags:

git

For certain commits in our repo (but not all), if I check out the commit, then return to the master branch, I get an unexpected warning about commits being left behind:

# Check out one of the commits in question:
$ git checkout dd33caa5b004b0e3bd449152f9335e40450db91c
Note: checking out 'dd33caa5b004b0e3bd449152f9335e40450db91c'.

You are in 'detached HEAD' state. You can look around, make experimental
[...]
HEAD is now at dd33caa... Organized DataStore build files, added cleanup targets.

# Now switch back to the master branch so I can work:
$ git checkout master
Warning: you are leaving 17 commits behind, not connected to
any of your branches:

  dd33caa Organized DataStore build files, added cleanup targets.
  4916eec Fixes to C++ codegen to use maven features.
  a26291d Merge branch 'master' of [redacted origin repo address]
  93ae0b9 Add protobuf 2.4.1 jar file to install scripts. Add QTDIR to build script.
 ... and 13 more.

If you want to keep them by creating a new branch, this may be a good time
to do so with:

 git branch new_branch_name dd33caa5b004b0e3bd449152f9335e40450db91c

Switched to branch 'master'

All the commits in question (as far as I can tell) are reachable from master, and I haven't made any commits while in the detached head state (this is a clean clone of our repository). The master branch's history looks like this:

* 04d7fcc (HEAD, origin/master, origin/HEAD, master) Removed files from DataS
* ecaa2f5 Fixed .gitignore.
* dd33caa Organized DataStore build files, added cleanup targets.
* 4916eec Fixes to C++ codegen to use maven features.
*   a26291d Merge branch 'master' of [redacted]
|\  
| * 93ae0b9 Add protobuf 2.4.1 jar file to install scripts. Add QTDIR to buil
| * 3cba845 switched to protobug 2.4.1 jar files
| * 1046d22 fixed GATEWAY_ROOT
| * ebcda06 edit windows build scripting path for new repo location
| * bda1e17 add windows build scripts from old repo
* |   371883d Merge branch 'master' of [redacted]
|\ \  
| |/  
| * 771c579 Fix MCast and RMCast service names in gateway manager config
* | 864fb25 First cut at DataStore code generation update to sync with refact
|/  
* f505e46 Testing new repository
*   111d89a Merge branch 'master' of [redacted]

Any idea what might be going on here? It appears to be connected to one specific user's commits, and I can reproduce this with Git 1.7.9.6 on OSX and with Git 1.7.9.5 on Ubuntu, but not with 1.8.0 on Ubuntu... so a Git bug, perhaps? I don't see anything that looks relevant in the release notes, though...

like image 463
JonathonW Avatar asked Nov 20 '12 19:11

JonathonW


1 Answers

Yes, this looks like a Git bug. If you care to find out what fixed it, you can do a bisection. Clone git.git, checkout a version that is broken and verify that the problem occurs, check out the latest and verify that it's fixed, and then run a bisection to find which commit fixed the problem:

$ git clone git://github.com/git/git.git
$ cd git
$ git checkout v1.7.9.5
$ make
$ (cd my-repo && /path/to/my/git checkout dd33caa && /path/to/my/git checkout master 2>&1 | grep "leaving .* commits behind")
$ git checkout v1.8.0
$ make
$ (cd my-repo && /path/to/my/git checkout dd33caa && /path/to/my/git checkout master 2>&1 | grep "leaving .* commits behind")
# if the above gave the expected results:
$ git bisect start v1.7.9.5 v1.8.0
$ git bisect run bash -c "make && cd my-repo && /path/to/my/git checkout dd33caa && (! /path/to/my/git checkout master 2>&1 | grep -q 'leaving .* commits behind')"

That should leave you on the commit that fixed your bug. Note that we're doing the opposite of the usual bisection, in which you are trying to find the commit that introduced a bug.

like image 132
Brian Campbell Avatar answered Nov 14 '22 04:11

Brian Campbell