存储库A:从修订版r
的项目SVN迁移到git:克隆了整个内容,包括SVN的所有历史记录,标记等。之后对git进行了一些开发。
存储库B:同一个项目,但在版本r+small_number
从SVN独立迁移。只有最新的快照被带入git。之后有很多独立的发展。
现在我将A合并为B.想法是SVN将被丢弃,开发将在GitHub上项目回购的develop
分支中继续。我用简单的合并来完成这项工作;幸运的是,real conflicts很少。开发主要是在不同的领域,虽然合并后有很多清理,与git无关。
但是:现在当我这样做时merged result上的git rebase -i HEAD~2
,我明白应该让我对最后两次提交进行修改,我会收到大约300多份提交的页面 - 自修订版1以来项目的完整历史记录在SVN 。因为害怕搞砸了更多(显然我是一个完整的Git新手),我放弃了rebase。
预期结果如何?这是可取的吗?如果没有,如何解决?
请注意,所有单元测试等都通过,文件本身都可以,只是我不明白git元数据/历史记录发生了什么。
编辑:这就是我 * 认为 * 存储库现在的样子:
r A
... o --- o --- ... o
\
B \
o --- .... o ---- o --- ... o
r+small_number C HEAD
答案 0 :(得分:8)
我想这种行为的发生是因为你试图通过合并提交来重新定义。
对于以下答案,我假设您的历史记录如下,即存储库A和B完全独立:
r A
... o --- o --- ... o
o ... o
r' B
你需要问问自己你想要达到的目标是什么?所以你想要一个新的分支C包含A和B的变化。这里的优先级是什么?你想要创造一个适当的历史;纠正r'
失去SVN历史的事实?或者保持A和B的git历史不变是很重要的吗?
我的回答是假设你想要实现前者。由于A和B都来自非常相似的SVN存储库版本,因此在合并公共历史记录之前为它们提供一个公共的git base 可能是个好主意。所以,理想情况下,在合并之前你会遇到这种情况:
r A
... o --- o --- .... o
\
\
o --- .... o
r+small_number B
目前,我不确定实现这一目标的最佳方法是哪种,但您可以尝试git rebase -p --onto r --root B
。
然后你可以git merge
A和B结束历史
r A C
... o --- o --- .... o --- o
\ /
\ /
o --- .... o
r+small_number B
其中C包含您的所有更改。我可能会把它留在那;没有任何进一步的变基。