Re: What is the mechanism of a git checkout?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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

[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]