]> git.ipfire.org Git - thirdparty/git.git/blame - Documentation/git-rebase.txt
Documentation: avoid poor-man's small caps GIT
[thirdparty/git.git] / Documentation / git-rebase.txt
CommitLineData
215a7ad1
JH
1git-rebase(1)
2=============
7fc9d69f
JH
3
4NAME
5----
c3f0baac 6git-rebase - Forward-port local commits to the updated upstream head
7fc9d69f
JH
7
8SYNOPSIS
9--------
e448ff87 10[verse]
c2145384 11'git rebase' [-i | --interactive] [options] [--exec <cmd>] [--onto <newbase>]
15a147e6 12 [<upstream>] [<branch>]
0cd993a7 13'git rebase' [-i | --interactive] [options] [--exec <cmd>] [--onto <newbase>]
be496621 14 --root [<branch>]
eb9a7cb4 15'git rebase' --continue | --skip | --abort | --edit-todo
031321c6 16
7fc9d69f
JH
17DESCRIPTION
18-----------
0b444cdb 19If <branch> is specified, 'git rebase' will perform an automatic
5ca2db53
SP
20`git checkout <branch>` before doing anything else. Otherwise
21it remains on the current branch.
22
15a147e6
MZ
23If <upstream> is not specified, the upstream configured in
24branch.<name>.remote and branch.<name>.merge options will be used; see
25linkgit:git-config[1] for details. If you are currently not on any
26branch or if the current branch does not have a configured upstream,
27the rebase will abort.
28
5ca2db53
SP
29All changes made by commits in the current branch but that are not
30in <upstream> are saved to a temporary area. This is the same set
be496621
TR
31of commits that would be shown by `git log <upstream>..HEAD` (or
32`git log HEAD`, if --root is specified).
5ca2db53
SP
33
34The current branch is reset to <upstream>, or <newbase> if the
35--onto option was supplied. This has the exact same effect as
9869099b
BG
36`git reset --hard <upstream>` (or <newbase>). ORIG_HEAD is set
37to point at the tip of the branch before the reset.
5ca2db53
SP
38
39The commits that were previously saved into the temporary area are
ff905462
JK
40then reapplied to the current branch, one by one, in order. Note that
41any commits in HEAD which introduce the same textual changes as a commit
42in HEAD..<upstream> are omitted (i.e., a patch already accepted upstream
43with a different commit message or timestamp will be skipped).
69a60af5 44
031321c6
SE
45It is possible that a merge failure will prevent this process from being
46completely automatic. You will have to resolve any such merge failure
cc120056 47and run `git rebase --continue`. Another option is to bypass the commit
5960bc9d 48that caused the merge failure with `git rebase --skip`. To check out the
51ef1daa
JS
49original <branch> and remove the .git/rebase-apply working files, use the
50command `git rebase --abort` instead.
031321c6 51
69a60af5
CW
52Assume the following history exists and the current branch is "topic":
53
031321c6 54------------
69a60af5
CW
55 A---B---C topic
56 /
57 D---E---F---G master
031321c6 58------------
69a60af5 59
228382ae 60From this point, the result of either of the following commands:
69a60af5 61
031321c6 62
b1889c36
JN
63 git rebase master
64 git rebase master topic
69a60af5
CW
65
66would be:
67
031321c6 68------------
69a60af5
CW
69 A'--B'--C' topic
70 /
71 D---E---F---G master
031321c6 72------------
69a60af5 73
ee55703b
DN
74*NOTE:* The latter form is just a short-hand of `git checkout topic`
75followed by `git rebase master`. When rebase exits `topic` will
76remain the checked-out branch.
69a60af5 77
ff905462
JK
78If the upstream branch already contains a change you have made (e.g.,
79because you mailed a patch which was applied upstream), then that commit
b1889c36 80will be skipped. For example, running `git rebase master` on the
ff905462
JK
81following history (in which A' and A introduce the same set of changes,
82but have different committer information):
83
84------------
85 A---B---C topic
86 /
87 D---E---A'---F master
88------------
89
90will result in:
91
92------------
93 B'---C' topic
94 /
95 D---E---A'---F master
96------------
97
e52775f4
JN
98Here is how you would transplant a topic branch based on one
99branch to another, to pretend that you forked the topic branch
100from the latter branch, using `rebase --onto`.
69a60af5 101
e52775f4 102First let's assume your 'topic' is based on branch 'next'.
e2b850b2 103For example, a feature developed in 'topic' depends on some
e52775f4 104functionality which is found in 'next'.
69a60af5 105
031321c6 106------------
e52775f4
JN
107 o---o---o---o---o master
108 \
109 o---o---o---o---o next
110 \
111 o---o---o topic
112------------
113
e2b850b2
GD
114We want to make 'topic' forked from branch 'master'; for example,
115because the functionality on which 'topic' depends was merged into the
116more stable 'master' branch. We want our tree to look like this:
e52775f4
JN
117
118------------
119 o---o---o---o---o master
120 | \
121 | o'--o'--o' topic
122 \
123 o---o---o---o---o next
031321c6 124------------
7fc9d69f 125
e52775f4
JN
126We can get this using the following command:
127
b1889c36 128 git rebase --onto master next topic
e52775f4
JN
129
130
131Another example of --onto option is to rebase part of a
132branch. If we have the following situation:
133
134------------
135 H---I---J topicB
136 /
137 E---F---G topicA
138 /
139 A---B---C---D master
140------------
141
142then the command
143
b1889c36 144 git rebase --onto master topicA topicB
e52775f4
JN
145
146would result in:
147
148------------
149 H'--I'--J' topicB
150 /
151 | E---F---G topicA
152 |/
153 A---B---C---D master
154------------
155
156This is useful when topicB does not depend on topicA.
157
ea81fcc5
SP
158A range of commits could also be removed with rebase. If we have
159the following situation:
160
161------------
162 E---F---G---H---I---J topicA
163------------
164
165then the command
166
b1889c36 167 git rebase --onto topicA~5 topicA~3 topicA
ea81fcc5
SP
168
169would result in the removal of commits F and G:
170
171------------
172 E---H'---I'---J' topicA
173------------
174
175This is useful if F and G were flawed in some way, or should not be
176part of topicA. Note that the argument to --onto and the <upstream>
177parameter can be any valid commit-ish.
178
0b444cdb
TR
179In case of conflict, 'git rebase' will stop at the first problematic commit
180and leave conflict markers in the tree. You can use 'git diff' to locate
031321c6
SE
181the markers (<<<<<<) and make edits to resolve the conflict. For each
182file you edit, you need to tell git that the conflict has been resolved,
183typically this would be done with
184
185
d7f078b8 186 git add <filename>
031321c6
SE
187
188
189After resolving the conflict manually and updating the index with the
190desired resolution, you can continue the rebasing process with
191
192
193 git rebase --continue
8978d043 194
8978d043 195
0b444cdb 196Alternatively, you can undo the 'git rebase' with
8978d043 197
031321c6
SE
198
199 git rebase --abort
8978d043 200
a9c3821c
TAV
201CONFIGURATION
202-------------
203
204rebase.stat::
205 Whether to show a diffstat of what changed upstream since the last
206 rebase. False by default.
207
dd1e5b31
HV
208rebase.autosquash::
209 If set to true enable '--autosquash' option by default.
210
7fc9d69f
JH
211OPTIONS
212-------
c2145384 213--onto <newbase>::
69a60af5
CW
214 Starting point at which to create the new commits. If the
215 --onto option is not specified, the starting point is
ea81fcc5
SP
216 <upstream>. May be any valid commit, and not just an
217 existing branch name.
873c3472 218+
b9190e79 219As a special case, you may use "A\...B" as a shortcut for the
873c3472
MG
220merge base of A and B if there is exactly one merge base. You can
221leave out at most one of A and B, in which case it defaults to HEAD.
69a60af5 222
52a22d1e 223<upstream>::
ea81fcc5 224 Upstream branch to compare against. May be any valid commit,
15a147e6
MZ
225 not just an existing branch name. Defaults to the configured
226 upstream for the current branch.
7fc9d69f 227
228382ae 228<branch>::
52a22d1e 229 Working branch; defaults to HEAD.
7fc9d69f 230
031321c6
SE
231--continue::
232 Restart the rebasing process after having resolved a merge conflict.
233
234--abort::
5960bc9d
MZ
235 Abort the rebase operation and reset HEAD to the original
236 branch. If <branch> was provided when the rebase operation was
237 started, then HEAD will be reset to <branch>. Otherwise HEAD
238 will be reset to where it was when the rebase operation was
239 started.
031321c6 240
90e1818f
NH
241--keep-empty::
242 Keep the commits that do not change anything from its
243 parents in the result.
244
58634dbf
EW
245--skip::
246 Restart the rebasing process by skipping the current patch.
58634dbf 247
eb9a7cb4
AW
248--edit-todo::
249 Edit the todo list during an interactive rebase.
250
3240240f
SB
251-m::
252--merge::
58634dbf
EW
253 Use merging strategies to rebase. When the recursive (default) merge
254 strategy is used, this allows rebase to be aware of renames on the
255 upstream side.
31ddd1ee
TR
256+
257Note that a rebase merge works by replaying each commit from the working
258branch on top of the <upstream> branch. Because of this, when a merge
259conflict happens, the side reported as 'ours' is the so-far rebased
260series, starting with <upstream>, and 'theirs' is the working branch. In
261other words, the sides are swapped.
58634dbf 262
3240240f
SB
263-s <strategy>::
264--strategy=<strategy>::
06f39190 265 Use the given merge strategy.
0b444cdb 266 If there is no `-s` option 'git merge-recursive' is used
31ddd1ee
TR
267 instead. This implies --merge.
268+
0b444cdb 269Because 'git rebase' replays each commit from the working branch
31ddd1ee
TR
270on top of the <upstream> branch using the given strategy, using
271the 'ours' strategy simply discards all patches from the <branch>,
272which makes little sense.
58634dbf 273
93ce190c
ML
274-X <strategy-option>::
275--strategy-option=<strategy-option>::
276 Pass the <strategy-option> through to the merge strategy.
6cf378f0 277 This implies `--merge` and, if no strategy has been
93ce190c 278 specified, `-s recursive`. Note the reversal of 'ours' and
edfbbf7e 279 'theirs' as noted above for the `-m` option.
93ce190c 280
0e987a12
SB
281-q::
282--quiet::
283 Be quiet. Implies --no-stat.
284
3240240f
SB
285-v::
286--verbose::
a9c3821c
TAV
287 Be verbose. Implies --stat.
288
289--stat::
290 Show a diffstat of what changed upstream since the last rebase. The
291 diffstat is also controlled by the configuration option rebase.stat.
292
293-n::
294--no-stat::
295 Do not show a diffstat as part of the rebase process.
b758789c 296
fd631d58
NS
297--no-verify::
298 This option bypasses the pre-rebase hook. See also linkgit:githooks[5].
299
7baf9c4b
MZ
300--verify::
301 Allows the pre-rebase hook to run, which is the default. This option can
302 be used to override --no-verify. See also linkgit:githooks[5].
303
67dad687
MT
304-C<n>::
305 Ensure at least <n> lines of surrounding context match before
306 and after each change. When fewer lines of surrounding
307 context exist they all must match. By default no context is
308 ever ignored.
309
5e75d56f
MB
310-f::
311--force-rebase::
312 Force the rebase even if the current branch is a descendant
b4995494 313 of the commit you are rebasing onto. Normally non-interactive rebase will
5e75d56f
MB
314 exit with the message "Current branch is up to date" in such a
315 situation.
b4995494
MB
316 Incompatible with the --interactive option.
317+
318You may find this (or --no-ff with an interactive rebase) helpful after
319reverting a topic branch merge, as this option recreates the topic branch with
320fresh commits so it can be remerged successfully without needing to "revert
321the reversion" (see the
322link:howto/revert-a-faulty-merge.txt[revert-a-faulty-merge How-To] for details).
5e75d56f 323
86c91f91 324--ignore-whitespace::
749485f6 325--whitespace=<option>::
0b444cdb 326 These flag are passed to the 'git apply' program
5162e697 327 (see linkgit:git-apply[1]) that applies the patch.
7fe54385 328 Incompatible with the --interactive option.
059f446d 329
570ccad3
MB
330--committer-date-is-author-date::
331--ignore-date::
0b444cdb 332 These flags are passed to 'git am' to easily change the dates
570ccad3 333 of the rebased commits (see linkgit:git-am[1]).
56a05720 334 Incompatible with the --interactive option.
570ccad3 335
3240240f
SB
336-i::
337--interactive::
1b1dce4b 338 Make a list of the commits which are about to be rebased. Let the
f0fd889d
JS
339 user edit that list before rebasing. This mode can also be used to
340 split commits (see SPLITTING COMMITS below).
1b1dce4b 341
3240240f
SB
342-p::
343--preserve-merges::
f8cca019 344 Instead of ignoring merges, try to recreate them.
cddb42d2
JN
345+
346This uses the `--interactive` machinery internally, but combining it
347with the `--interactive` option explicitly is generally not a good
348idea unless you know what you are doing (see BUGS below).
349
c2145384
LK
350-x <cmd>::
351--exec <cmd>::
352 Append "exec <cmd>" after each line creating a commit in the
353 final history. <cmd> will be interpreted as one or more shell
354 commands.
355+
356This option can only be used with the `--interactive` option
357(see INTERACTIVE MODE below).
358+
359You may execute several commands by either using one instance of `--exec`
360with several commands:
361+
362 git rebase -i --exec "cmd1 && cmd2 && ..."
363+
364or by giving more than one `--exec`:
365+
366 git rebase -i --exec "cmd1" --exec "cmd2" --exec ...
367+
368If `--autosquash` is used, "exec" lines will not be appended for
369the intermediate commits, and will only appear at the end of each
370squash/fixup series.
f09c9b8c 371
be496621
TR
372--root::
373 Rebase all commits reachable from <branch>, instead of
374 limiting them with an <upstream>. This allows you to rebase
df5df20c 375 the root commit(s) on a branch. When used with --onto, it
be496621 376 will skip changes already contained in <newbase> (instead of
df5df20c
CW
377 <upstream>) whereas without --onto it will operate on every change.
378 When used together with both --onto and --preserve-merges,
379 'all' root commits will be rewritten to have <newbase> as parent
be496621
TR
380 instead.
381
f59baa50 382--autosquash::
dd1e5b31 383--no-autosquash::
f59baa50
NS
384 When the commit log message begins with "squash! ..." (or
385 "fixup! ..."), and there is a commit whose title begins with
386 the same ..., automatically modify the todo list of rebase -i
42cfcd20 387 so that the commit marked for squashing comes right after the
f59baa50
NS
388 commit to be modified, and change the action of the moved
389 commit from `pick` to `squash` (or `fixup`).
390+
b4995494 391This option is only valid when the '--interactive' option is used.
dd1e5b31
HV
392+
393If the '--autosquash' option is enabled by default using the
394configuration variable `rebase.autosquash`, this option can be
395used to override and disable this setting.
b4995494
MB
396
397--no-ff::
398 With --interactive, cherry-pick all rebased commits instead of
399 fast-forwarding over the unchanged ones. This ensures that the
400 entire history of the rebased branch is composed of new commits.
401+
402Without --interactive, this is a synonym for --force-rebase.
403+
404You may find this helpful after reverting a topic branch merge, as this option
405recreates the topic branch with fresh commits so it can be remerged
406successfully without needing to "revert the reversion" (see the
407link:howto/revert-a-faulty-merge.txt[revert-a-faulty-merge How-To] for details).
f59baa50 408
58634dbf
EW
409include::merge-strategies.txt[]
410
031321c6
SE
411NOTES
412-----
90d1c08e 413
0b444cdb 414You should understand the implications of using 'git rebase' on a
90d1c08e
TR
415repository that you share. See also RECOVERING FROM UPSTREAM REBASE
416below.
031321c6 417
467c0197 418When the git-rebase command is run, it will first execute a "pre-rebase"
031321c6
SE
419hook if one exists. You can use this hook to do sanity checks and
420reject the rebase if it isn't appropriate. Please see the template
421pre-rebase hook script for an example.
422
702088af 423Upon completion, <branch> will be the current branch.
031321c6 424
1b1dce4b
JS
425INTERACTIVE MODE
426----------------
427
428Rebasing interactively means that you have a chance to edit the commits
429which are rebased. You can reorder the commits, and you can
430remove them (weeding out bad or otherwise unwanted patches).
431
432The interactive mode is meant for this type of workflow:
433
4341. have a wonderful idea
4352. hack on the code
4363. prepare a series for submission
4374. submit
438
439where point 2. consists of several instances of
440
d3f2475c
NBL
441a) regular use
442
1b1dce4b
JS
443 1. finish something worthy of a commit
444 2. commit
d3f2475c
NBL
445
446b) independent fixup
447
1b1dce4b
JS
448 1. realize that something does not work
449 2. fix that
450 3. commit it
451
452Sometimes the thing fixed in b.2. cannot be amended to the not-quite
453perfect commit it fixes, because that commit is buried deeply in a
454patch series. That is exactly what interactive rebase is for: use it
455after plenty of "a"s and "b"s, by rearranging and editing
456commits, and squashing multiple commits into one.
457
458Start it with the last commit you want to retain as-is:
459
460 git rebase -i <after-this-commit>
461
462An editor will be fired up with all the commits in your current branch
463(ignoring merge commits), which come after the given commit. You can
464reorder the commits in this list to your heart's content, and you can
465remove them. The list looks more or less like this:
466
467-------------------------------------------
468pick deadbee The oneline of this commit
469pick fa1afe1 The oneline of the next commit
470...
471-------------------------------------------
472
0b444cdb 473The oneline descriptions are purely for your pleasure; 'git rebase' will
1b1dce4b
JS
474not look at them but at the commit names ("deadbee" and "fa1afe1" in this
475example), so do not delete or edit the names.
476
477By replacing the command "pick" with the command "edit", you can tell
0b444cdb 478'git rebase' to stop after applying that commit, so that you can edit
1b1dce4b
JS
479the files and/or the commit message, amend the commit, and continue
480rebasing.
481
6741aa6c
BG
482If you just want to edit the commit message for a commit, replace the
483command "pick" with the command "reword".
484
1b1dce4b 485If you want to fold two or more commits into one, replace the command
0205e72f
MH
486"pick" for the second and subsequent commits with "squash" or "fixup".
487If the commits had different authors, the folded commit will be
488attributed to the author of the first commit. The suggested commit
489message for the folded commit is the concatenation of the commit
490messages of the first commit and of those with the "squash" command,
491but omits the commit messages of commits with the "fixup" command.
1b1dce4b 492
0b444cdb 493'git rebase' will stop when "pick" has been replaced with "edit" or
6741aa6c
BG
494when a command fails due to merge errors. When you are done editing
495and/or resolving conflicts you can continue with `git rebase --continue`.
1b1dce4b
JS
496
497For example, if you want to reorder the last 5 commits, such that what
498was HEAD~4 becomes the new HEAD. To achieve that, you would call
0b444cdb 499'git rebase' like this:
1b1dce4b
JS
500
501----------------------
502$ git rebase -i HEAD~5
503----------------------
504
505And move the first patch to the end of the list.
506
f09c9b8c
JS
507You might want to preserve merges, if you have a history like this:
508
509------------------
510 X
511 \
512 A---M---B
513 /
514---o---O---P---Q
515------------------
516
517Suppose you want to rebase the side branch starting at "A" to "Q". Make
518sure that the current HEAD is "B", and call
519
520-----------------------------
521$ git rebase -i -p --onto Q O
522-----------------------------
523
cd035b1c
MM
524Reordering and editing commits usually creates untested intermediate
525steps. You may want to check that your history editing did not break
526anything by running a test, or at least recompiling at intermediate
527points in history by using the "exec" command (shortcut "x"). You may
528do so by creating a todo list like this one:
529
530-------------------------------------------
531pick deadbee Implement feature XXX
532fixup f1a5c00 Fix to feature XXX
533exec make
534pick c0ffeee The oneline of the next commit
535edit deadbab The oneline of the commit after
536exec cd subdir; make test
537...
538-------------------------------------------
539
540The interactive rebase will stop when a command fails (i.e. exits with
541non-0 status) to give you an opportunity to fix the problem. You can
542continue with `git rebase --continue`.
543
544The "exec" command launches the command in a shell (the one specified
545in `$SHELL`, or the default shell if `$SHELL` is not set), so you can
546use shell features (like "cd", ">", ";" ...). The command is run from
547the root of the working tree.
f0fd889d 548
c2145384
LK
549----------------------------------
550$ git rebase -i --exec "make test"
551----------------------------------
552
553This command lets you check that intermediate commits are compilable.
554The todo list becomes like that:
555
556--------------------
557pick 5928aea one
558exec make test
559pick 04d0fda two
560exec make test
561pick ba46169 three
562exec make test
563pick f4593f9 four
564exec make test
565--------------------
566
f0fd889d
JS
567SPLITTING COMMITS
568-----------------
569
570In interactive mode, you can mark commits with the action "edit". However,
0b444cdb 571this does not necessarily mean that 'git rebase' expects the result of this
f0fd889d
JS
572edit to be exactly one commit. Indeed, you can undo the commit, or you can
573add other commits. This can be used to split a commit into two:
574
483bc4f0 575- Start an interactive rebase with `git rebase -i <commit>^`, where
f0fd889d
JS
576 <commit> is the commit you want to split. In fact, any commit range
577 will do, as long as it contains that commit.
578
579- Mark the commit you want to split with the action "edit".
580
483bc4f0 581- When it comes to editing that commit, execute `git reset HEAD^`. The
f0fd889d
JS
582 effect is that the HEAD is rewound by one, and the index follows suit.
583 However, the working tree stays the same.
584
585- Now add the changes to the index that you want to have in the first
483bc4f0 586 commit. You can use `git add` (possibly interactively) or
0b444cdb 587 'git gui' (or both) to do that.
f0fd889d
JS
588
589- Commit the now-current index with whatever commit message is appropriate
590 now.
591
592- Repeat the last two steps until your working tree is clean.
593
483bc4f0 594- Continue the rebase with `git rebase --continue`.
f0fd889d
JS
595
596If you are not absolutely sure that the intermediate revisions are
597consistent (they compile, pass the testsuite, etc.) you should use
0b444cdb 598'git stash' to stash away the not-yet-committed changes
f0fd889d
JS
599after each commit, test, and amend the commit if fixes are necessary.
600
601
90d1c08e
TR
602RECOVERING FROM UPSTREAM REBASE
603-------------------------------
604
605Rebasing (or any other form of rewriting) a branch that others have
606based work on is a bad idea: anyone downstream of it is forced to
607manually fix their history. This section explains how to do the fix
608from the downstream's point of view. The real fix, however, would be
609to avoid rebasing the upstream in the first place.
610
611To illustrate, suppose you are in a situation where someone develops a
612'subsystem' branch, and you are working on a 'topic' that is dependent
613on this 'subsystem'. You might end up with a history like the
614following:
615
616------------
617 o---o---o---o---o---o---o---o---o master
618 \
619 o---o---o---o---o subsystem
620 \
621 *---*---* topic
622------------
623
624If 'subsystem' is rebased against 'master', the following happens:
625
626------------
627 o---o---o---o---o---o---o---o master
628 \ \
629 o---o---o---o---o o'--o'--o'--o'--o' subsystem
630 \
631 *---*---* topic
632------------
633
634If you now continue development as usual, and eventually merge 'topic'
635to 'subsystem', the commits from 'subsystem' will remain duplicated forever:
636
637------------
638 o---o---o---o---o---o---o---o master
639 \ \
640 o---o---o---o---o o'--o'--o'--o'--o'--M subsystem
641 \ /
642 *---*---*-..........-*--* topic
643------------
644
645Such duplicates are generally frowned upon because they clutter up
646history, making it harder to follow. To clean things up, you need to
647transplant the commits on 'topic' to the new 'subsystem' tip, i.e.,
648rebase 'topic'. This becomes a ripple effect: anyone downstream from
649'topic' is forced to rebase too, and so on!
650
651There are two kinds of fixes, discussed in the following subsections:
652
653Easy case: The changes are literally the same.::
654
655 This happens if the 'subsystem' rebase was a simple rebase and
656 had no conflicts.
657
658Hard case: The changes are not the same.::
659
660 This happens if the 'subsystem' rebase had conflicts, or used
6cf378f0
JK
661 `--interactive` to omit, edit, squash, or fixup commits; or
662 if the upstream used one of `commit --amend`, `reset`, or
90d1c08e
TR
663 `filter-branch`.
664
665
666The easy case
667~~~~~~~~~~~~~
668
669Only works if the changes (patch IDs based on the diff contents) on
670'subsystem' are literally the same before and after the rebase
671'subsystem' did.
672
0b444cdb 673In that case, the fix is easy because 'git rebase' knows to skip
90d1c08e
TR
674changes that are already present in the new upstream. So if you say
675(assuming you're on 'topic')
676------------
677 $ git rebase subsystem
678------------
679you will end up with the fixed history
680------------
681 o---o---o---o---o---o---o---o master
682 \
683 o'--o'--o'--o'--o' subsystem
684 \
685 *---*---* topic
686------------
687
688
689The hard case
690~~~~~~~~~~~~~
691
692Things get more complicated if the 'subsystem' changes do not exactly
693correspond to the ones before the rebase.
694
695NOTE: While an "easy case recovery" sometimes appears to be successful
696 even in the hard case, it may have unintended consequences. For
697 example, a commit that was removed via `git rebase
6cf378f0 698 --interactive` will be **resurrected**!
90d1c08e 699
0b444cdb 700The idea is to manually tell 'git rebase' "where the old 'subsystem'
90d1c08e
TR
701ended and your 'topic' began", that is, what the old merge-base
702between them was. You will have to find a way to name the last commit
703of the old 'subsystem', for example:
704
0b444cdb 705* With the 'subsystem' reflog: after 'git fetch', the old tip of
6cf378f0 706 'subsystem' is at `subsystem@{1}`. Subsequent fetches will
90d1c08e
TR
707 increase the number. (See linkgit:git-reflog[1].)
708
709* Relative to the tip of 'topic': knowing that your 'topic' has three
710 commits, the old tip of 'subsystem' must be `topic~3`.
711
712You can then transplant the old `subsystem..topic` to the new tip by
713saying (for the reflog case, and assuming you are on 'topic' already):
714------------
715 $ git rebase --onto subsystem subsystem@{1}
716------------
717
718The ripple effect of a "hard case" recovery is especially bad:
719'everyone' downstream from 'topic' will now have to perform a "hard
720case" recovery too!
721
cddb42d2
JN
722BUGS
723----
724The todo list presented by `--preserve-merges --interactive` does not
725represent the topology of the revision graph. Editing commits and
726rewording their commit messages should work fine, but attempts to
727reorder commits tend to produce counterintuitive results.
728
729For example, an attempt to rearrange
730------------
7311 --- 2 --- 3 --- 4 --- 5
732------------
733to
734------------
7351 --- 2 --- 4 --- 3 --- 5
736------------
737by moving the "pick 4" line will result in the following history:
738------------
739 3
740 /
7411 --- 2 --- 4 --- 5
742------------
743
7fc9d69f
JH
744GIT
745---
9e1f0a85 746Part of the linkgit:git[1] suite