From: J.V. Date: Sat, 12 Nov 2011 00:24:02 GMT Subject: Re: Git: Unexpected behaviour? Message-ID: <4EBDBCA2.7070603@gmail.com> In-Reply-To: <4EBD9428.3030506@gmail.com> OK so "work tree" is a new term for me. I thought we were in isolated sandboxes called "branches" and changes made in a branch would stay in that branch regardless. so anything in the "work tree" is over layed on top of my branch if there are no conflicts? On 11/11/2011 2:31 PM, Chris Packham wrote: > Hi, > > On 12/11/11 09:55, Jvsrvcs wrote: >> Unexpected git behaviour >> >> --- >> # First create a local git repo >> >> $mkdir gitexample >> $git config --global user.name "my name" >> $git config --global user.email "me@me.com" >> $git init >> $git add . >> $git commit -m 'initial commit' >> >> # Create/Edit an empty file >> $vi readme.txt >> >> # add a single line: "this was added in the master branch." >> $git commit -a > One thing to remember is that this is the same as "git add readme.txt" > and "git commit" (I'll explain why below). > >> # create and checkout a new branch (from master) >> $git branch test >> $git checkout test >> >> # edit the readme.txt file and do not commit >> # add the text: "this was added in the test branch.", save and exit >> $vi readme.txt > At this point the changes are in the work tree. They aren't added to the > test branch until you commit them. > >> #now switch back to master >> $git checkout master > When you have uncommited changes in the work tree that don't conflict > with the contents of the branch you are checking out git will happily > carry them along for you. If they did conflict then git would refuse to > switch to the new branch. > >> $cat readme.txt >> >> #You will see both lines in the master. >> >> Question #1: >> Why was this line added in the *master branch? > Because the second change hasn't been committed it isn't in either > branch. It's in the work tree. > >> --- even further surprising >> In the master branch, now do a commit >> $git commit -a >> >> cat readme.txt ( you will see the line in the master now that was added in >> the test branch ) >> >> Question #2: >> Why did this happen? > Because you asked for it to happen. > >> # Now switch back to the test branch >> $git checkout test >> $cat readme.txt >> >> You will only see the one line: "This was added in the master branch" >> >> Question #3: >> Why did this happen? > Because the second change was committed (in the master branch) it is > no-longer floating in the work tree so when you switch branches you get > the contents of the file in that branch. > >> and NOT the line added in that branch: "this was added in the test branch" >> <= this line is gone >> >> What is the reason for this? >> >> 1) Why do I see uncommitted changes in the branches made off master in the >> master branch? >> 2) Why, if I commit them in the master, do the disappear in the branch in >> which they were made? >> >> This is confusing, I would think the * master branch would be left >> untouched. This would solve issue #2. >> > Hopefully this will explain things a little better > > [work-tree] -- git add -> [index] -- git commit --> [HEAD] > > work-tree: the area on the file system where your code is checked out. > index: also known as the staging area, this is represents what will end > up in the next commit. > HEAD: a general term for the current branch. > > As you can see that until a change is committed it isn't in _any_ > branch. When you type "git checkout test" or "git checkout master" HEAD > will be updated. Changes in the work-tree or the index will be carried > along (provided they don't conflict with the new HEAD). > > Hope that helps. > >