首页 > 解决方案 > Git 在预先存在的 repo 之上重新定义复杂的历史记录,几乎从一开始就微不足道(由于签名)。见图纸

问题描述

情况:

1)我分叉了一个“原始”回购,并开始与其他人一起研究“分叉”回购

2) FastForward ~250 次提交,我更改了我的 github 用户名,还获得了一封新的无回复电子邮件

3)我在我所做的每个提交中重新设置所有历史记录以替换我的姓名和电子邮件(相信我只是影响了我的提交)

4)强制推送到远程分叉仓库,所有其他队友从头开始克隆它,我们继续前进

问题:

当尝试向原始仓库提交拉取请求时(步骤 1),我意识到我的 rebase 删除了我们从原始仓库克隆的提交中所做的所有签名。由于签名是提交哈希的一部分,这导致几乎整个历史都发生了变化。现在我提前 500 次提交,落后原始/大师约 250 次

期望的结果:

想要的 git 历史

我想要达到的目标:

我想在“分叉”中获取我们工作的全部历史(约 250 次后提交)并将其重新定位在“原始”之上(这一次,不改变他们的提交),以便它可以合并到“原始”中

在最终版本中,我想保持历史原样。由谁创作的所有提交,没有压缩合并提交,等等。有没有办法做到这一点?

试过:

1) 合并 --allow-unrrelated-histories

git clone original-url
git remote add new-repo forked-url
git checkout -b new forked/master
git checkout master
git merge new --allow-unrrelated-histories

=> 导致一个可行的解决方案,但重复了我想避免的几乎所有原始提交(没有签名)。

2) 变基

git clone original-url
git remote add new-repo forked-url
git checkout -b new forked/master
git rebase -i master

=> 导致工作解决方案,但整个“分叉”历史被撕开并替换为单行提交(所有合并丢失,所有不同轨道丢失)。例如,几乎我所有的队友协作都丢失了,因为 git 将每个提交解释为我所做的。他们甚至不是贡献者。

标签: gitgithubrebase

解决方案


导致工作解决方案,但整个“分叉”历史被撕开并替换为单行提交(所有合并都丢失,所有不同的轨道都丢失)。

那是因为你做了一个简单的变基。

尝试,最好使用最新的 Git 版本,git rebase --rebase-merges

git rebase --rebase-merges master

这将移植提交图的整个拓扑。


推荐阅读