场景
平时在使用git时会遇到同一个项目需要推送多个远程仓库的情况。比如:
- 公司项目对外接口调用样例代码,是存放在公司的git仓库,但需要推送至
github
给外面客户使用。
- 使用
github
开源项目时,有时需要对代码进行自定义修改(暂且称为『自有项目』),同时需要能定期合并开源项目的最新特性至『自有项目』。
以上这两种就属于同个git
项目需要多个远程仓库的典型,解决的方法有多种。
方案1
1.1 前提
- 假设样例代码项目
self-xxx
,同时本地git环境也按正常流程从自有仓库aaa.com:bbb
拉取了self-xxx
。
github
上已建好新项目self-xxx
,地址为git@github.com:xxx/self-xxx.git
1.2 步骤
$:git remote -v
origin git@aaa.com:bbb/self-xxx.git (fetch)
origin git@aaa.com:bbb/self-xxx.git (push)
- 说明
orgin
对应的远程会仓库地址是bbb,然后添加org
(随便定)对应到github仓库
git remote add org git@github.com:xxx/self-xxx.git
$:git remote -v
org git@github.com:xxx/self-xxx.git (fetch)
org git@github.com:xxx/self-xxx.git (push)
origin git@aaa.com:bbb/self-xxx.git (fetch)
origin git@aaa.com:bbb/self-xxx.git (push)
git pull origin master
git pull org master
- 每次修改完origin的代码提交后,将
origin master
合并到org master
即可,理论上是不会有冲突的,因为org master
是不应该有代码修改操作。
git merge origin/master
git push org master
方案2
2.1 前提
以alibaba sentinel
项目为例,假设自有仓库已经建好项目self-sentinel
,同时本地git环境也按正常流程拉取了self-sentinel
。
2.2 步骤
$:git remote -v
origin git@github.com:freshines/self-sentinel.git (fetch)
origin git@github.com:freshines/self-sentinel.git (push)
- 说明
orgin
对应的远程会仓库地址是freshines
,然后添加alibaba
对应到sentinel
官方仓库
git remote add alibaba git@github.com:alibaba/Sentinel.git
$:git remote -v
alibaba git@github.com:alibaba/Sentinel.git (fetch)
alibaba git@github.com:alibaba/Sentinel.git (push)
origin git@github.com:freshines/self-sentinel.git (fetch)
origin git@github.com:freshines/self-sentinel.git (push)
git pull origin master
git pull alibaba master
git push origin master
git push alibaba master
2.3 官方新特性合并
拉取官方仓库最新代码至本地,此时本地即有官方分支、也有『自有项目』分支,针对不同情况可以使用merge/rebase/cherry pick
等方式进行新特性的合并。
2.4 官方代码保留至自有仓库
上述操作在自有仓库只有『自有项目』的远程分支,没有官方的分支。因此如果另外一人拉取『自有项目』,只能看到『自有项目』代码。所以有时也需要将官方的代码 也存至『自有项目』,方便对比查看。此时可在自有项目』里新建一个分支,每次将alibab/amaster
的代码合并或者rebase
至该分支即可。