Home Explore Blog CI



git

2nd chunk of `Documentation/git-rebase.adoc`
66e360d0049bd9441adcfa9626f07a336c23d0a76b19f30f0000000100000fa0
        /
    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

Title: Git Rebase onto and Conflict Resolution
Summary
The git rebase command can be used with the --onto option to transplant a topic branch based on one branch to another, and to rebase part of a branch, or to remove a range of commits. In case of conflict, git rebase will stop and leave conflict markers, which can be resolved manually and then continued with git rebase --continue, or aborted with git rebase --abort.