'\" t
.\" Title: git-rebase
.\" Author: [FIXME: author] [see http://docbook.sf.net/el/author]
.\" Generator: DocBook XSL Stylesheets v1.78.1
.\" Date: 05/28/2018
.\" Manual: Git Manual
.\" Source: Git 2.1.4
.\" Language: English
.\"
.TH "GIT\-REBASE" "1" "05/28/2018" "Git 2\&.1\&.4" "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 \- Forward\-port local commits to the updated upstream head
.SH "SYNOPSIS"
.sp
.nf
\fIgit rebase\fR [\-i | \-\-interactive] [options] [\-\-exec ] [\-\-onto ]
[ []]
\fIgit rebase\fR [\-i | \-\-interactive] [options] [\-\-exec ] [\-\-onto ]
\-\-root []
\fIgit rebase\fR \-\-continue | \-\-skip | \-\-abort | \-\-edit\-todo
.fi
.sp
.SH "DESCRIPTION"
.sp
If is specified, \fIgit rebase\fR will perform an automatic git checkout 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\&. 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 git log \&.\&.HEAD (or git log HEAD, if \-\-root is specified)\&.
.sp
The current branch is reset to , or if the \-\-onto option was supplied\&. This has the exact same effect as git reset \-\-hard (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 git rebase \-\-continue\&. Another option is to bypass the commit that caused the merge failure with git rebase \-\-skip\&. To check out the original and remove the \&.git/rebase\-apply working files, use the command git rebase \-\-abort 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 git checkout topic followed by git rebase master\&. When rebase exits topic 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 \(oqgit rebase master` on the following history (in which A\(cq and A 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 rebase \-\-onto\&.
.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\&.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
\fI\-\-autosquash\fR
option by default\&.
.RE
.PP
rebase\&.autostash
.RS 4
If set to true enable
\fI\-\-autostash\fR
option by default\&.
.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
\-\-keep\-empty
.RS 4
Keep the commits that do not change anything from its parents in the result\&.
.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
\-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\&.
.RE
.PP
\-s , \-\-strategy=
.RS 4
Use the given merge strategy\&. If there is no
\-s
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 discards all patches from the , which makes little sense\&.
.RE
.PP
\-X , \-\-strategy\-option=
.RS 4
Pass the through to the merge strategy\&. This implies
\-\-merge
and, if no strategy has been specified,
\-s recursive\&. Note the reversal of
\fIours\fR
and
\fItheirs\fR
as noted above for the
\-m
option\&.
.RE
.PP
\-S[], \-\-gpg\-sign[=]
.RS 4
GPG\-sign commits\&.
.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\&.
.RE
.PP
\-f, \-\-force\-rebase
.RS 4
Force a rebase even if the current branch is up\-to\-date and the command without
\-\-force
would return without doing anything\&.
.sp
You may find this (or \-\-no\-ff with an interactive rebase) 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
\fIgit merge\-base \-\-fork\-point\fR
to find a better common ancestor between
upstream
and
branch
when calculating which commits have have been introduced by
branch
(see
\fBgit-merge-base\fR(1))\&.
.sp
If no non\-option arguments are given on the command line, then the default is
\-\-fork\-point @{u}
otherwise the
upstream
argument is interpreted literally unless the
\-\-fork\-point
option is specified\&.
.RE
.PP
\-\-ignore\-whitespace, \-\-whitespace=