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

Git 将主分支重置为初始提交,但保留以前的历史记录,git,merge,rebase,Git,Merge,Rebase,我有一个release分支,由于在过去9个月左右的时间里对代码进行了彻底的重新工作,它已经从master中的分支显著地向前移动 因为release与master有很大的分歧,所以在master中创建PR时会有很多冲突。master的当前内容现在基本上是不相关的,因为我已经在发布分支上工作了很长时间。我想将master重置为初始提交(这只是使用.gitignore文件进行的repo初始化),同时保持相同的历史记录(除了额外的恢复提交) 我在从master获取的master backup分支上尝试了

我有一个
release
分支,由于在过去9个月左右的时间里对代码进行了彻底的重新工作,它已经从
master
中的分支显著地向前移动

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

我在从
master
获取的
master backup
分支上尝试了以下操作,然后在运行命令后尝试将释放分支PR到该
master backup
分支中:

git reset——硬
-这将重置历史记录

git revert^..
-这有相同的冲突,不能将所有文件从发行版正确地推送到主版本

我不知道现在还能做什么。我的最终目标是将
master
的内容替换为
release
,同时维护
master
的当前历史记录,添加可能的恢复提交,当然还有从
release
master
的合并


非常感谢您提供的任何帮助。

听起来您很想运行一个
git合并--不从master发布ff版本,假设自发布启动以来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

这听起来很像你想从master运行一个
git合并——没有ff版本,假设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

master
进行了3次提交,但这些都是很小的更改,它们被手动复制到
release
中,这很糟糕,并使其成为PITA。我怀疑这也会导致问题。我还应该说
master
上有一些分支策略,这意味着我只能提交PR,不能合并到mast中例如,我可能需要创建一个master的副本,在该分支上运行命令,然后将该分支发布到master中。好的……让我添加一点额外的hack我在上面的评论中添加了一点额外的上下文-不确定你是否读到了,因为我怀疑我没有快速编辑。我想我已经了解了全部内容上下文。让我知道它如何与黑客。这已经完成了技巧!我采取了一个副本
master
,并运行
git提交树
,从发布到副本。我现在创建了一个从副本到master的PR,没有任何问题,构建已经通过。非常感谢您的帮助!我从来没有听说过
git提交树直到今天,我一直在尝试使用常规的重新基址、重置和恢复。
master
已经进行了3次提交,但这些都是小的更改,它们被手动复制到
release
,这很糟糕,并使其成为PITA。我怀疑这也会导致问题。我还应该说
master
有一些分支h策略,这意味着我只能提交PR,而不能通过git bash合并到master。因此,我可能必须创建master的副本,在该分支上运行命令,然后将该分支PR到master。好的……让我添加一点额外的hack我在上面的评论中添加了一点额外的上下文-不确定您是否管理了to读这篇文章,因为我怀疑我没有快速编辑。我想我已经了解了整个上下文。让我知道它是如何与黑客一起进行的。这就成功了!我拿了一份
master
的副本,并在副本上运行了
git commit tree
。我现在已经从副本创建了一个PR到master,没有任何问题,构建已经通过。谢谢你非常感谢您的帮助!直到今天,我才真正听说过git commit tree,并且正在尝试使用常规的重基、重置和还原。没有理由将主控重设为任何内容。在合并过程中,接受从发布到发布的所有更改。类似于:这是我所怀疑的应该发生的,但是有些这些更改包括文件的完整重组。当复制/合并到
master
时,旧文件仍然存在。没有理由将
master
重置为任何内容。接受的所有更改