将Git提交中的一些更改移动到单独的提交中。

5

我目前处于一个特性分支上,只有一次提交(这是通过交互式变基将所有提交压缩而来的结果)。

在推送到源并创建拉取请求之前,我决定从该提交中选取一部分变更(在文件级别上)并将其制作为第二个提交,因为它们是逻辑上分离的问题。我该如何做呢?

我想要分离出的更改从未在自己的提交中进行过,它只是作为我特性分支工作的第一次提交被捆绑在了一起。

2个回答

9

将一些Git提交中的更改移动到单独的提交中

简而言之:重置最后一个提交并创建2个新提交

如果我理解正确,你想保留原始提交中的大部分更改,并将其中的一小部分更改放入第二个提交中。 如果是这种情况,则首先要进行软重置最后一个提交(感谢@hvd的提示):

git reset --soft HEAD^

这将移除最后一个提交,但不移除更改,就像提交从未发生过一样,而所有更改都已暂存。此时,您希望取消暂存不需要在第一次提交中的文件。

您可以逐个取消暂存文件或按目录取消暂存,如下所示:

git reset -- path/to/file-or-dir

现在你可以为大部分(已暂存)的更改提交一次 commit,然后再为其余的更改提交第二次 commit。
如果你有一些文件,想要将其中一部分更改放到第一次 commit 中,另一部分更改放到第二次 commit 中,那么你可以先重置整个文件,然后使用 git add -p 有选择地暂存更改,就像这样:
git reset -- path/to/file
git add -p path/to/file
git add-p选项可以让您选择要暂存的hunks。请注意,您可以拆分hunks并对要暂存的行进行精细控制。
第一次提交后,您可以继续添加仍未暂存的更改。

1
这是正确的,但缺少一步:由于 OP 已经创建了一个提交,所以 OP 需要先删除该提交。可以使用 git reset --soft @^ 将所有内容保留为暂存更改,或者像 larsks 的答案中已经直接取消暂存。 - user743382
谢谢@hvd,其实我一开始误解了主要意图。在你的评论(和重新阅读)之后,我纠正了我的答案。 - janos
这真的很棒。谢谢!如果您有多个要还原HEAD的git提交(而不会丢失更改),则实际上可以执行多个git reset --soft HEAD^ - Melroy van den Berg

3
首先,请确保您的工作目录中没有任何未提交的更改。如果您有要保留的更改,请使用 git stash
使用 git reset 将存储库“后退”到上一个提交:
$ git reset HEAD^

这不会改变你的工作文件,但它将回滚存储库状态,以便该提交的任何内容现在都会显示为已修改。

现在,使用git add添加你希望成为单独提交的更改。一旦你的更改被暂存,使用git commit提交这些更改。

现在,添加所有其余的更改,然后再次提交。

现在,你已经将以前的单个提交分成了两个单独的提交。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接