首页 > 解决方案 > 将主分支重置为初始提交但保留以前的历史记录

问题描述

由于在过去 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的合并。releasemasterreleasemaster

很感谢任何形式的帮助。

标签: gitmergerebase

解决方案


听起来你很想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

推荐阅读