git - 在我已经提交更改后,如何将提交分成两部分
问题描述
我向 u-boot 提交了一些更改(我在三个提交中组织了我的更改),现在我想将我的第一个提交拆分为两个单独的提交(这是由审阅者提出的)。这是我想到的:
- 从远程克隆我的分支
- git reset --hard HEAD~3
- 重做我的更改,但这次将它们组织成四个提交而不是 3 个。
- git 推送 -f
我的疑问是我应该在第 2 步之后再添加一个 git push -f 吗?意思是顺序如下: 1. 从远程克隆我的分支 2. git reset --hard HEAD~3 3. git push -f (这是必要的,或者我可以跳过这个并继续重做我的更改然后推送?)。4. 重做我的更改,但这次将它们组织成四个提交而不是 3. 5. git push
提前致谢。
解决方案
你提出的策略可行,但你必须重做你的工作,这是在你所有其他工作之上的更多工作。所以这不好。
鉴于您拥有的场景,您可以执行以下操作。
- 如果您要拆分的提交是最新的提交(您所做的最后一个),那么这很简单。
git reset --soft HEAD^
这将重置您的上次提交,但您会将所有更改保留在工作目录中。然后,您只需选择要在一次提交中进行哪些更改以及在第二次提交中进行哪些更改(从而将您的最后一次提交分成两个)。然后你必须强制 push。
- 如果您要拆分的提交不是最新的提交,那么事情就会变得更加棘手。
首先,签出您要拆分的提交。
git checkout <sha1>
然后重置您的更改(如第一种情况)
git reset --soft HEAD^
将您的更改添加并提交到两个提交中。现在,此时,您已成功拆分所需的提交,但是哦,不!在这个之上的其他提交呢?您需要cherry-pick
一一提交。
这些提交不会丢失。您仍然可以在您的git log
,甚至在您的git reflog
. 对于这些提交中的每一个,键入git cherry-pick <sha1>
并 bam!您已成功将提交一分为二。
现在这里还是有问题。你所在的分支仍然指向旧的提交。您只需移动该分支以指向您所在的当前提示。所以你可以做到git branch -f branch-name new-tip-commit
。
最后,强制推送您的分支,以便远程有您的新提交,拆分!
推荐阅读
- kubernetes - AWS EKS 服务账户集群角色绑定无法正常访问禁止访问
- javascript - 如何根据 area_id 从数组中提取对象
- python - 循环使用颜色并定义颜色图 matplotlib
- reactjs - 使用多个输入更新状态
- azure-devops - 如何使用 REST API 获取我正在关注的 azure devops 工作项?
- c# - 使用 Entity Framework 6 删除和重新插入子实体
- angular - 如果角度验证失败,则停止响应式表单提交
- netsuite - NetSuite - CSV 导入状态搜索
- angular - Angular 9 - 如何将 2 个 http.get 合并为一个 Observable
- ruby-on-rails - PG::ConnectionBad: 无法连接到服务器:当我运行 heroku run rake db:migrate 时没有获得这样的文件或目录