/
D---E---F---G master
------------
*NOTE:* The latter form is just a short-hand of `git checkout topic`
followed by `git rebase master`. When rebase exits `topic` will
remain the checked-out branch.
If the upstream branch already contains a change you have made (e.g.,
because you mailed a patch which was applied upstream), then that commit
will be skipped and warnings will be issued (if the 'merge' backend is
used). For example, running `git rebase master` on the following
history (in which `A'` and `A` introduce the same set of changes, but
have different committer information):
------------
A---B---C topic
/
D---E---A'---F master
------------
will result in:
------------
B'---C' topic
/
D---E---A'---F master
------------
Here is how you would transplant a topic branch based on one
branch to another, to pretend that you forked the topic branch
from the latter branch, using `rebase --onto`.
First let's assume your 'topic' is based on branch 'next'.
For example, a feature developed in 'topic' depends on some
functionality which is found in 'next'.
------------
o---o---o---o---o master
\
o---o---o---o---o next
\
o---o---o topic
------------
We want to make 'topic' forked from branch 'master'; for example,
because the functionality on which 'topic' depends was merged into the
more stable 'master' branch. We want our tree to look like this:
------------
o---o---o---o---o master
| \
| o'--o'--o' topic
\
o---o---o---o---o next
------------
We can get this using the following command:
git rebase --onto master next topic
Another example of --onto option is to rebase part of a
branch. If we have the following situation:
------------
H---I---J topicB
/
E---F---G topicA
/
A---B---C---D master
------------
then the command
git rebase --onto master topicA topicB
would result in:
------------
H'--I'--J' topicB
/
| E---F---G topicA
|/
A---B---C---D master
------------
This is useful when topicB does not depend on topicA.
A range of commits could also be removed with rebase. If we have
the following situation:
------------
E---F---G---H---I---J topicA
------------
then the command
git rebase --onto topicA~5 topicA~3 topicA
would result in the removal of commits F and G:
------------
E---H'---I'---J' topicA
------------
This is useful if F and G were flawed in some way, or should not be
part of topicA. Note that the argument to `--onto` and the `<upstream>`
parameter can be any valid commit-ish.
In case of conflict, `git rebase` will stop at the first problematic commit
and leave conflict markers in the tree. You can use `git diff` to locate
the markers (<<<<<<) and make edits to resolve the conflict. For each
file you edit, you need to tell Git that the conflict has been resolved,
typically this would be done with
git add <filename>
After resolving the conflict manually and updating the index with the
desired resolution, you can continue the rebasing process with
git rebase --continue
Alternatively, you can undo the 'git rebase' with
git rebase --abort
MODE OPTIONS
------------
The options in this section cannot be used with any other option,
including not with each other:
--continue::
Restart the rebasing process after having resolved a merge conflict.
--skip::
Restart the rebasing process by skipping the current patch.
--abort::
Abort the rebase operation and reset HEAD to the original
branch. If `<branch>` was provided when the rebase operation was
started, then `HEAD` will be reset to `<branch>`. Otherwise `HEAD`
will be reset to where it was when the rebase operation