Git 在预先存在的 repo 之上重新建立复杂历史的基础,几乎从一开始就微不足道地发散(由于签名)。见图纸

Git rebase complex history on top of pre-existing repo, trivially-diverging almost from the beginning (due to signatures). See drawing

情况:

1) 我分叉了一个 'original' 存储库,并开始与其他人一起处理 'forked' 存储库

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

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

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

问题:

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

想要的结果:

我想达到的目标:

我想获取我们在 'forked' 中的整个工作历史(在 ~250 之后提交)并将其重新设置在 'original' 之上(这次,不改变他们的提交)这样它就可以合并到 'original'

在最终版本中,我想保留历史原样。所有由作者创作的提交,没有压缩合并提交,等等。有什么办法可以实现吗?

尝试过:

1) merge --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) rebase

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

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

Leads to working solution, but the entire 'forked' history is ripped apart and replaced with a single line of commits (all merges are lost, all different tracks are lost).

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

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

git rebase --rebase-merges master

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