Documentation / git-rebase.txton commit glossary: add 'reflog' (f8d6957)
   1git-rebase(1)
   2=============
   3
   4NAME
   5----
   6git-rebase - Forward-port local commits to the updated upstream head
   7
   8SYNOPSIS
   9--------
  10[verse]
  11'git-rebase' [-v] [--merge] [-C<n>] [--onto <newbase>] <upstream> [<branch>]
  12'git-rebase' --continue | --skip | --abort
  13
  14DESCRIPTION
  15-----------
  16If <branch> is specified, git-rebase will perform an automatic
  17`git checkout <branch>` before doing anything else.  Otherwise
  18it remains on the current branch.
  19
  20All changes made by commits in the current branch but that are not
  21in <upstream> are saved to a temporary area.  This is the same set
  22of commits that would be shown by `git log <upstream>..HEAD`.
  23
  24The current branch is reset to <upstream>, or <newbase> if the
  25--onto option was supplied.  This has the exact same effect as
  26`git reset --hard <upstream>` (or <newbase>).
  27
  28The commits that were previously saved into the temporary area are
  29then reapplied to the current branch, one by one, in order.
  30
  31It is possible that a merge failure will prevent this process from being
  32completely automatic.  You will have to resolve any such merge failure
  33and run `git rebase --continue`.  Another option is to bypass the commit
  34that caused the merge failure with `git rebase --skip`.  To restore the
  35original <branch> and remove the .dotest working files, use the command
  36`git rebase --abort` instead.
  37
  38Assume the following history exists and the current branch is "topic":
  39
  40------------
  41          A---B---C topic
  42         /
  43    D---E---F---G master
  44------------
  45
  46From this point, the result of either of the following commands:
  47
  48
  49    git-rebase master
  50    git-rebase master topic
  51
  52would be:
  53
  54------------
  55                  A'--B'--C' topic
  56                 /
  57    D---E---F---G master
  58------------
  59
  60The latter form is just a short-hand of `git checkout topic`
  61followed by `git rebase master`.
  62
  63Here is how you would transplant a topic branch based on one
  64branch to another, to pretend that you forked the topic branch
  65from the latter branch, using `rebase --onto`.
  66
  67First let's assume your 'topic' is based on branch 'next'.
  68For example feature developed in 'topic' depends on some
  69functionality which is found in 'next'.
  70
  71------------
  72    o---o---o---o---o  master
  73         \
  74          o---o---o---o---o  next
  75                           \
  76                            o---o---o  topic
  77------------
  78
  79We would want to make 'topic' forked from branch 'master',
  80for example because the functionality 'topic' branch depend on
  81got merged into more stable 'master' branch, like this:
  82
  83------------
  84    o---o---o---o---o  master
  85        |            \
  86        |             o'--o'--o'  topic
  87         \
  88          o---o---o---o---o  next
  89------------
  90
  91We can get this using the following command:
  92
  93    git-rebase --onto master next topic
  94
  95
  96Another example of --onto option is to rebase part of a
  97branch.  If we have the following situation:
  98
  99------------
 100                            H---I---J topicB
 101                           /
 102                  E---F---G  topicA
 103                 /
 104    A---B---C---D  master
 105------------
 106
 107then the command
 108
 109    git-rebase --onto master topicA topicB
 110
 111would result in:
 112
 113------------
 114                 H'--I'--J'  topicB
 115                /
 116                | E---F---G  topicA
 117                |/
 118    A---B---C---D  master
 119------------
 120
 121This is useful when topicB does not depend on topicA.
 122
 123A range of commits could also be removed with rebase.  If we have
 124the following situation:
 125
 126------------
 127    E---F---G---H---I---J  topicA
 128------------
 129
 130then the command
 131
 132    git-rebase --onto topicA~5 topicA~2 topicA
 133
 134would result in the removal of commits F and G:
 135
 136------------
 137    E---H'---I'---J'  topicA
 138------------
 139
 140This is useful if F and G were flawed in some way, or should not be
 141part of topicA.  Note that the argument to --onto and the <upstream>
 142parameter can be any valid commit-ish.
 143
 144In case of conflict, git-rebase will stop at the first problematic commit
 145and leave conflict markers in the tree.  You can use git diff to locate
 146the markers (<<<<<<) and make edits to resolve the conflict.  For each
 147file you edit, you need to tell git that the conflict has been resolved,
 148typically this would be done with
 149
 150
 151    git add <filename>
 152
 153
 154After resolving the conflict manually and updating the index with the
 155desired resolution, you can continue the rebasing process with
 156
 157
 158    git rebase --continue
 159
 160
 161Alternatively, you can undo the git-rebase with
 162
 163
 164    git rebase --abort
 165
 166OPTIONS
 167-------
 168<newbase>::
 169        Starting point at which to create the new commits. If the
 170        --onto option is not specified, the starting point is
 171        <upstream>.  May be any valid commit, and not just an
 172        existing branch name.
 173
 174<upstream>::
 175        Upstream branch to compare against.  May be any valid commit,
 176        not just an existing branch name.
 177
 178<branch>::
 179        Working branch; defaults to HEAD.
 180
 181--continue::
 182        Restart the rebasing process after having resolved a merge conflict.
 183
 184--abort::
 185        Restore the original branch and abort the rebase operation.
 186
 187--skip::
 188        Restart the rebasing process by skipping the current patch.
 189
 190--merge::
 191        Use merging strategies to rebase.  When the recursive (default) merge
 192        strategy is used, this allows rebase to be aware of renames on the
 193        upstream side.
 194
 195-s <strategy>, \--strategy=<strategy>::
 196        Use the given merge strategy; can be supplied more than
 197        once to specify them in the order they should be tried.
 198        If there is no `-s` option, a built-in list of strategies
 199        is used instead (`git-merge-recursive` when merging a single
 200        head, `git-merge-octopus` otherwise).  This implies --merge.
 201
 202-v, \--verbose::
 203        Display a diffstat of what changed upstream since the last rebase.
 204
 205-C<n>::
 206        Ensure at least <n> lines of surrounding context match before
 207        and after each change.  When fewer lines of surrounding
 208        context exist they all must match.  By default no context is
 209        ever ignored.
 210
 211include::merge-strategies.txt[]
 212
 213NOTES
 214-----
 215When you rebase a branch, you are changing its history in a way that
 216will cause problems for anyone who already has a copy of the branch
 217in their repository and tries to pull updates from you.  You should
 218understand the implications of using 'git rebase' on a repository that
 219you share.
 220
 221When the git rebase command is run, it will first execute a "pre-rebase"
 222hook if one exists.  You can use this hook to do sanity checks and
 223reject the rebase if it isn't appropriate.  Please see the template
 224pre-rebase hook script for an example.
 225
 226You must be in the top directory of your project to start (or continue)
 227a rebase.  Upon completion, <branch> will be the current branch.
 228
 229Author
 230------
 231Written by Junio C Hamano <junkio@cox.net>
 232
 233Documentation
 234--------------
 235Documentation by Junio C Hamano and the git-list <git@vger.kernel.org>.
 236
 237GIT
 238---
 239Part of the gitlink:git[7] suite
 240