Documentation / git-checkout.txton commit revision.c: explain what tree_difference does (0a4ba7f)
   1git-checkout(1)
   2===============
   3
   4NAME
   5----
   6git-checkout - Checkout and switch to a branch
   7
   8SYNOPSIS
   9--------
  10[verse]
  11'git-checkout' [-q] [-f] [-b [--track | --no-track] <new_branch> [-l]] [-m] [<branch>]
  12'git-checkout' [<tree-ish>] <paths>...
  13
  14DESCRIPTION
  15-----------
  16
  17When <paths> are not given, this command switches branches by
  18updating the index and working tree to reflect the specified
  19branch, <branch>, and updating HEAD to be <branch> or, if
  20specified, <new_branch>.  Using -b will cause <new_branch> to
  21be created; in this case you can use the --track or --no-track
  22options, which will be passed to `git branch`.
  23
  24When <paths> are given, this command does *not* switch
  25branches.  It updates the named paths in the working tree from
  26the index file (i.e. it runs `git-checkout-index -f -u`), or a
  27named commit.  In
  28this case, `-f` and `-b` options are meaningless and giving
  29either of them results in an error.  <tree-ish> argument can be
  30used to specify a specific tree-ish (i.e. commit, tag or tree)
  31to update the index for the given paths before updating the
  32working tree.
  33
  34
  35OPTIONS
  36-------
  37-q::
  38        Quiet, supress feedback messages.
  39
  40-f::
  41        Force a re-read of everything.
  42
  43-b::
  44        Create a new branch named <new_branch> and start it at
  45        <branch>.  The new branch name must pass all checks defined
  46        by gitlink:git-check-ref-format[1].  Some of these checks
  47        may restrict the characters allowed in a branch name.
  48
  49--track::
  50        When -b is given and a branch is created off a remote branch,
  51        setup so that git-pull will automatically retrieve data from
  52        the remote branch.
  53
  54--no-track::
  55        When -b is given and a branch is created off a remote branch,
  56        force that git-pull will automatically retrieve data from
  57        the remote branch independent of the configuration settings.
  58
  59-l::
  60        Create the new branch's ref log.  This activates recording of
  61        all changes to made the branch ref, enabling use of date
  62        based sha1 expressions such as "<branchname>@{yesterday}".
  63
  64-m::
  65        If you have local modifications to one or more files that
  66        are different between the current branch and the branch to
  67        which you are switching, the command refuses to switch
  68        branches in order to preserve your modifications in context.
  69        However, with this option, a three-way merge between the current
  70        branch, your working tree contents, and the new branch
  71        is done, and you will be on the new branch.
  72+
  73When a merge conflict happens, the index entries for conflicting
  74paths are left unmerged, and you need to resolve the conflicts
  75and mark the resolved paths with `git add` (or `git rm` if the merge
  76should result in deletion of the path).
  77
  78<new_branch>::
  79        Name for the new branch.
  80
  81<branch>::
  82        Branch to checkout; may be any object ID that resolves to a
  83        commit.  Defaults to HEAD.
  84+
  85When this parameter names a non-branch (but still a valid commit object),
  86your HEAD becomes 'detached'.
  87
  88
  89Detached HEAD
  90-------------
  91
  92It is sometimes useful to be able to 'checkout' a commit that is
  93not at the tip of one of your branches.  The most obvious
  94example is to check out the commit at a tagged official release
  95point, like this:
  96
  97------------
  98$ git checkout v2.6.18
  99------------
 100
 101Earlier versions of git did not allow this and asked you to
 102create a temporary branch using `-b` option, but starting from
 103version 1.5.0, the above command 'detaches' your HEAD from the
 104current branch and directly point at the commit named by the tag
 105(`v2.6.18` in the above example).
 106
 107You can use usual git commands while in this state.  You can use
 108`git-reset --hard $othercommit` to further move around, for
 109example.  You can make changes and create a new commit on top of
 110a detached HEAD.  You can even create a merge by using `git
 111merge $othercommit`.
 112
 113The state you are in while your HEAD is detached is not recorded
 114by any branch (which is natural --- you are not on any branch).
 115What this means is that you can discard your temporary commits
 116and merges by switching back to an existing branch (e.g. `git
 117checkout master`), and a later `git prune` or `git gc` would
 118garbage-collect them.  If you did this by mistake, you can ask
 119the reflog for HEAD where you were, e.g.
 120
 121------------
 122$ git log -g -2 HEAD
 123------------
 124
 125
 126EXAMPLES
 127--------
 128
 129. The following sequence checks out the `master` branch, reverts
 130the `Makefile` to two revisions back, deletes hello.c by
 131mistake, and gets it back from the index.
 132+
 133------------
 134$ git checkout master             <1>
 135$ git checkout master~2 Makefile  <2>
 136$ rm -f hello.c
 137$ git checkout hello.c            <3>
 138------------
 139+
 140<1> switch branch
 141<2> take out a file out of other commit
 142<3> restore hello.c from HEAD of current branch
 143+
 144If you have an unfortunate branch that is named `hello.c`, this
 145step would be confused as an instruction to switch to that branch.
 146You should instead write:
 147+
 148------------
 149$ git checkout -- hello.c
 150------------
 151
 152. After working in a wrong branch, switching to the correct
 153branch would be done using:
 154+
 155------------
 156$ git checkout mytopic
 157------------
 158+
 159However, your "wrong" branch and correct "mytopic" branch may
 160differ in files that you have locally modified, in which case,
 161the above checkout would fail like this:
 162+
 163------------
 164$ git checkout mytopic
 165fatal: Entry 'frotz' not uptodate. Cannot merge.
 166------------
 167+
 168You can give the `-m` flag to the command, which would try a
 169three-way merge:
 170+
 171------------
 172$ git checkout -m mytopic
 173Auto-merging frotz
 174------------
 175+
 176After this three-way merge, the local modifications are _not_
 177registered in your index file, so `git diff` would show you what
 178changes you made since the tip of the new branch.
 179
 180. When a merge conflict happens during switching branches with
 181the `-m` option, you would see something like this:
 182+
 183------------
 184$ git checkout -m mytopic
 185Auto-merging frotz
 186merge: warning: conflicts during merge
 187ERROR: Merge conflict in frotz
 188fatal: merge program failed
 189------------
 190+
 191At this point, `git diff` shows the changes cleanly merged as in
 192the previous example, as well as the changes in the conflicted
 193files.  Edit and resolve the conflict and mark it resolved with
 194`git add` as usual:
 195+
 196------------
 197$ edit frotz
 198$ git add frotz
 199------------
 200
 201
 202Author
 203------
 204Written by Linus Torvalds <torvalds@osdl.org>
 205
 206Documentation
 207--------------
 208Documentation by Junio C Hamano and the git-list <git@vger.kernel.org>.
 209
 210GIT
 211---
 212Part of the gitlink:git[7] suite
 213