git: 在两个 repo 之间 merge

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了git: 在两个 repo 之间 merge相关的知识,希望对你有一定的参考价值。

参考技术A

事情是这样,有一个叫 scripts 的 git 库,里面放了一些所属不明的脚本。我希望把这些零散脚本管理起来,它们不属于任何一个项目,为每个脚本都建一个库又太小题大做,于是有了一个『脚本孤儿院』。

与此同时,另外有个项目在进行,到一定程度时,它需要引用前面脚本里的一个。我突然明白,那个脚本就是这个项目的一部分,它『找到组织』,该『认祖归宗』了!

最简单的方法当然是,从原库 剪切 相关文件, 粘贴 到新库,然后两边分别提交变更。

确实,文件管理权移交这件事完成了。但结果是,新库历史里这些文件是凭空出现的,之前的提交历史都丢失了。你当然可以在新库提交时,在message里提一下,这些文件原本是在哪个库,详细历史请参考该库历史。可如果有一天旧库不再维护呢?你无法保证两个库生命周期一致。

怎么连带提交历史一起移动呢?Merge !Merge 就是为这个目的存在的。不过等等,merge 只能在 branch 之间进行吧,两个 repo 怎么做?(严格说,是 commit 之间,branch 也好 tag 也罢,在 git 里最后都是指向 commit 的指针)

当然可以,只要把要合并来源,当做远程库,获取到目标库生成一个远程分支,再合并即可。

假设要做的是 repo-from => repo-target 的合并,按以下操作即可:

完事之后再 git remote rm other , 然后 git rebase 稍微调整一下提交历史就好(因为这样合并,会把完整历史引进来,但实际上你可能只要部分文件和相关的提交历史)。或者 fetch 后直接选择 rebase,把需要的 commit 挑选出来,不再赘述。

上述方法基本可以解决问题,非要挑剔的话:

其实 git 自带了相关工具:

通过 fast-export + pipe + fast-import 从一个库导入到另一个库。注意的地方有几个:

介绍到这,内容并不复杂。 对于 Git 的使用,不排斥甚至推荐用 TortoiseGit 和 SourceTree 这样的 GUI 工具,为常规操作节省时间。但是了解命令可以做到更多!

git保留两个repo的commit并进行合并

以往的合并时首先要删除repo的.git文件夹,然后重新add-commit-push。带来的问题是会丢失某一个仓库的提交信息,不利于时光倒退。经过摸索终于实现了保留两个仓库提交信息的合并方法。介绍如下:

比如要将DownloadPicsBySeleniumAndPhantomJS这个项目合并到Web-Spider中,终端中执行:

技术分享图片

接下来解决merge冲突即可(可以尝试使用mergetool),如有需要可以删除多余分支和远程连接

1 git mergetool # 解决merge冲突
2 git remote rm other # 删除远程连接
3 git branch -d repo1 # 删除分支操作

 

以上是关于git: 在两个 repo 之间 merge的主要内容,如果未能解决你的问题,请参考以下文章

git保留两个repo的commit并进行合并

git中merge和rebase

获取两个存储库之间的差异

两个不同文件之间的 git diff

怎么merge 两个不同的仓库,顺带讲git rebase 怎么用

合并两个git repository