假设我有两个不同的存储库,如下所示:
Project 1:
Init---A---B---C---HEAD1
Project 2:
Init---D---E---F---G---HEAD2
有没有办法将Project 1(Init to HEAD)重新绑定到Project 2的Init提交,所以它看起来像这样:
Project 1 & 2:
A---B---C---HEAD1
/
Init---D---E---F---G---HEAD2
项目1&项目2是类似的。主要区别在于它们的文件结构略有不同:
Project1:
MyProject/
File1
File2
File3
Project2:
MyParentProject/
MyProject/
File1
File2
File3
SomeFolder/
SomeOtherFolder/
...etc/
仅供参考:MyProject不是MyParentProject的子模块。 MyProject和MyParentProject作为两个独立的git存储库存在于两个不同的位置。
答案 0 :(得分:12)
您可以将一个视为另一个的远程存储库。在Project1中,运行以下命令:
git remote add project2 <path_to_project_2>
git fetch project2
git branch --track project2Branch project2/master
git checkout project2Branch
使用git log查找该分支的初始提交的哈希值(即Project2)。然后运行
git checkout master # or whatever branch you want to rebase
git rebase <hash-for-commit>
您现在已经使用Project2重新命名了Project1。因为这听起来像是一次性操作,你只能使用一个存储库,你可以用
清理git remote rm project2
现在,您的主分支使用Project2的init进行重新定义,而project2Branch具有Project2的其余历史记录。这有点像黑客,但它会做你想要的。
答案 1 :(得分:0)
我认为您可以将git-filter-branch
与--parent-filter
选项一起使用。
答案 2 :(得分:0)
我使用的解决方案如下:
在项目2 :
中git format-patch <commit> --stdout > /path/to/patch.diff
<commit>
指的是&#34;来自&#34;的第一次提交。您希望合并到&#34; target&#34;。
在项目1 :
中git am /path/to/patch.diff
这会将项目2 中的<commit>
到HEAD
的每次提交重播到项目1 。
这完全避免了项目之间需要共同的祖先,因为大多数git特定的工具都需要。
答案 3 :(得分:0)
您可以先将其他仓库添加到当前仓库作为远程仓库,然后执行rebase --onto,以便在第一个仓库中将一系列提交从一个仓库改为一个常见提交点。
git remote add project2 <...>
git checkout project2-master
git rebase -s recursive -X theirs --onto \
project1-first-commit project2- start-commit project2-end-commit
大致相同。如果存在冲突,我还指定合并策略以使用来自project2的提交。您可能想要使用其他东西。但是在这里我们假设project2是“正确”代码而project1只是一个远程主代码。