将主分支重置为初始提交但保留以前的历史记录

Resetting master branch to initial commit but keeping previous history

我有一个 release 分支,由于在过去 9 个月左右的时间里对代码进行了彻底的重写,该分支与 master 中的分支相比有了很大的进步。

因为 release 和 master 有很大的分歧,所以在 master 中创建 PR 时有很多冲突。 master 的当前内容现在基本上是无关紧要的,因为我已经在 release 分支上工作了很长时间。我想将 master 重置为初始提交(这只是使用 .gitignore 文件进行的回购初始化),同时保持相同的历史记录(除了额外的还原提交)。

我在 mastermaster-backup 分支上尝试了以下操作,然后尝试在 运行 命令之后将发布分支 PR 到这个 master-backup 分支:

git reset --hard <initial commit id> - 这会重置历史记录

git revert <INITIAL COMMIT ID>^..<LATEST COMMIT ID> - 这有相同的冲突,并没有完全将所有文件从发布版正确推送到主版。

我不确定现在还能做什么。我的最终目标是用 release 替换 master 的内容,同时保持 master 的当前历史记录,可能还添加了还原提交,当然还有来自 [=10= 的合并] 到 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