如何将不相关的历史记录作为一系列新提交推送?
Posted
技术标签:
【中文标题】如何将不相关的历史记录作为一系列新提交推送?【英文标题】:How can I push an unrelated history as a series of new commits? 【发布时间】:2022-01-18 05:12:57 【问题描述】:我有两个独立的远程存储库,RemoteOld 和 RemoteNew。
RemoteOld URI:http://RemoteOld 分支机构: A--B--C--D--E大师
远程新建 URI:http://RemoteNew 分支机构: A'--B' 主人
我想从 RemoteOld 中获取所有提交并将它们添加到 RemoteNew,以便 RemoteNew 看起来像这样:
远程新建 分支机构: A'--B'--A--B--C--D--E大师
RemoteNew/master 中的提交 A 应该有效地删除 RemoteNew 中的所有文件,并将它们替换为提交 A 处 RemoteOld/master 的快照中的文件。提交 B-E 在 RemoteOld 和 RemoteNew 之间应该相同。我需要在不使用强制推送的情况下执行此操作。
【问题讨论】:
“不使用强制推送”?我不确定你能不能。没有它,它们就不一样了 箭头指向另一个方向:一个分支名称指向 last 提交,每个提交都向后指向更早的提交。当您要求存储库将分支名称从指向提交 X 更改为指向提交 Y 当且仅当 X 不是已经是 Y 的祖先时,您必须强制推送。 提交的 in 中的内容无关紧要,历史箭头的 except 是什么。新的提交必须通过链向后指向某个现有的提交。 如果我理解正确,您正在寻找的是对git rebase 的相当直接的使用。环顾四周,您可能会发现很多关于如何使用它的说明。 我只是说你把箭头画错了。以正确的方式绘制它们,声明新提交a123456...
的内容是您喜欢的任何文件,并且 a123456
的父级是现有提交 0987654...
或其他任何文件。表明git push
将要求他们的存储库将他们的 master 设置为a123456
,现在位于0987654
之后,并且您已经证明--force
不是必需的。
【参考方案1】:
您必须将 RemoteOld/master 重新设置为 RemoteNew/master。由于两个分支具有相同的名称,您需要临时重命名一个分支:
克隆 RemoteOld:
git clone http://RemoteOld
cd FolderCreatedByClone
添加 RemoteNew。您可以在使用时删除 RemoteOld,因为它不再被使用:
git remote add RemoteNew http://RemoteNew
git remote rm origin
将 RemoteOld/master 重命名为其他名称,例如 masterOld。从新来源获取主分支。然后运行git branch -a
查看所有分支:
git branch -m masterOld
git fetch RemoteNew
git branch -a
输出:
*masterOld
remotes/RemoteNew/master
将 masterOld 重新设置为 RemoteNew/master:
git rebase --onto master masterOld
此时 masterOld 将看起来像您希望 RemoteNew/master 的样子,因此只需将 masterOld 合并到 RemoteNew/master 中即可。
git checkout master
git merge masterOld
推送 RemoteNew/master。可以删除旧的 master 分支。
git branch -d masterOld
git push
【讨论】:
git rebase --onto master masterOld
这可能需要允许不相关的历史标志?
@evolutionxbox 我不需要那个标志
所以它没有警告你他们不相关?
@evolutionxbox nope以上是关于如何将不相关的历史记录作为一系列新提交推送?的主要内容,如果未能解决你的问题,请参考以下文章