git - Git 在预先存在的 repo 之上重新定义复杂的历史记录,几乎从一开始就微不足道(由于签名)。见图纸
问题描述
情况:
1)我分叉了一个“原始”回购,并开始与其他人一起研究“分叉”回购
2) FastForward ~250 次提交,我更改了我的 github 用户名,还获得了一封新的无回复电子邮件
3)我在我所做的每个提交中重新设置所有历史记录以替换我的姓名和电子邮件(相信我只是影响了我的提交)
4)强制推送到远程分叉仓库,所有其他队友从头开始克隆它,我们继续前进
问题:
当尝试向原始仓库提交拉取请求时(步骤 1),我意识到我的 rebase 删除了我们从原始仓库克隆的提交中所做的所有签名。由于签名是提交哈希的一部分,这导致几乎整个历史都发生了变化。现在我提前 500 次提交,落后原始/大师约 250 次
期望的结果:
我想要达到的目标:
我想在“分叉”中获取我们工作的全部历史(约 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 将每个提交解释为我所做的。他们甚至不是贡献者。
解决方案
导致工作解决方案,但整个“分叉”历史被撕开并替换为单行提交(所有合并都丢失,所有不同的轨道都丢失)。
那是因为你做了一个简单的变基。
尝试,最好使用最新的 Git 版本,git rebase --rebase-merges
git rebase --rebase-merges master
这将移植提交图的整个拓扑。
推荐阅读
- python - 如何将不在允许值列表中的所有像素设置为白色?
- eclipse - com.sun.xml.bind:jaxb-core:jar:2.2.11 的 POM 无效,传递依赖项(如果有)将不可用
- javascript - 灯箱隐形控件
- mysql - MySQL 试图在 WITH 语句期间使用当前模式
- google-sheets - Google 表格中 =IMPORTXML 的公式解析错误
- python - 为 Python API 速率限制器编写单元测试(TDD 方法)
- python - Python中存储过程绑定中的输出参数
- c - 断开节点并将它们链接到另一个链表的功能?
- unit-testing - K8s 测试:在方案中没有为 v1alpha1.JivaVolume 类型注册类型
- c# - 如何在本地 IdentityContext 中注册从外部身份验证提供程序获得的用户