git - 将主分支重置为初始提交但保留以前的历史记录
问题描述
由于在过去 9 个月左右的时间里对代码进行了全面的修改,我有一个release
分支已经从现有的内容中显着发展。master
因为release
和master有很大的分歧,所以在创建PR的时候会有很多冲突master
。的当前内容master
现在基本上无关紧要,因为我已经在release
分支上工作了这么长时间。我想重置master
为初始提交(这只是使用.gitignore
文件进行 repo 初始化),同时保持相同的历史记录(除了额外的恢复提交)。
我在一个master-backup
分支上尝试了以下操作,然后在运行命令后master
尝试将发布分支 PR 到这个分支中:master-backup
git reset --hard <initial commit id>
- 这会重置历史
git revert <INITIAL COMMIT ID>^..<LATEST COMMIT ID>
- 这具有相同的冲突,并且不能将所有文件从发布版正确推送到主控版。
我不确定现在还能做什么。我的最终目标是在保持当前历史记录的同时替换master
's 的内容,并添加可能的还原提交,当然还有从to的合并。release
master
release
master
很感谢任何形式的帮助。
解决方案
听起来你很想git merge --no-ff release
从 master 运行一个,假设 master 自发布开始以来没有移动。然后你可以在 master 之后的一次提交中获得发布的内容(以及一个包含所有发布开发的分支。
如果您希望在 master 之后进行一次提交,其中包含发布的所有更改,放弃发布如何成为它的细节,这就是您要做的:
git checkout --detach release
git reset --soft master
git commit -m "All of release in a single commit"
# If you like the result:
git branch -f master
git checkout master
如果 master 和 release 有分歧,你想强制master 和 release 合并并保持 release 的内容不变,那么你可以这样做:
git commit-tree -p master -p release -m "Merge of release.... keeping release as is" release^{tree}
这将在输出中写入一个 ID。这是已创建的新修订。它将是master和release的合并,内容就像release一样,没有区别。因此,请随意检查一下,如果您喜欢结果:
# once you have already checked out the new revision
git branch -f master
git checkout master
推荐阅读
- javascript - HighStock Depthchart 正在奇怪地更新数据
- coq - 为什么嵌套归纳策略也将归纳假设嵌套在 lambda 下?
- node.js - 定向多导线
- python - hashlib.sha256(hashlib.sha256(str(x).encode()).digest()).hexdigest() 可以有多少个值?
- javascript - 在边界外单击时触发带有 onclick 事件的自定义元素
- java - 如何手动更新/评估使用“自定义”公式的单元格?
- snakeyaml - 如何在 SnakeYaml 中“呈现”?
- php - 如何将数组转换为csv
- mysql - 如何在 Spring Data JPA 中搜索 [FieldName]
- javascript - 为什么只有我的水平滚动条隐藏而我的垂直滚动条没有?