Konstantin,

Thanks a lot! That made me understand it perfectly! After your post I
went looking for more in depth info, and found the blog post "The
Three Trees of Git" on progit.org. The it all made sense!

Thanks a lot!!

On 11 Okt., 04:34, Konstantin Khomoutov
<flatw...@users.sourceforge.net> wrote:
> On Mon, Oct 10, 2011 at 03:48:24PM -0700, JP wrote:
>
> [...]
>
>
>
>
>
>
>
> > * I make some changes on the new branch. I do not commit or add these
> > changes to the staging area. I have both changed existing files and
> > added new files.
> > * Using the command "git checkout master" I switch back to my master
> > branch.
>
> > The changes I have made in the branch newLogin are visible in my
> > master branch. Switching branch does nothing. I would have expected to
> > see a master branch that did not have these changes.
>
> > If I then add these files to the staging area in master and switch
> > back to newLogin, "git status" will show exactly the same in every
> > branch.
>
> > What am I doing wrong? Have I completely misunderstood a very basic
> > concept in Git? I don't remember previous versions of Git acting like
> > this.
>
> Git had always behaved like this and yes, you're currently maintaining a
> wrong mental model about how Git works.
> In Git, "the work tree"--the set of files currently checked out, and
> "the index"--that sort of virtual thing which helps building the state
> which will be committed--are separate from any branch or, to put it
> differently, do not belong to any branch.
>
> This means, when you checkout a branch X, basically these things happen:
> 1) The files in the work tree are made to appear as in the tip commit on
>    the X branch;
> 2) The index is updated with that same information;
> 3) The reference named "HEAD" is updated so that now it points to the
>    branch X.
> So, when you commit, Git is only concerned with that HEAD reference: it
> updates whatever branch HEAD points to at the moment.
> When you have local unstaged changes or staged changes and try
> to switch a branch, Git does not automatically somehow stash away those
> changes because neither of them does belong to any branch yet:
> unstaged changes belong to the work tree and staged changes belong to
> the index, only when you commit (the staged changes) the resulting
> commit starts to belong to some branch.
>
> Git does have a special place called "the stash", and you can explicitly
> record your local edits there and later apply them to whatever state you
> checked out.
>
> So, it appears that in your mental model you perceive a branch as being
> some sort of complicated virtual thing but in fact a branch is merely a
> pointer to a commit and "being on a branch" merely means, very simply
> put, that the special ref "HEAD" is currently pointing at that branch.
>
> Hence it possibly helps to develop an understanding that when you think
> you're "working on a branch" you're *really* working in the work tree
> and with the index, and that "currently checked out branch" thing merely
> defines two things:
> 1) The state the work tree and the index start with;
> 2) Where the next commit you'll prepare will go into.

-- 
You received this message because you are subscribed to the Google Groups "Git 
for human beings" group.
To post to this group, send email to git-users@googlegroups.com.
To unsubscribe from this group, send email to 
git-users+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/git-users?hl=en.

Reply via email to