小编典典

如何在 Git 中将最后一次提交拆分为两个

all

我有两个工作分支, masterforum ,我刚刚在 forum 分支中做了一些修改,我想挑选到 master
。但不幸的是,我想要挑选的提交也包含一些我不想要的修改。

解决方案可能是以某种方式删除错误的提交并将其替换为两个单独的提交,一个是我想在 master 中选择的更改,另一个是不属于那里的更改。

我试过做

git reset --hard HEAD^

它删除了所有更改,所以我不得不回去

git reset ORIG_HEAD

所以我的问题是,将 最后一次提交分成两个单独的提交 最佳方法是什么? __


阅读 89

收藏
2022-04-29

共1个答案

小编典典

你应该使用索引。在进行混合重置(“ 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
2022-04-29