如果不创建一个分支并在一个新分支上做一堆奇怪的工作,那么在将一个提交提交到本地存储库之后,是否有可能将其分解为几个不同的提交?
当前回答
使用最新提交
如果您只想从现有提交中提取一些内容并保留原始提交,可以使用
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吸收之后的第二个特性。
推荐文章
- 如何配置Mac OS X术语,使git有颜色?
- Visual Studio Code: .git文件夹/文件隐藏
- “node_modules”文件夹应该包含在git存储库中吗
- 为什么git-rebase给了我合并冲突,而我所做的只是压缩提交?
- 当我试图推到原点时,为什么Git告诉我“没有这样的远程‘原点’”?
- 如何从远程分支中挑选?
- 如何查看一个分支中的哪些提交不在另一个分支中?
- 如何取消在github上的拉请求?
- HEAD和master的区别
- GIT克隆在windows中跨本地文件系统回购
- RPC失败;卷度传输已关闭,剩余未完成的读取数据
- 我应该在.gitignore文件中添加Django迁移文件吗?
- 错误:您对以下文件的本地更改将被签出覆盖
- Git rebase—即使所有合并冲突都已解决,仍然会继续报错
- 在Git中,我如何知道我的当前版本是什么?