On 2009-05-28 15:21:59, mastermindxs <mastermindxs@xxxxxxxxx> wrote: > > does a git checkout pull the contents of a branch? how does it physically > separate files in your working directory from other branches? > > The speed of which it works leads me to the logical conclusion that the > files in the working directory are all there for all branches and git simply > only shows you the files of the active branch. > > Can anyone shed more light on the underlying mechanisms of git checkout > maybe even branch and merge as well? I explain it as below when I get asked this question. It's a simplified answer but largely correct, I believe. Corrections from git.gods welcome :-) When you checkout a branch, you are moving from a "before" branch to an "after" branch. git does this: - untracked files are never touched; the rest of this discussion does not apply to them - files which do NOT show up in "git status" (ie unchanged with respect to the "before" branch) are changed as per their status in the "after" branch. - if they exist in the "after" branch, and are the same as in the "before" branch, they are left alone This is where all the speed you see comes from! - if they exist in the "after" branch, and they are **different** than in the "before" branch, they are checked out from the "after" branch This is the bulk of the disk activity; if there are few of these, it's fast enough for you think nothing is actually happening ;-) - if they do not exist in the "after" branch, they are deleted - files that do show up in "git status" in the "before" branch, are either modified or staged. - if the "before" branch version is the same as the "after" branch version, that also is not touched. In the new branch, running "git status" will show you the same files. - if the "before" branch version and the "after" branch version are *not* the same, git would lose your local (uncommitted) changes, so it refuses to do the checkout and stays where it is. -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html