git-rebase(1)
=============

NAME
----
git-rebase - Reapply commits on top of another base tip

SYNOPSIS
--------
[verse]
'git rebase' [-i | --interactive] [<options>] [--exec <cmd>]
	[--onto <newbase> | --keep-base] [<upstream> [<branch>]]
'git rebase' [-i | --interactive] [<options>] [--exec <cmd>] [--onto <newbase>]
	--root [<branch>]
'git rebase' (--continue|--skip|--abort|--quit|--edit-todo|--show-current-patch)

DESCRIPTION
-----------
Transplant a series of commits onto a different starting point.
You can also use `git rebase` to reorder or combine commits: see INTERACTIVE
MODE below for how to do that.

For example, imagine that you have been working on the `topic` branch in this
history, and you want to "catch up" to the work done on the `master` branch.

------------
          A---B---C topic
         /
    D---E---F---G master
------------

You want to transplant the commits you made on `topic` since it diverged from
`master` (i.e. A, B, and C), on top of the current `master`.  You can do this
by running `git rebase master` while the `topic` branch is checked out.  If you
want to rebase `topic` while on another branch, `git rebase master topic` is a
shortcut for `git checkout topic && git rebase master`.

------------
                  A'--B'--C' topic
                 /
    D---E---F---G master
------------


If there is a merge conflict during this process, `git rebase` will stop at the
first problematic commit and leave conflict markers. If this happens, you can do
one of these things:

1. Resolve the conflict. You can use `git diff` to find 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. You can mark the conflict as
   resolved with  `git add <filename>`. After resolving all of the conflicts,
   you can continue the rebasing process with

   git rebase --continue

2. Stop the `git rebase` and return your branch to its original state with

   git rebase --abort

3. Skip the commit that caused the merge conflict with

   git rebase --skip

If you don't specify an `<upstream>` to rebase onto, the upstream configured in
`branch.<name>.remote` and `branch.<name>.merge` options will be used (see
linkgit:git-config[1] for details) and the `--fork-point` option is
assumed.  If you are currently not on any branch or if the current
branch does not have a configured upstream, the rebase will abort.

Here is a simplified description of what `git rebase <upstream>` does:

1. Make a list of all commits on your current branch since it branched
   off from `<upstream>` that do not have an equivalent commit in
   `<upstream>`.
2. Check out `<upstream>` with the equivalent of
   `git checkout --detach <upstream>`.
3. Replay the commits, one by one, in order. This is similar to running
   `git cherry-pick <commit>` for each commit. See REBASING MERGES for how merges
   are handled.
4. Update your branch to point to the final commit with the equivalent
   of `git checkout -B <branch>`.

[NOTE]
When starting the rebase, `ORIG_HEAD` is set to point to the commit at the tip
of the to-be-rebased branch. However, `ORIG_HEAD` is not guaranteed to still
point to that commit at the end of the rebase if other commands that change
`ORIG_HEAD` (like `git reset`) are used during the rebase. The previous branch
tip, however, is accessible using the reflog of the current branch (i.e. `@{1}`,
see linkgit:gitrevisions[7].

TRANSPLANTING A TOPIC BRANCH WITH --ONTO
----------------------------------------

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.

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 was
	started.

--quit::
	Abort the rebase operation but `HEAD` is not reset back to the
	original branch. The index and working tree are also left
	unchanged as a result. If a temporary stash entry was created
	using `--autostash`, it will be saved to the stash list.

--edit-todo::
	Edit the todo list during an interactive rebase.

--show-current-patch::
	Show the current patch in an interactive rebase or when rebase
	is stopped because of conflicts. This is the equivalent of
	`git show REBASE_HEAD`.

OPTIONS
-------
--onto <newbase>::
	Starting point at which to create the new commits. If the
	`--onto` option is not specified, the starting point is
	`<upstream>`.  May be any valid commit, and not just an
	existing branch name.
+
As a special case, you may use "A\...B" as a shortcut for the
merge base of A and B if there is exactly one merge base. You can
leave out at most one of A and B, in which case it defaults to HEAD.

See TRANSPLANTING A TOPIC BRANCH WITH --ONTO above for examples.

--keep-base::
	Set the starting point at which to create the new commits to the
	merge base of `<upstream>` and `<branch>`. Running
	`git rebase --keep-base <upstream> <branch>` is equivalent to
	running
	`git rebase --reapply-cherry-picks --no-fork-point --onto <upstream>...<branch> <upstream> <branch>`.
+
This option is useful in the case where one is developing a feature on
top of an upstream branch. While the feature is being worked on, the
upstream branch may advance and it may not be the best idea to keep
rebasing on top of the upstream but to keep the base commit as-is. As
the base commit is unchanged this option implies `--reapply-cherry-picks`
to avoid losing commits.
+
Although both this option and `--fork-point` find the merge base between
`<upstream>` and `<branch>`, this option uses the merge base as the _starting
point_ on which new commits will be created, whereas `--fork-point` uses
the merge base to determine the _set of commits_ which will be rebased.
+
See also INCOMPATIBLE OPTIONS below.

<upstream>::
	Upstream branch to compare against.  May be any valid commit,
	not just an existing branch name. Defaults to the configured
	upstream for the current branch.

<branch>::
	Working branch; defaults to `HEAD`.

--apply::
	Use applying strategies to rebase (calling `git-am`
	internally).  This option may become a no-op in the future
	once the merge backend handles everything the apply one does.
+
See also INCOMPATIBLE OPTIONS below.

--empty=(drop|keep|stop)::
	How to handle commits that are not empty to start and are not
	clean cherry-picks of any upstream commit, but which become
	empty after rebasing (because they contain a subset of already
	upstream changes):
+
--
`drop`;;
	The commit will be dropped. This is the default behavior.
`keep`;;
	The commit will be kept. This option is implied when `--exec` is
	specified unless `-i`/`--interactive` is also specified.
`stop`;;
`ask`;;
	The rebase will halt when the commit is applied, allowing you to
	choose whether to drop it, edit files more, or just commit the empty
	changes. This option is implied when `-i`/`--interactive` is
	specified. `ask` is a deprecated synonym of `stop`.
--
+
Note that commits which start empty are kept (unless `--no-keep-empty`
is specified), and commits which are clean cherry-picks (as determined
by `git log --cherry-mark ...`) are detected and dropped as a
preliminary step (unless `--reapply-cherry-picks` or `--keep-base` is
passed).
+
See also INCOMPATIBLE OPTIONS below.

--no-keep-empty::
--keep-empty::
	Do not keep commits that start empty before the rebase
	(i.e. that do not change anything from its parent) in the
	result.  The default is to keep commits which start empty,
	since creating such commits requires passing the `--allow-empty`
	override flag to `git commit`, signifying that a user is very
	intentionally creating such a commit and thus wants to keep
	it.
+
Usage of this flag will probably be rare, since you can get rid of
commits that start empty by just firing up an interactive rebase and
removing the lines corresponding to the commits you don't want.  This
flag exists as a convenient shortcut, such as for cases where external
tools generate many empty commits and you want them all removed.
+
For commits which do not start empty but become empty after rebasing,
see the `--empty` flag.
+
See also INCOMPATIBLE OPTIONS below.

--reapply-cherry-picks::
--no-reapply-cherry-picks::
	Reapply all clean cherry-picks of any upstream commit instead
	of preemptively dropping them. (If these commits then become
	empty after rebasing, because they contain a subset of already
	upstream changes, the behavior towards them is controlled by
	the `--empty` flag.)
+
In the absence of `--keep-base` (or if `--no-reapply-cherry-picks` is
given), these commits will be automatically dropped.  Because this
necessitates reading all upstream commits, this can be expensive in
repositories with a large number of upstream commits that need to be
read. When using the 'merge' backend, warnings will be issued for each
dropped commit (unless `--quiet` is given). Advice will also be issued
unless `advice.skippedCherryPicks` is set to false (see
linkgit:git-config[1]).
+
`--reapply-cherry-picks` allows rebase to forgo reading all upstream
commits, potentially improving performance.
+
See also INCOMPATIBLE OPTIONS below.

--allow-empty-message::
	No-op.  Rebasing commits with an empty message used to fail
	and this option would override that behavior, allowing commits
	with empty messages to be rebased.  Now commits with an empty
	message do not cause rebasing to halt.
+
See also INCOMPATIBLE OPTIONS below.

-m::
--merge::
	Using merging strategies to rebase (default).
+
Note that a rebase merge works by replaying each commit from the working
branch on top of the `<upstream>` branch.  Because of this, when a merge
conflict happens, the side reported as 'ours' is the so-far rebased
series, starting with `<upstream>`, and 'theirs' is the working branch.
In other words, the sides are swapped.
+
See also INCOMPATIBLE OPTIONS below.

-s <strategy>::
--strategy=<strategy>::
	Use the given merge strategy, instead of the default `ort`.
	This implies `--merge`.
+
Because `git rebase` replays each commit from the working branch
on top of the `<upstream>` branch using the given strategy, using
the `ours` strategy simply empties all patches from the `<branch>`,
which makes little sense.
+
See also INCOMPATIBLE OPTIONS below.

-X <strategy-option>::
--strategy-option=<strategy-option>::
	Pass the <strategy-option> through to the merge strategy.
	This implies `--merge` and, if no strategy has been
	specified, `-s ort`.  Note the reversal of 'ours' and
	'theirs' as noted above for the `-m` option.
+
See also INCOMPATIBLE OPTIONS below.

include::rerere-options.adoc[]

-S[<keyid>]::
--gpg-sign[=<keyid>]::
--no-gpg-sign::
	GPG-sign commits. The `keyid` argument is optional and
	defaults to the committer identity; if specified, it must be
	stuck to the option without a space. `--no-gpg-sign` is useful to
	countermand both `commit.gpgSign` configuration variable, and
	earlier `--gpg-sign`.

-q::
--quiet::
	Be quiet. Implies `--no-stat`.

-v::
--verbose::
	Be verbose. Implies `--stat`.

--stat::
	Show a diffstat of what changed upstream since the last rebase. The
	diffstat is also controlled by the configuration option rebase.stat.

-n::
--no-stat::
	Do not show a diffstat as part of the rebase process.

--no-verify::
	This option bypasses the pre-rebase hook.  See also linkgit:githooks[5].

--verify::
	Allows the pre-rebase hook to run, which is the default.  This option can
	be used to override `--no-verify`.  See also linkgit:githooks[5].

-C<n>::
	Ensure at least `<n>` lines of surrounding context match before
	and after each change.  When fewer lines of surrounding
	context exist they all must match.  By default no context is
	ever ignored.  Implies `--apply`.
+
See also INCOMPATIBLE OPTIONS below.

--no-ff::
--force-rebase::
-f::
	Individually replay all rebased commits instead of fast-forwarding
	over the unchanged ones.  This ensures that the entire history of
	the rebased branch is composed of new commits.
+
You may find this helpful after reverting a topic branch merge, as this option
recreates the topic branch with fresh commits so it can be remerged
successfully without needing to "revert the reversion" (see the
link:howto/revert-a-faulty-merge.html[revert-a-faulty-merge How-To] for
details).

--fork-point::
--no-fork-point::
	Use reflog to find a better common ancestor between `<upstream>`
	and `<branch>` when calculating which commits have been
	introduced by `<branch>`.
+
When `--fork-point` is active, 'fork_point' will be used instead of
`<upstream>` to calculate the set of commits to rebase, where
'fork_point' is the result of `git merge-base --fork-point <upstream>
<branch>` command (see linkgit:git-merge-base[1]).  If 'fork_point'
ends up being empty, the `<upstream>` will be used as a fallback.
+
If `<upstream>` or `--keep-base` is given on the command line, then
the default is `--no-fork-point`, otherwise the default is
`--fork-point`. See also `rebase.forkpoint` in linkgit:git-config[1].
+
If your branch was based on `<upstream>` but `<upstream>` was rewound and
your branch contains commits which were dropped, this option can be used
with `--keep-base` in order to drop those commits from your branch.
+
See also INCOMPATIBLE OPTIONS below.

--ignore-whitespace::
	Ignore whitespace differences when trying to reconcile
	differences. Currently, each backend implements an approximation of
	this behavior:
+
apply backend;;
	When applying a patch, ignore changes in whitespace in context
	lines. Unfortunately, this means that if the "old" lines being
	replaced by the patch differ only in whitespace from the existing
	file, you will get a merge conflict instead of a successful patch
	application.
+
merge backend;;
	Treat lines with only whitespace changes as unchanged when merging.
	Unfortunately, this means that any patch hunks that were intended
	to modify whitespace and nothing else will be dropped, even if the
	other side had no changes that conflicted.

--whitespace=<option>::
	This flag is passed to the `git apply` program
	(see linkgit:git-apply[1]) that applies the patch.
	Implies `--apply`.
+
See also INCOMPATIBLE OPTIONS below.

--committer-date-is-author-date::
	Instead of using the current time as the committer date, use
	the author date of the commit being rebased as the committer
	date. This option implies `--force-rebase`.

--ignore-date::
--reset-author-date::
	Instead of using the author date of the original commit, use
	the current time as the	author date of the rebased commit.  This
	option implies `--force-rebase`.
+
See also INCOMPATIBLE OPTIONS below.

--signoff::
	Add a `Signed-off-by` trailer to all the rebased commits. Note
	that if `--interactive` is given then only commits marked to be
	picked, edited or reworded will have the trailer added.
+
See also INCOMPATIBLE OPTIONS below.

-i::
--interactive::
	Make a list of the commits which are about to be rebased.  Let the
	user edit that list before rebasing.  This mode can also be used to
	split commits (see SPLITTING COMMITS below).
+
The commit list format can be changed by setting the configuration option
rebase.instructionFormat.  A customized instruction format will automatically
have the commit hash prepended to the format.
+
See also INCOMPATIBLE OPTIONS below.

-r::
--rebase-merges[=(rebase-cousins|no-rebase-cousins)]::
--no-rebase-merges::
	By default, a rebase will simply drop merge commits from the todo
	list, and put the rebased commits into a single, linear branch.
	With `--rebase-merges`, the rebase will instead try to preserve
	the branching structure within the commits that are to be rebased,
	by recreating the merge commits. Any resolved merge conflicts or
	manual amendments in these merge commits will have to be
	resolved/re-applied manually. `--no-rebase-merges` can be used to
	countermand both the `rebase.rebaseMerges` config option and a previous
	`--rebase-merges`.
+
When rebasing merges, there are two modes: `rebase-cousins` and
`no-rebase-cousins`. If the mode is not specified, it defaults to
`no-rebase-cousins`. In `no-rebase-cousins` mode, commits which do not have
`<upstream>` as direct ancestor will keep their original branch point, i.e.
commits that would be excluded by linkgit:git-log[1]'s `--ancestry-path`
option will keep their original ancestry by default. In `rebase-cousins` mode,
such commits are instead rebased onto `<upstream>` (or `<onto>`, if
specified).
+
It is currently only possible to recreate the merge commits using the
`ort` merge strategy; different merge strategies can be used only via
explicit `exec git merge -s <strategy> [...]` commands.
+
See also REBASING MERGES and INCOMPATIBLE OPTIONS below.

-x <cmd>::
--exec <cmd>::
	Append "exec <cmd>" after each line creating a commit in the
	final history. `<cmd>` will be interpreted as one or more shell
	commands. Any command that fails will interrupt the rebase,
	with exit code 1.
+
You may execute several commands by either using one instance of `--exec`
with several commands:
+
	git rebase -i --exec "cmd1 && cmd2 && ..."
+
or by giving more than one `--exec`:
+
	git rebase -i --exec "cmd1" --exec "cmd2" --exec ...
+
If `--autosquash` is used, `exec` lines will not be appended for
the intermediate commits, and will only appear at the end of each
squash/fixup series.
+
This uses the `--interactive` machinery internally, but it can be run
without an explicit `--interactive`.
+
See also INCOMPATIBLE OPTIONS below.

--root::
	Rebase all commits reachable from `<branch>`, instead of
	limiting them with an `<upstream>`.  This allows you to rebase
	the root commit(s) on a branch.
+
See also INCOMPATIBLE OPTIONS below.

--autosquash::
--no-autosquash::
	Automatically squash commits with specially formatted messages into
	previous commits being rebased.  If a commit message starts with
	"squash! ", "fixup! " or "amend! ", the remainder of the title
	is taken as a commit specifier, which matches a previous commit if it
	matches the title or the hash of that commit.  If no commit
	matches fully, matches of the specifier with the start of commit
	titles are considered.
+
In the rebase todo list, the actions of squash, fixup and amend commits are
changed from `pick` to `squash`, `fixup` or `fixup -C`, respectively, and they
are moved right after the commit they modify.  The `--interactive` option can
be used to review and edit the todo list before proceeding.
+
The recommended way to create commits with squash markers is by using the
`--squash`, `--fixup`, `--fixup=amend:` or `--fixup=reword:` options of
linkgit:git-commit[1], which take the target commit as an argument and
automatically fill in the title of the new commit from that.
+
Setting configuration variable `rebase.autoSquash` to true enables
auto-squashing by default for interactive rebase.  The `--no-autosquash`
option can be used to override that setting.
+
See also INCOMPATIBLE OPTIONS below.

--autostash::
--no-autostash::
	Automatically create a temporary stash entry before the operation
	begins, and apply it after the operation ends.  This means
	that you can run rebase on a dirty worktree.  However, use
	with care: the final stash application after a successful
	rebase might result in non-trivial conflicts.

--reschedule-failed-exec::
--no-reschedule-failed-exec::
	Automatically reschedule `exec` commands that failed. This only makes
	sense in interactive mode (or when an `--exec` option was provided).
+
This option applies once a rebase is started. It is preserved for the whole
rebase based on, in order, the command line option provided to the initial `git
rebase`, the `rebase.rescheduleFailedExec` configuration (see
linkgit:git-config[1] or "CONFIGURATION" below), or it defaults to false.
+
Recording this option for the whole rebase is a convenience feature. Otherwise
an explicit `--no-reschedule-failed-exec` at the start would be overridden by
the presence of a `rebase.rescheduleFailedExec=true` configuration when `git
rebase --continue` is invoked. Currently, you cannot pass
`--[no-]reschedule-failed-exec` to `git rebase --continue`.

--update-refs::
--no-update-refs::
	Automatically force-update any branches that point to commits that
	are being rebased. Any branches that are checked out in a worktree
	are not updated in this way.
+
If the configuration variable `rebase.updateRefs` is set, then this option
can be used to override and disable this setting.
+
See also INCOMPATIBLE OPTIONS below.

INCOMPATIBLE OPTIONS
--------------------

The following options:

 * --apply
 * --whitespace
 * -C

are incompatible with the following options:

 * --merge
 * --strategy
 * --strategy-option
 * --autosquash
 * --rebase-merges
 * --interactive
 * --exec
 * --no-keep-empty
 * --empty=
 * --[no-]reapply-cherry-picks when used without --keep-base
 * --update-refs
 * --root when used without --onto

In addition, the following pairs of options are incompatible:

 * --keep-base and --onto
 * --keep-base and --root
 * --fork-point and --root

BEHAVIORAL DIFFERENCES
----------------------

`git rebase` has two primary backends: 'apply' and 'merge'.  (The 'apply'
backend used to be known as the 'am' backend, but the name led to
confusion as it looks like a verb instead of a noun.  Also, the 'merge'
backend used to be known as the interactive backend, but it is now
used for non-interactive cases as well.  Both were renamed based on
lower-level functionality that underpinned each.) There are some
subtle differences in how these two backends behave:

Empty commits
~~~~~~~~~~~~~

The 'apply' backend unfortunately drops intentionally empty commits, i.e.
commits that started empty, though these are rare in practice.  It
also drops commits that become empty and has no option for controlling
this behavior.

The 'merge' backend keeps intentionally empty commits by default (though
with `-i` they are marked as empty in the todo list editor, or they can
be dropped automatically with `--no-keep-empty`).

Similar to the apply backend, by default the merge backend drops
commits that become empty unless `-i`/`--interactive` is specified (in
which case it stops and asks the user what to do).  The merge backend
also has an `--empty=(drop|keep|stop)` option for changing the behavior
of handling commits that become empty.

Directory rename detection
~~~~~~~~~~~~~~~~~~~~~~~~~~

Due to the lack of accurate tree information (arising from
constructing fake ancestors with the limited information available in
patches), directory rename detection is disabled in the 'apply' backend.
Disabled directory rename detection means that if one side of history
renames a directory and the other adds new files to the old directory,
then the new files will be left behind in the old directory without
any warning at the time of rebasing that you may want to move these
files into the new directory.

Directory rename detection works with the 'merge' backend to provide you
warnings in such cases.

Context
~~~~~~~

The 'apply' backend works by creating a sequence of patches (by calling
`format-patch` internally), and then applying the patches in sequence
(calling `am` internally).  Patches are composed of multiple hunks,
each with line numbers, a context region, and the actual changes.  The
line numbers have to be taken with some offset, since the other side
will likely have inserted or deleted lines earlier in the file.  The
context region is meant to help find how to adjust the line numbers in
order to apply the changes to the right lines.  However, if multiple
areas of the code have the same surrounding lines of context, the
wrong one can be picked.  There are real-world cases where this has
caused commits to be reapplied incorrectly with no conflicts reported.
Setting `diff.context` to a larger value may prevent such types of
problems, but increases the chance of spurious conflicts (since it
will require more lines of matching context to apply).

The 'merge' backend works with a full copy of each relevant file,
insulating it from these types of problems.

Labelling of conflicts markers
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

When there are content conflicts, the merge machinery tries to
annotate each side's conflict markers with the commits where the
content came from.  Since the 'apply' backend drops the original
information about the rebased commits and their parents (and instead
generates new fake commits based off limited information in the
generated patches), those commits cannot be identified; instead it has
to fall back to a commit summary.  Also, when `merge.conflictStyle` is
set to `diff3` or `zdiff3`, the 'apply' backend will use "constructed merge
base" to label the content from the merge base, and thus provide no
information about the merge base commit whatsoever.

The 'merge' backend works with the full commits on both sides of history
and thus has no such limitations.

Hooks
~~~~~

The 'apply' backend has not traditionally called the post-commit hook,
while the 'merge' backend has.  Both have called the post-checkout hook,
though the 'merge' backend has squelched its output.  Further, both
backends only call the post-checkout hook with the starting point
commit of the rebase, not the intermediate commits nor the final
commit.  In each case, the calling of these hooks was by accident of
implementation rather than by design (both backends were originally
implemented as shell scripts and happened to invoke other commands
like `git checkout` or `git commit` that would call the hooks).  Both
backends should have the same behavior, though it is not entirely
clear which, if any, is correct.  We will likely make rebase stop
calling either of these hooks in the future.

Interruptability
~~~~~~~~~~~~~~~~

The 'apply' backend has safety problems with an ill-timed interrupt; if
the user presses Ctrl-C at the wrong time to try to abort the rebase,
the rebase can enter a state where it cannot be aborted with a
subsequent `git rebase --abort`.  The 'merge' backend does not appear to
suffer from the same shortcoming.  (See
https://lore.kernel.org/git/20200207132152.GC2868@szeder.dev/ for
details.)

Commit Rewording
~~~~~~~~~~~~~~~~

When a conflict occurs while rebasing, rebase stops and asks the user
to resolve.  Since the user may need to make notable changes while
resolving conflicts, after conflicts are resolved and the user has run
`git rebase --continue`, the rebase should open an editor and ask the
user to update the commit message.  The 'merge' backend does this, while
the 'apply' backend blindly applies the original commit message.

Miscellaneous differences
~~~~~~~~~~~~~~~~~~~~~~~~~

There are a few more behavioral differences that most folks would
probably consider inconsequential but which are mentioned for
completeness:

* Reflog: The two backends will use different wording when describing
  the changes made in the reflog, though both will make use of the
  word "rebase".

* Progress, informational, and error messages: The two backends
  provide slightly different progress and informational messages.
  Also, the apply backend writes error messages (such as "Your files
  would be overwritten...") to stdout, while the merge backend writes
  them to stderr.

* State directories: The two backends keep their state in different
  directories under `.git/`

include::merge-strategies.adoc[]

NOTES
-----

You should understand the implications of using `git rebase` on a
repository that you share.  See also RECOVERING FROM UPSTREAM REBASE
below.

When the rebase is run, it will first execute a `pre-rebase` hook if one
exists.  You can use this hook to do sanity checks and reject the rebase
if it isn't appropriate.  Please see the template `pre-rebase` hook script
for an example.

Upon completion, `<branch>` will be the current branch.

INTERACTIVE MODE
----------------

Rebasing interactively means that you have a chance to edit the commits
which are rebased.  You can reorder the commits, and you can
remove them (weeding out bad or otherwise unwanted patches).

The interactive mode is meant for this type of workflow:

1. have a wonderful idea
2. hack on the code
3. prepare a series for submission
4. submit

where point 2. consists of several instances of

a) regular use

 1. finish something worthy of a commit
 2. commit

b) independent fixup

 1. realize that something does not work
 2. fix that
 3. commit it

Sometimes the thing fixed in b.2. cannot be amended to the not-quite
perfect commit it fixes, because that commit is buried deeply in a
patch series.  That is exactly what interactive rebase is for: use it
after plenty of "a"s and "b"s, by rearranging and editing
commits, and squashing multiple commits into one.

Start it with the last commit you want to retain as-is:

	git rebase -i <after-this-commit>

An editor will be fired up with all the commits in your current branch
(ignoring merge commits), which come after the given commit.  You can
reorder the commits in this list to your heart's content, and you can
remove them.  The list looks more or less like this:

-------------------------------------------
pick deadbee The oneline of this commit
pick fa1afe1 The oneline of the next commit
...
-------------------------------------------

The oneline descriptions are purely for your pleasure; 'git rebase' will
not look at them but at the commit names ("deadbee" and "fa1afe1" in this
example), so do not delete or edit the names.

By replacing the command "pick" with the command "edit", you can tell
`git rebase` to stop after applying that commit, so that you can edit
the files and/or the commit message, amend the commit, and continue
rebasing.

To interrupt the rebase (just like an "edit" command would do, but without
cherry-picking any commit first), use the "break" command.

If you just want to edit the commit message for a commit, replace the
command "pick" with the command "reword".

To drop a commit, replace the command "pick" with "drop", or just
delete the matching line.

If you want to fold two or more commits into one, replace the command
"pick" for the second and subsequent commits with "squash" or "fixup".
If the commits had different authors, the folded commit will be
attributed to the author of the first commit.  The suggested commit
message for the folded commit is the concatenation of the first
commit's message with those identified by "squash" commands, omitting the
messages of commits identified by "fixup" commands, unless "fixup -c"
is used.  In that case the suggested commit message is only the message
of the "fixup -c" commit, and an editor is opened allowing you to edit
the message.  The contents (patch) of the "fixup -c" commit are still
incorporated into the folded commit. If there is more than one "fixup -c"
commit, the message from the final one is used.  You can also use
"fixup -C" to get the same behavior as "fixup -c" except without opening
an editor.

`git rebase` will stop when "pick" has been replaced with "edit" or
when a command fails due to merge errors. When you are done editing
and/or resolving conflicts you can continue with `git rebase --continue`.

For example, if you want to reorder the last 5 commits, such that what
was `HEAD~4` becomes the new `HEAD`. To achieve that, you would call
`git rebase` like this:

----------------------
$ git rebase -i HEAD~5
----------------------

And move the first patch to the end of the list.

You might want to recreate merge commits, e.g. if you have a history
like this:

------------------
           X
            \
         A---M---B
        /
---o---O---P---Q
------------------

Suppose you want to rebase the side branch starting at "A" to "Q". Make
sure that the current `HEAD` is "B", and call

-----------------------------
$ git rebase -i -r --onto Q O
-----------------------------

Reordering and editing commits usually creates untested intermediate
steps.  You may want to check that your history editing did not break
anything by running a test, or at least recompiling at intermediate
points in history by using the "exec" command (shortcut "x").  You may
do so by creating a todo list like this one:

-------------------------------------------
pick deadbee Implement feature XXX
fixup f1a5c00 Fix to feature XXX
exec make
pick c0ffeee The oneline of the next commit
edit deadbab The oneline of the commit after
exec cd subdir; make test
...
-------------------------------------------

The interactive rebase will stop when a command fails (i.e. exits with
non-0 status) to give you an opportunity to fix the problem. You can
continue with `git rebase --continue`.

The "exec" command launches the command in a shell (the default one, usually
/bin/sh), so you can use shell features (like "cd", ">", ";" ...). The command
is run from the root of the working tree.

----------------------------------
$ git rebase -i --exec "make test"
----------------------------------

This command lets you check that intermediate commits are compilable.
The todo list becomes like that:

--------------------
pick 5928aea one
exec make test
pick 04d0fda two
exec make test
pick ba46169 three
exec make test
pick f4593f9 four
exec make test
--------------------

SPLITTING COMMITS
-----------------

In interactive mode, you can mark commits with the action "edit".  However,
this does not necessarily mean that `git rebase` expects the result of this
edit to be exactly one commit.  Indeed, you can undo the commit, or you can
add other commits.  This can be used to split a commit into two:

- Start an interactive rebase with `git rebase -i <commit>^`, where
  `<commit>` is the commit you want to split.  In fact, any commit range
  will do, as long as it contains that commit.

- Mark the commit you want to split with the action "edit".

- When it comes to editing that commit, execute `git reset HEAD^`.  The
  effect is that the `HEAD` is rewound by one, and the index follows suit.
  However, the working tree stays the same.

- Now add the changes to the index that you want to have in the first
  commit.  You can use `git add` (possibly interactively) or
  `git gui` (or both) to do that.

- Commit the now-current index with whatever commit message is appropriate
  now.

- Repeat the last two steps until your working tree is clean.

- Continue the rebase with `git rebase --continue`.

If you are not absolutely sure that the intermediate revisions are
consistent (they compile, pass the testsuite, etc.) you should use
`git stash` to stash away the not-yet-committed changes
after each commit, test, and amend the commit if fixes are necessary.


RECOVERING FROM UPSTREAM REBASE
-------------------------------

Rebasing (or any other form of rewriting) a branch that others have
based work on is a bad idea: anyone downstream of it is forced to
manually fix their history.  This section explains how to do the fix
from the downstream's point of view.  The real fix, however, would be
to avoid rebasing the upstream in the first place.

To illustrate, suppose you are in a situation where someone develops a
'subsystem' branch, and you are working on a 'topic' that is dependent
on this 'subsystem'.  You might end up with a history like the
following:

------------
    o---o---o---o---o---o---o---o  master
	 \
	  o---o---o---o---o  subsystem
			   \
			    *---*---*  topic
------------

If 'subsystem' is rebased against 'master', the following happens:

------------
    o---o---o---o---o---o---o---o  master
	 \			 \
	  o---o---o---o---o	  o'--o'--o'--o'--o'  subsystem
			   \
			    *---*---*  topic
------------

If you now continue development as usual, and eventually merge 'topic'
to 'subsystem', the commits from 'subsystem' will remain duplicated forever:

------------
    o---o---o---o---o---o---o---o  master
	 \			 \
	  o---o---o---o---o	  o'--o'--o'--o'--o'--M	 subsystem
			   \			     /
			    *---*---*-..........-*--*  topic
------------

Such duplicates are generally frowned upon because they clutter up
history, making it harder to follow.  To clean things up, you need to
transplant the commits on 'topic' to the new 'subsystem' tip, i.e.,
rebase 'topic'.  This becomes a ripple effect: anyone downstream from
'topic' is forced to rebase too, and so on!

There are two kinds of fixes, discussed in the following subsections:

Easy case: The changes are literally the same.::

	This happens if the 'subsystem' rebase was a simple rebase and
	had no conflicts.

Hard case: The changes are not the same.::

	This happens if the 'subsystem' rebase had conflicts, or used
	`--interactive` to omit, edit, squash, or fixup commits; or
	if the upstream used one of `commit --amend`, `reset`, or
	a full history rewriting command like
	https://github.com/newren/git-filter-repo[`filter-repo`].


The easy case
~~~~~~~~~~~~~

Only works if the changes (patch IDs based on the diff contents) on
'subsystem' are literally the same before and after the rebase
'subsystem' did.

In that case, the fix is easy because 'git rebase' knows to skip
changes that are already present in the new upstream (unless
`--reapply-cherry-picks` is given). So if you say
(assuming you're on 'topic')

------------
    $ git rebase subsystem
------------
you will end up with the fixed history

------------
    o---o---o---o---o---o---o---o  master
				 \
				  o'--o'--o'--o'--o'  subsystem
						   \
						    *---*---*  topic
------------


The hard case
~~~~~~~~~~~~~

Things get more complicated if the 'subsystem' changes do not exactly
correspond to the ones before the rebase.

NOTE: While an "easy case recovery" sometimes appears to be successful
      even in the hard case, it may have unintended consequences.  For
      example, a commit that was removed via `git rebase
      --interactive` will be **resurrected**!

The idea is to manually tell `git rebase` "where the old 'subsystem'
ended and your 'topic' began", that is, what the old merge base
between them was.  You will have to find a way to name the last commit
of the old 'subsystem', for example:

* With the 'subsystem' reflog: after `git fetch`, the old tip of
  'subsystem' is at `subsystem@{1}`.  Subsequent fetches will
  increase the number.  (See linkgit:git-reflog[1].)

* Relative to the tip of 'topic': knowing that your 'topic' has three
  commits, the old tip of 'subsystem' must be `topic~3`.

You can then transplant the old `subsystem..topic` to the new tip by
saying (for the reflog case, and assuming you are on 'topic' already):

------------
    $ git rebase --onto subsystem subsystem@{1}
------------

The ripple effect of a "hard case" recovery is especially bad:
'everyone' downstream from 'topic' will now have to perform a "hard
case" recovery too!

REBASING MERGES
---------------

The interactive rebase command was originally designed to handle
individual patch series. As such, it makes sense to exclude merge
commits from the todo list, as the developer may have merged the
then-current `master` while working on the branch, only to rebase
all the commits onto `master` eventually (skipping the merge
commits).

However, there are legitimate reasons why a developer may want to
recreate merge commits: to keep the branch structure (or "commit
topology") when working on multiple, inter-related branches.

In the following example, the developer works on a topic branch that
refactors the way buttons are defined, and on another topic branch
that uses that refactoring to implement a "Report a bug" button. The
output of `git log --graph --format=%s -5` may look like this:

------------
*   Merge branch 'report-a-bug'
|\
| * Add the feedback button
* | Merge branch 'refactor-button'
|\ \
| |/
| * Use the Button class for all buttons
| * Extract a generic Button class from the DownloadButton one
------------

The developer might want to rebase those commits to a newer `master`
while keeping the branch topology, for example when the first topic
branch is expected to be integrated into `master` much earlier than the
second one, say, to resolve merge conflicts with changes to the
DownloadButton class that made it into `master`.

This rebase can be performed using the `--rebase-merges` option.
It will generate a todo list looking like this:

------------
label onto

# Branch: refactor-button
reset onto
pick 123456 Extract a generic Button class from the DownloadButton one
pick 654321 Use the Button class for all buttons
label refactor-button

# Branch: report-a-bug
reset refactor-button # Use the Button class for all buttons
pick abcdef Add the feedback button
label report-a-bug

reset onto
merge -C a1b2c3 refactor-button # Merge 'refactor-button'
merge -C 6f5e4d report-a-bug # Merge 'report-a-bug'
------------

In contrast to a regular interactive rebase, there are `label`, `reset`
and `merge` commands in addition to `pick` ones.

The `label` command associates a label with the current HEAD when that
command is executed. These labels are created as worktree-local refs
(`refs/rewritten/<label>`) that will be deleted when the rebase
finishes. That way, rebase operations in multiple worktrees linked to
the same repository do not interfere with one another. If the `label`
command fails, it is rescheduled immediately, with a helpful message how
to proceed.

The `reset` command resets the HEAD, index and worktree to the specified
revision. It is similar to an `exec git reset --hard <label>`, but
refuses to overwrite untracked files. If the `reset` command fails, it is
rescheduled immediately, with a helpful message how to edit the todo list
(this typically happens when a `reset` command was inserted into the todo
list manually and contains a typo).

The `merge` command will merge the specified revision(s) into whatever
is HEAD at that time. With `-C <original-commit>`, the commit message of
the specified merge commit will be used. When the `-C` is changed to
a lower-case `-c`, the message will be opened in an editor after a
successful merge so that the user can edit the message.

If a `merge` command fails for any reason other than merge conflicts (i.e.
when the merge operation did not even start), it is rescheduled immediately.

By default, the `merge` command will use the `ort` merge strategy for
regular merges, and `octopus` for octopus merges.  One can specify a
default strategy for all merges using the `--strategy` argument when
invoking rebase, or can override specific merges in the interactive
list of commands by using an `exec` command to call `git merge`
explicitly with a `--strategy` argument.  Note that when calling `git
merge` explicitly like this, you can make use of the fact that the
labels are worktree-local refs (the ref `refs/rewritten/onto` would
correspond to the label `onto`, for example) in order to refer to the
branches you want to merge.

Note: the first command (`label onto`) labels the revision onto which
the commits are rebased; The name `onto` is just a convention, as a nod
to the `--onto` option.

It is also possible to introduce completely new merge commits from scratch
by adding a command of the form `merge <merge-head>`. This form will
generate a tentative commit message and always open an editor to let the
user edit it. This can be useful e.g. when a topic branch turns out to
address more than a single concern and wants to be split into two or
even more topic branches. Consider this todo list:

------------
pick 192837 Switch from GNU Makefiles to CMake
pick 5a6c7e Document the switch to CMake
pick 918273 Fix detection of OpenSSL in CMake
pick afbecd http: add support for TLS v1.3
pick fdbaec Fix detection of cURL in CMake on Windows
------------

The one commit in this list that is not related to CMake may very well
have been motivated by working on fixing all those bugs introduced by
switching to CMake, but it addresses a different concern. To split this
branch into two topic branches, the todo list could be edited like this:

------------
label onto

pick afbecd http: add support for TLS v1.3
label tlsv1.3

reset onto
pick 192837 Switch from GNU Makefiles to CMake
pick 918273 Fix detection of OpenSSL in CMake
pick fdbaec Fix detection of cURL in CMake on Windows
pick 5a6c7e Document the switch to CMake
label cmake

reset onto
merge tlsv1.3
merge cmake
------------

CONFIGURATION
-------------

include::includes/cmd-config-section-all.adoc[]

include::config/rebase.adoc[]
include::config/sequencer.adoc[]

GIT
---
Part of the linkgit:git[1] suite
