"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