如果不创建一个分支并在一个新分支上做一堆奇怪的工作,那么在将一个提交提交到本地存储库之后,是否有可能将其分解为几个不同的提交?
当前回答
以下是如何在IntelliJ IDEA、PyCharm、PhpStorm等中拆分一个提交
在版本控制日志窗口中,选择要提交的拆分,右键单击并从此处选择“交互式回扣”将要拆分的对象标记为编辑对象,单击“开始”回扣您应该看到放置了一个黄色标记,表示HEAD已设置这一承诺。右键单击该提交,选择“撤消提交”现在这些提交返回到暂存区,您可以提交它们分别地在所有更改都已提交后,旧的提交变得不活动。
其他回答
如果您的更改主要是添加新内容,则此方法非常有用。
有时您不希望丢失与正在拆分的提交相关联的提交消息。如果您提交了一些要拆分的更改,可以:
编辑要从文件中删除的更改(即删除行或适当更改文件以适合首次提交)。您可以使用所选编辑器和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
在没有交互式重新基础的情况下,最容易做的事情是(可能)在要拆分的分支之前创建一个新的分支,然后在提交、重置、隐藏、提交文件移动、重新应用隐藏并提交更改,然后与前一个分支合并,或者在随后的提交中进行樱桃选择。(然后将以前的分支机构名称改为现在的负责人。)(也许最好遵循MBO的建议,并进行交互式重组。)
以下是如何在IntelliJ IDEA、PyCharm、PhpStorm等中拆分一个提交
在版本控制日志窗口中,选择要提交的拆分,右键单击并从此处选择“交互式回扣”将要拆分的对象标记为编辑对象,单击“开始”回扣您应该看到放置了一个黄色标记,表示HEAD已设置这一承诺。右键单击该提交,选择“撤消提交”现在这些提交返回到暂存区,您可以提交它们分别地在所有更改都已提交后,旧的提交变得不活动。
使用最新提交
如果您只想从现有提交中提取一些内容并保留原始提交,可以使用
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吸收之后的第二个特性。
您可以执行交互式rebase git rebase-i。手册页完全符合您的要求:
http://git-scm.com/docs/git-rebase#_splitting_commits
推荐文章
- 为什么我需要显式地推一个新分支?
- 如何撤消最后的git添加?
- Rubymine:如何让Git忽略Rubymine创建的.idea文件
- Gitignore二进制文件,没有扩展名
- Git隐藏错误:Git隐藏弹出并最终与合并冲突
- 了解Git和GitHub的基础知识
- 没有。Git目录的Git克隆
- Git与Mercurial仓库的互操作性
- 忽略git中修改(但未提交)的文件?
- “git restore”命令是什么?“git restore”和“git reset”之间有什么区别?
- Git合并与强制覆盖
- Git拉另一个分支
- 在Bash命令提示符上添加git分支
- 如何更改Git日志日期格式
- git pull -rebase和git pull -ff-only之间的区别