'\" t .\" Title: git-rebase .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.79.1 .\" Date: 09/28/2018 .\" Manual: Git Manual .\" Source: Git 2.11.0 .\" Language: English .\" .TH "GIT\-REBASE" "1" "09/28/2018" "Git 2\&.11\&.0" "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] [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 \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\&.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 If set to true enable \fB\-\-autostash\fR option by default\&. .RE .PP rebase\&.missingCommitsCheck .RS 4 If set to "warn", print warnings about removed commits in interactive mode\&. If set to "error", print the warnings and stop the rebase\&. If set to "ignore", no checking is done\&. "ignore" by default\&. .RE .PP rebase\&.instructionFormat .RS 4 Custom commit list format to use during an \fB\-\-interactive\fR rebase\&. .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 \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 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 \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\&. .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\&. .RE .PP \-f, \-\-force\-rebase .RS 4 Force a rebase even if the current branch is up\-to\-date and the command without \fB\-\-force\fR 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 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=