Re: What is the mechanism of a git checkout?
- From
Sitaram Chamarty <sitaramc@gmail.com>
- Date
- May 29, 2009, 01:15 UTC
- Message-ID
- <slrnh1udov.6ls.sitaramc@sitaramc.homelinux.net>
- In-Reply-To
- <23764024.post@talk.nabble.com>
On 2009-05-28 15:21:59, mastermindxs <mastermindxs@gmail.com> wrote:
Show 10 quoted lines
> > 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 aloneThis 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.