如何在已经提交更改后将一个提交分成两个提交?

3
我在u-boot中提交了一些更改(我将我的更改组织成了三个提交),现在我想将我的第一个提交拆分成两个独立的提交(这是由审阅者提出的)。 我有一个想法:
  1. 从远程克隆我的分支
  2. git reset --hard HEAD~3
  3. 重新完成我的更改,但这次要将它们组织成四个提交而不是三个。
  4. git push -f
我的问题是:在步骤2之后,我是否应该进行另一个 git push -f? 意思是顺序如下: 1. 从远程克隆我的分支 2. git reset --hard HEAD~3 3. git push -f (这是否必要,还是可以跳过继续重做我的更改然后再推送?) 4. 重新完成我的更改,但这次要将它们组织成四个提交而不是三个。 5. git push
提前感谢。

你想要拆分的提交是最新的还是在历史记录中更早的? - mnestorov
1
实际上是第一个,但我看到你已经回答了两种情况。谢谢! - Yordan
1个回答

2
您提出的策略是可行的,但您需要重新做一遍工作,这将增加您所有其他工作量之上的工作量。所以那不好。
根据您拥有的场景,您可以做以下事情。
  1. 如果您要拆分的提交是最新的提交(您最后一次提交),那么这很简单:
git reset HEAD^

这将重置您的最后一次提交,但您将保留所有更改在您的工作目录中。然后,您只需选择哪些更改要放入一个提交中,哪些更改要放入第二个提交中(从而将您的最后一次提交拆分为两个)。然后,您需要强制推送

  1. 如果要拆分的提交不是最新的提交,则情况会略微复杂。

首先,检出您想要拆分的提交:

git switch --detach <split-commit>

或者(老方法):
git checkout <split-commit>

然后重置您的更改(就像第一个场景中一样):
git reset HEAD^

将您的更改添加并提交到两个提交中。 现在,在这一点上,你已经成功地拆分了你想要的提交,但是哦不! 这一个顶部的其他提交怎么办? 你需要逐个挑选这些提交。 这些提交并没有丢失。 您仍然可以在您的 git log 甚至在您的 git reflog 中找到它们。 对于那些提交中的每一个,键入:

git cherry-pick <next-commit>

然后,你成功地将一个提交分成了两个。

现在还有一个问题。你所在的分支仍指向旧的提交。你只需要将该分支移动到新的提交上即可。因此,你可以执行以下操作:

git branch --force <branch> HEAD

或者:

git switch <branch>
git reset --hard <new-tip-commit>

或者(旧的方式):
git checkout <branch>
git reset --hard <new-tip-commit>

最后,强制推送你的分支,这样远程仓库就有了你的新提交,拆分!

非常好:git checkout <commit>将移动HEAD到指定的提交(但保持分支不变,即分离的HEAD),并相应地更新工作树和索引,然后git reset HEAD^将移动分离的HEAD(但保持分支不变,因为HEAD已经分离)到父提交,并相应地更新索引。由于分支未被更改,因此在拆分后要挑选的剩余提交不会丢失。 - Géry Ogam

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