如果不创建一个分支并在一个新分支上做一堆奇怪的工作,那么在将一个提交提交到本地存储库之后,是否有可能将其分解为几个不同的提交?


当前回答

如果您的更改主要是添加新内容,则此方法非常有用。

有时您不希望丢失与正在拆分的提交相关联的提交消息。如果您提交了一些要拆分的更改,可以:

编辑要从文件中删除的更改(即删除行或适当更改文件以适合首次提交)。您可以使用所选编辑器和gitcheckout-p HEAD^--path/to/file的组合将一些更改还原到当前树中。将此编辑作为新提交提交,使用类似gitadd的方式;gitcommit-m“删除以后应该更改的内容”,因此您将在历史中进行原始提交,并且还将进行另一次提交,其中包含您所做的更改,因此当前HEAD上的文件看起来就像您希望在拆分后的第一次提交中一样。

000aaa Original commit
000bbb removal of things that should be changed later

使用git-restore HEAD还原编辑,这将创建还原提交。文件将看起来像原始提交时一样,您的历史记录现在看起来像

000aaa Original commit
000bbb removal of things that should be changed later
000ccc Revert "removal of things that should be changed later" (assuming you didn't edit commit message immediately)

现在,您可以使用gitrebase-i将前两个提交压缩/修复为一个,如果您之前没有向其提供有意义的提交消息,则可以选择修改还原提交。你应该留下来

000ddd Original commit, but without some content that is changed later
000eee Things that should be changed later

其他回答

我认为我使用git rebase-I的最佳方式。我创建了一个视频,展示了拆分提交的步骤:https://www.youtube.com/watch?v=3EzOz7e1ADI

以下是如何在IntelliJ IDEA、PyCharm、PhpStorm等中拆分一个提交

在版本控制日志窗口中,选择要提交的拆分,右键单击并从此处选择“交互式回扣”将要拆分的对象标记为编辑对象,单击“开始”回扣您应该看到放置了一个黄色标记,表示HEAD已设置这一承诺。右键单击该提交,选择“撤消提交”现在这些提交返回到暂存区,您可以提交它们分别地在所有更改都已提交后,旧的提交变得不活动。

git rebase-我会做的。

首先,从一个干净的工作目录开始:git状态应该显示没有挂起的修改、删除或添加。

现在,您必须决定要拆分哪些提交。

A) 拆分最近的提交

要拆分最近的提交,首先:

$ git reset HEAD~

现在,以通常的方式单独提交这些片段,根据需要生成任意数量的提交。

B) 将提交拆分到更远的位置

这需要重新定基,即重写历史。要指定正确的提交,您有几个选项:

如果是三次提交,那么$git rebase-i头~3其中3是返回的提交数。如果它在树上比你想数的更远,那么$git rebase-i 123abcd~其中123abcd是要拆分的提交的SHA1。如果您位于要合并到主节点的其他分支(例如,要素分支)上:$git rebase-i主

当您获得rebase编辑屏幕时,找到您想要拆分的提交。在该行的开头,用edit(简称e)替换pick。保存缓冲区并退出。在您要编辑的提交之后,回扣将立即停止。然后:

$ git reset HEAD~

以通常的方式单独提交各个部分,根据需要生成多个提交。

最后

$ git rebase --continue

这已经过去8年多了,但也许有人会发现它对你有所帮助。我能够做到这一点,而不需要重新启动。其目的是将git引导到与git提交之前相同的状态:

# first rewind back (mind the dot,
# though it can be any valid path,
# for instance if you want to apply only a subset of the commit)
git reset --hard <previous-commit> .

# apply the changes
git checkout <commit-you-want-to-split>

# we're almost there, but the changes are in the index at the moment,
# hence one more step (exactly as git gently suggests):
# (use "git reset HEAD <file>..." to unstage)
git reset

在此之后,您将看到重置后的这些闪亮的未分级更改:并且您的回购处于一种即将提交所有这些文件的状态。从现在起,你可以像往常一样轻松地再次提交。希望这会有所帮助。

您可以执行交互式rebase git rebase-i。手册页完全符合您的要求:

http://git-scm.com/docs/git-rebase#_splitting_commits