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


当前回答

使用最新提交

如果您只想从现有提交中提取一些内容并保留原始提交,可以使用

git reset --patch HEAD^

而不是git reset HEAD^。此命令允许您重置所需的块。

选择要重置的块后,您将拥有将重置上一次提交中更改的分段块。现在,您更改最后一次提交,从中删除这些更改

git commit --amend --no-edit

您可以通过以下方式将未堆叠的块添加到单独的提交中

git add .
git commit -m "new commit"

不使用最新提交

当然,按照上面的建议,使用gitrebase——interactive来执行之前的一些提交。

离题事实:

在mercurial中,他们有hgsplit——我希望在git中看到hg吸收之后的第二个特性。

其他回答

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

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

编辑要从文件中删除的更改(即删除行或适当更改文件以适合首次提交)。您可以使用所选编辑器和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 reset-soft HEAD^。它类似于gitreset(默认为--mixed),但它保留了索引内容。因此,如果您添加/删除了文件,那么索引中已经有了这些文件。

事实证明,在大型犯罪的情况下非常有用。

现在,在Windows上的最新TortoiseGit中,您可以非常轻松地完成此操作。

打开rebase对话框,对其进行配置,然后执行以下步骤。

右键单击要拆分的提交,然后选择“编辑”(在拾取、挤压、删除…中)。单击“开始”开始重新定基。一旦到达提交拆分,请选中“编辑/拆分”按钮,然后直接点击“修正”。提交对话框打开。取消选择要单独提交的文件。编辑提交消息,然后单击“提交”。在有文件要提交之前,提交对话框将一次又一次打开。当没有更多的文件要提交时,它仍然会询问您是否要再添加一个提交。

非常有用,谢谢TortoiseGit!

在没有交互式重新基础的情况下,最容易做的事情是(可能)在要拆分的分支之前创建一个新的分支,然后在提交、重置、隐藏、提交文件移动、重新应用隐藏并提交更改,然后与前一个分支合并,或者在随后的提交中进行樱桃选择。(然后将以前的分支机构名称改为现在的负责人。)(也许最好遵循MBO的建议,并进行交互式重组。)

使用最新提交

如果您只想从现有提交中提取一些内容并保留原始提交,可以使用

git reset --patch HEAD^

而不是git reset HEAD^。此命令允许您重置所需的块。

选择要重置的块后,您将拥有将重置上一次提交中更改的分段块。现在,您更改最后一次提交,从中删除这些更改

git commit --amend --no-edit

您可以通过以下方式将未堆叠的块添加到单独的提交中

git add .
git commit -m "new commit"

不使用最新提交

当然,按照上面的建议,使用gitrebase——interactive来执行之前的一些提交。

离题事实:

在mercurial中,他们有hgsplit——我希望在git中看到hg吸收之后的第二个特性。