'\" t
.\" Title: git-rebase
.\" Author: [FIXME: author] [see http://docbook.sf.net/el/author]
.\" Generator: DocBook XSL Stylesheets v1.79.1
.\" Date: 01/05/2019
.\" Manual: Git Manual
.\" Source: Git 2.20.1
.\" Language: English
.\"
.TH "GIT\-REBASE" "1" "01/05/2019" "Git 2\&.20\&.1" "Git Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.\" http://bugs.debian.org/507673
.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html
.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
.\" disable hyphenation
.nh
.\" disable justification (adjust text to left margin only)
.ad l
.\" -----------------------------------------------------------------
.\" * MAIN CONTENT STARTS HERE *
.\" -----------------------------------------------------------------
.SH "NAME"
git-rebase \- Reapply commits on top of another base tip
.SH "SYNOPSIS"
.sp
.nf
\fIgit rebase\fR [\-i | \-\-interactive] [] [\-\-exec ] [\-\-onto ]
[ []]
\fIgit rebase\fR [\-i | \-\-interactive] [] [\-\-exec ] [\-\-onto ]
\-\-root []
\fIgit rebase\fR \-\-continue | \-\-skip | \-\-abort | \-\-quit | \-\-edit\-todo | \-\-show\-current\-patch
.fi
.sp
.SH "DESCRIPTION"
.sp
If is specified, \fIgit rebase\fR will perform an automatic \fBgit checkout \fR before doing anything else\&. Otherwise it remains on the current branch\&.
.sp
If is not specified, the upstream configured in branch\&.\&.remote and branch\&.\&.merge options will be used (see \fBgit-config\fR(1) for details) and the \fB\-\-fork\-point\fR 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\&.
.sp
All changes made by commits in the current branch but that are not in are saved to a temporary area\&. This is the same set of commits that would be shown by \fBgit log \&.\&.HEAD\fR; or by \fBgit log \*(Aqfork_point\*(Aq\&.\&.HEAD\fR, if \fB\-\-fork\-point\fR is active (see the description on \fB\-\-fork\-point\fR below); or by \fBgit log HEAD\fR, if the \fB\-\-root\fR option is specified\&.
.sp
The current branch is reset to , or if the \-\-onto option was supplied\&. This has the exact same effect as \fBgit reset \-\-hard \fR (or )\&. ORIG_HEAD is set to point at the tip of the branch before the reset\&.
.sp
The commits that were previously saved into the temporary area are then reapplied to the current branch, one by one, in order\&. Note that any commits in HEAD which introduce the same textual changes as a commit in HEAD\&.\&. are omitted (i\&.e\&., a patch already accepted upstream with a different commit message or timestamp will be skipped)\&.
.sp
It is possible that a merge failure will prevent this process from being completely automatic\&. You will have to resolve any such merge failure and run \fBgit rebase \-\-continue\fR\&. Another option is to bypass the commit that caused the merge failure with \fBgit rebase \-\-skip\fR\&. To check out the original and remove the \&.git/rebase\-apply working files, use the command \fBgit rebase \-\-abort\fR instead\&.
.sp
Assume the following history exists and the current branch is "topic":
.sp
.if n \{\
.RS 4
.\}
.nf
A\-\-\-B\-\-\-C topic
/
D\-\-\-E\-\-\-F\-\-\-G master
.fi
.if n \{\
.RE
.\}
.sp
.sp
From this point, the result of either of the following commands:
.sp
.if n \{\
.RS 4
.\}
.nf
git rebase master
git rebase master topic
.fi
.if n \{\
.RE
.\}
.sp
would be:
.sp
.if n \{\
.RS 4
.\}
.nf
A\*(Aq\-\-B\*(Aq\-\-C\*(Aq topic
/
D\-\-\-E\-\-\-F\-\-\-G master
.fi
.if n \{\
.RE
.\}
.sp
.sp
\fBNOTE:\fR The latter form is just a short\-hand of \fBgit checkout topic\fR followed by \fBgit rebase master\fR\&. When rebase exits \fBtopic\fR will remain the checked\-out branch\&.
.sp
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\&. For example, running \fBgit rebase master\fR on the following history (in which \fBA\*(Aq\fR and \fBA\fR introduce the same set of changes, but have different committer information):
.sp
.if n \{\
.RS 4
.\}
.nf
A\-\-\-B\-\-\-C topic
/
D\-\-\-E\-\-\-A\*(Aq\-\-\-F master
.fi
.if n \{\
.RE
.\}
.sp
.sp
will result in:
.sp
.if n \{\
.RS 4
.\}
.nf
B\*(Aq\-\-\-C\*(Aq topic
/
D\-\-\-E\-\-\-A\*(Aq\-\-\-F master
.fi
.if n \{\
.RE
.\}
.sp
.sp
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 \fBrebase \-\-onto\fR\&.
.sp
First let\(cqs assume your \fItopic\fR is based on branch \fInext\fR\&. For example, a feature developed in \fItopic\fR depends on some functionality which is found in \fInext\fR\&.
.sp
.if n \{\
.RS 4
.\}
.nf
o\-\-\-o\-\-\-o\-\-\-o\-\-\-o master
\e
o\-\-\-o\-\-\-o\-\-\-o\-\-\-o next
\e
o\-\-\-o\-\-\-o topic
.fi
.if n \{\
.RE
.\}
.sp
.sp
We want to make \fItopic\fR forked from branch \fImaster\fR; for example, because the functionality on which \fItopic\fR depends was merged into the more stable \fImaster\fR branch\&. We want our tree to look like this:
.sp
.if n \{\
.RS 4
.\}
.nf
o\-\-\-o\-\-\-o\-\-\-o\-\-\-o master
| \e
| o\*(Aq\-\-o\*(Aq\-\-o\*(Aq topic
\e
o\-\-\-o\-\-\-o\-\-\-o\-\-\-o next
.fi
.if n \{\
.RE
.\}
.sp
.sp
We can get this using the following command:
.sp
.if n \{\
.RS 4
.\}
.nf
git rebase \-\-onto master next topic
.fi
.if n \{\
.RE
.\}
.sp
Another example of \-\-onto option is to rebase part of a branch\&. If we have the following situation:
.sp
.if n \{\
.RS 4
.\}
.nf
H\-\-\-I\-\-\-J topicB
/
E\-\-\-F\-\-\-G topicA
/
A\-\-\-B\-\-\-C\-\-\-D master
.fi
.if n \{\
.RE
.\}
.sp
.sp
then the command
.sp
.if n \{\
.RS 4
.\}
.nf
git rebase \-\-onto master topicA topicB
.fi
.if n \{\
.RE
.\}
.sp
would result in:
.sp
.if n \{\
.RS 4
.\}
.nf
H\*(Aq\-\-I\*(Aq\-\-J\*(Aq topicB
/
| E\-\-\-F\-\-\-G topicA
|/
A\-\-\-B\-\-\-C\-\-\-D master
.fi
.if n \{\
.RE
.\}
.sp
.sp
This is useful when topicB does not depend on topicA\&.
.sp
A range of commits could also be removed with rebase\&. If we have the following situation:
.sp
.if n \{\
.RS 4
.\}
.nf
E\-\-\-F\-\-\-G\-\-\-H\-\-\-I\-\-\-J topicA
.fi
.if n \{\
.RE
.\}
.sp
.sp
then the command
.sp
.if n \{\
.RS 4
.\}
.nf
git rebase \-\-onto topicA~5 topicA~3 topicA
.fi
.if n \{\
.RE
.\}
.sp
would result in the removal of commits F and G:
.sp
.if n \{\
.RS 4
.\}
.nf
E\-\-\-H\*(Aq\-\-\-I\*(Aq\-\-\-J\*(Aq topicA
.fi
.if n \{\
.RE
.\}
.sp
.sp
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 parameter can be any valid commit\-ish\&.
.sp
In case of conflict, \fIgit rebase\fR will stop at the first problematic commit and leave conflict markers in the tree\&. You can use \fIgit diff\fR 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
.sp
.if n \{\
.RS 4
.\}
.nf
git add
.fi
.if n \{\
.RE
.\}
.sp
After resolving the conflict manually and updating the index with the desired resolution, you can continue the rebasing process with
.sp
.if n \{\
.RS 4
.\}
.nf
git rebase \-\-continue
.fi
.if n \{\
.RE
.\}
.sp
Alternatively, you can undo the \fIgit rebase\fR with
.sp
.if n \{\
.RS 4
.\}
.nf
git rebase \-\-abort
.fi
.if n \{\
.RE
.\}
.SH "CONFIGURATION"
.PP
rebase\&.useBuiltin
.RS 4
Set to
\fBfalse\fR
to use the legacy shellscript implementation of
\fBgit-rebase\fR(1)\&. Is
\fBtrue\fR
by default, which means use the built\-in rewrite of it in C\&.
.sp
The C rewrite is first included with Git version 2\&.20\&. This option serves an an escape hatch to re\-enable the legacy version in case any bugs are found in the rewrite\&. This option and the shellscript version of
\fBgit-rebase\fR(1)
will be removed in some future release\&.
.sp
If you find some reason to set this option to
\fBfalse\fR
other than one\-off testing you should report the behavior difference as a bug in git\&.
.RE
.PP
rebase\&.stat
.RS 4
Whether to show a diffstat of what changed upstream since the last rebase\&. False by default\&.
.RE
.PP
rebase\&.autoSquash
.RS 4
If set to true enable
\fB\-\-autosquash\fR
option by default\&.
.RE
.PP
rebase\&.autoStash
.RS 4
When set to true, 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\&. This option can be overridden by the
\fB\-\-no\-autostash\fR
and
\fB\-\-autostash\fR
options of
\fBgit-rebase\fR(1)\&. Defaults to false\&.
.RE
.PP
rebase\&.missingCommitsCheck
.RS 4
If set to "warn", git rebase \-i will print a warning if some commits are removed (e\&.g\&. a line was deleted), however the rebase will still proceed\&. If set to "error", it will print the previous warning and stop the rebase,
\fIgit rebase \-\-edit\-todo\fR
can then be used to correct the error\&. If set to "ignore", no checking is done\&. To drop a commit without warning or error, use the
\fBdrop\fR
command in the todo list\&. Defaults to "ignore"\&.
.RE
.PP
rebase\&.instructionFormat
.RS 4
A format string, as specified in
\fBgit-log\fR(1), to be used for the todo list during an interactive rebase\&. The format will automatically have the long commit hash prepended to the format\&.
.RE
.PP
rebase\&.abbreviateCommands
.RS 4
If set to true,
\fBgit rebase\fR
will use abbreviated command names in the todo list resulting in something like this:
.sp
.if n \{\
.RS 4
.\}
.nf
p deadbee The oneline of the commit
p fa1afe1 The oneline of the next commit
\&.\&.\&.
.fi
.if n \{\
.RE
.\}
.sp
instead of:
.sp
.if n \{\
.RS 4
.\}
.nf
pick deadbee The oneline of the commit
pick fa1afe1 The oneline of the next commit
\&.\&.\&.
.fi
.if n \{\
.RE
.\}
.sp
Defaults to false\&.
.RE
.SH "OPTIONS"
.PP
\-\-onto
.RS 4
Starting point at which to create the new commits\&. If the \-\-onto option is not specified, the starting point is \&. May be any valid commit, and not just an existing branch name\&.
.sp
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\&.
.RE
.PP
.RS 4
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\&.
.RE
.PP
.RS 4
Working branch; defaults to HEAD\&.
.RE
.PP
\-\-continue
.RS 4
Restart the rebasing process after having resolved a merge conflict\&.
.RE
.PP
\-\-abort
.RS 4
Abort the rebase operation and reset HEAD to the original branch\&. If was provided when the rebase operation was started, then HEAD will be reset to \&. Otherwise HEAD will be reset to where it was when the rebase operation was started\&.
.RE
.PP
\-\-quit
.RS 4
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\&.
.RE
.PP
\-\-keep\-empty
.RS 4
Keep the commits that do not change anything from its parents in the result\&.
.sp
See also INCOMPATIBLE OPTIONS below\&.
.RE
.PP
\-\-allow\-empty\-message
.RS 4
By default, rebasing commits with an empty message will fail\&. This option overrides that behavior, allowing commits with empty messages to be rebased\&.
.sp
See also INCOMPATIBLE OPTIONS below\&.
.RE
.PP
\-\-skip
.RS 4
Restart the rebasing process by skipping the current patch\&.
.RE
.PP
\-\-edit\-todo
.RS 4
Edit the todo list during an interactive rebase\&.
.RE
.PP
\-\-show\-current\-patch
.RS 4
Show the current patch in an interactive rebase or when rebase is stopped because of conflicts\&. This is the equivalent of
\fBgit show REBASE_HEAD\fR\&.
.RE
.PP
\-m, \-\-merge
.RS 4
Use merging strategies to rebase\&. When the recursive (default) merge strategy is used, this allows rebase to be aware of renames on the upstream side\&.
.sp
Note that a rebase merge works by replaying each commit from the working branch on top of the branch\&. Because of this, when a merge conflict happens, the side reported as
\fIours\fR
is the so\-far rebased series, starting with , and
\fItheirs\fR
is the working branch\&. In other words, the sides are swapped\&.
.sp
See also INCOMPATIBLE OPTIONS below\&.
.RE
.PP
\-s , \-\-strategy=
.RS 4
Use the given merge strategy\&. If there is no
\fB\-s\fR
option
\fIgit merge\-recursive\fR
is used instead\&. This implies \-\-merge\&.
.sp
Because
\fIgit rebase\fR
replays each commit from the working branch on top of the branch using the given strategy, using the
\fIours\fR
strategy simply empties all patches from the , which makes little sense\&.
.sp
See also INCOMPATIBLE OPTIONS below\&.
.RE
.PP
\-X , \-\-strategy\-option=
.RS 4
Pass the through to the merge strategy\&. This implies
\fB\-\-merge\fR
and, if no strategy has been specified,
\fB\-s recursive\fR\&. Note the reversal of
\fIours\fR
and
\fItheirs\fR
as noted above for the
\fB\-m\fR
option\&.
.sp
See also INCOMPATIBLE OPTIONS below\&.
.RE
.PP
\-S[], \-\-gpg\-sign[=]
.RS 4
GPG\-sign commits\&. The
\fBkeyid\fR
argument is optional and defaults to the committer identity; if specified, it must be stuck to the option without a space\&.
.RE
.PP
\-q, \-\-quiet
.RS 4
Be quiet\&. Implies \-\-no\-stat\&.
.RE
.PP
\-v, \-\-verbose
.RS 4
Be verbose\&. Implies \-\-stat\&.
.RE
.PP
\-\-stat
.RS 4
Show a diffstat of what changed upstream since the last rebase\&. The diffstat is also controlled by the configuration option rebase\&.stat\&.
.RE
.PP
\-n, \-\-no\-stat
.RS 4
Do not show a diffstat as part of the rebase process\&.
.RE
.PP
\-\-no\-verify
.RS 4
This option bypasses the pre\-rebase hook\&. See also
\fBgithooks\fR(5)\&.
.RE
.PP
\-\-verify
.RS 4
Allows the pre\-rebase hook to run, which is the default\&. This option can be used to override \-\-no\-verify\&. See also
\fBgithooks\fR(5)\&.
.RE
.PP
\-C
.RS 4
Ensure at least 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\&.
.sp
See also INCOMPATIBLE OPTIONS below\&.
.RE
.PP
\-\-no\-ff, \-\-force\-rebase, \-f
.RS 4
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\&.
.sp
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
\m[blue]\fBrevert\-a\-faulty\-merge How\-To\fR\m[]\&\s-2\u[1]\d\s+2
for details)\&.
.RE
.PP
\-\-fork\-point, \-\-no\-fork\-point
.RS 4
Use reflog to find a better common ancestor between and when calculating which commits have been introduced by \&.
.sp
When \-\-fork\-point is active,
\fIfork_point\fR
will be used instead of to calculate the set of commits to rebase, where
\fIfork_point\fR
is the result of
\fBgit merge\-base \-\-fork\-point \fR
command (see
\fBgit-merge-base\fR(1))\&. If
\fIfork_point\fR
ends up being empty, the will be used as a fallback\&.
.sp
If either or \-\-root is given on the command line, then the default is
\fB\-\-no\-fork\-point\fR, otherwise the default is
\fB\-\-fork\-point\fR\&.
.RE
.PP
\-\-ignore\-whitespace, \-\-whitespace=