reset: add an example of how to split a commit into two

It is often useful to break a commit into multiple parts that are more
logical separations. This can be tricky to learn how to do without the
brute-force method if re-writing code or commit messages from scratch.

Add a section to the git-reset documentation which shows an example
process for how to use git add -p and git commit -c HEAD@{1} to
interactively break a commit apart and re-use the original commit
message as a starting point when making the new commit message.

Signed-off-by: Jacob Keller <jacob.keller@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Jacob Keller 2017-02-03 12:28:33 -08:00 коммит произвёл Junio C Hamano
Родитель 6e3a7b3398
Коммит 7326451bed
1 изменённых файлов: 38 добавлений и 0 удалений

Просмотреть файл

@ -292,6 +292,44 @@ $ git reset --keep start <3>
<3> But you can use "reset --keep" to remove the unwanted commit after
you switched to "branch2".
Split a commit into two::
+
Suppose that you have created a commit, but later decide that you want to break
apart the changes into two logical chunks and commit each separately. You want
to include part of the original commit into the first commit, while including
the remainder in a second commit. You can use git reset to rewind the history
without changing the index, and then use git add -p to interactively select
which hunks to put into the first commit.
+
------------
$ git reset HEAD^ <1>
$ git add -p <2>
$ git diff --cached <3>
$ git commit -c HEAD@{1} <4>
...
$ git add ... <5>
$ git diff --cached <6>
$ git commit ... <7>
------------
+
<1> First, reset the history back one commit so that we remove the original
commit, but leave the working tree with all the changes.
<2> Now, interactively select hunks to add to a new commit using git add -p.
This will ask for each hunk separately and you can use simple commands like
"yes, include", "no don't include" or even "edit".
<3> Once satisfied with the hunks, you should verify that it is what you
expected by using git diff --cached to show all changes in the index.
<4> Next, commit the changes stored in the index. "-c" specifies to load the
editor with a commit message from a previous commit so that you can re-use the
original commit message. HEAD@{1} is special notation to reference what
HEAD used to be prior to the reset command. See linkgit:git-reflog[1] for
more details.
<5> Now you've created the first commit, and can repeat steps 2-4 as often as
you like to break the work into any number of commits. Here we show a second
step which simply adds the remaining changes.
<6> Then check again that the changes are what you expected to add.
<7> And finally commit the remaining changes.
DISCUSSION
----------