您应该使用索引。完成混合重置(“ git reset HEAD ^”)之后,将第一组更改添加到索引中,然后提交它们。然后提交其余的。
您可以使用“ git add ”将文件中所做的所有更改放入索引。如果您不想暂存文件中所做的所有修改,只需其中一部分修改,则可以使用“ git add -p”。
让我们来看一个例子。假设我有一个名为myfile的文件,其中包含以下文本:
something
something else
something again
我在上一次提交中对其进行了修改,因此现在看起来像这样:
1
something
something else
something again
2
现在,我决定将其分为两部分,并希望第一行的插入在第一次提交中,而最后一行的插入在第二次提交中。
首先,我回到HEAD的父级,但是我想将修改保留在文件系统中,所以我使用不带参数的“ git reset”(这将执行所谓的“混合”重置):
$ git reset HEAD^
myfile: locally modified
$ cat myfile
1
something
something else
something again
2
现在,我使用“ git add -p”将要提交的更改添加到索引(=我暂存它们)。“ git add -p”是一个交互式工具,询问您文件应添加到索引中后会发生什么更改。
$ git add -p myfile
diff --git a/myfile b/myfile
index 93db4cb..2f113ce 100644
--- a/myfile
+++ b/myfile
@@ -1,3 +1,5 @@
+1
something
something else
something again
+2
Stage this hunk [y,n,a,d,/,s,e,?]? s # split this section into two!
Split into 2 hunks.
@@ -1,3 +1,4 @@
+1
something
something else
something again
Stage this hunk [y,n,a,d,/,j,J,g,e,?]? y # yes, I want to stage this
@@ -1,3 +2,4 @@
something
something else
something again
+2
Stage this hunk [y,n,a,d,/,K,g,e,?]? n # no, I don't want to stage this
然后我提交第一个更改:
$ git commit -m "Added first line"
[master cef3d4e] Added first line
1 files changed, 1 insertions(+), 0 deletions(-)
现在,我可以提交所有其他更改(即最后一行中的数字“ 2”):
$ git commit -am "Added last line"
[master 5e284e6] Added last line
1 files changed, 1 insertions(+), 0 deletions(-)
让我们检查日志以查看我们拥有哪些提交:
$ git log -p -n2 | cat
Commit 5e284e652f5e05a47ad8883d9f59ed9817be59d8
Author: ...
Date: ...
Added last line
Diff --git a/myfile b/myfile
Index f9e1a67..2f113ce 100644
--- a/myfile
+++ b/myfile
@@ -2,3 +2,4 @@
something
something else
something again
+2
Commit cef3d4e0298dd5d279a911440bb72d39410e7898
Author: ...
Date: ...
Added first line
Diff --git a/myfile b/myfile
Index 93db4cb..f9e1a67 100644
--- a/myfile
+++ b/myfile
@@ -1,3 +1,4 @@
+1
something
something else
something again
git reset [--patch|-p] <commit>
,您可以使用它来省去git add -p
复位后的麻烦。我对吗?使用git 1.7.9.5。