如何将不相关的历史记录作为一系列新提交推送?

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

以上是关于如何将不相关的历史记录作为一系列新提交推送?的主要内容,如果未能解决你的问题,请参考以下文章

如何拆分隐藏在历史中的 Git 提交?

如何在GIT Rebase Interactive Squash之后删除远程存储库上的历史记录提交消息

创建没有commit提交历史的新分支

我可以在不删除最近提交的情况下删除源/主合并历史记录吗?

Angular 2 - 替换历史而不是推送

如何删除旧的 git 历史记录?