背景:
我fork了阿里巴巴 dubbo 项目的代码到自己的github账户下,然后从自己的github下 clone了代码到本地磁盘。
这个时候阿里巴巴的dubbo项目有新代码提交了,我想把这些新代码同步到我自己的github下fork出来的仓库里面去。
用命令行来做的话,就三个步骤(先已经把自己github仓库下的dubbo项目clone到本地磁盘了)。
1、首先要先确定一下本地仓库关联了那些远程仓库
git remote -v // 不使用命令,直接去.git/下查看 config 文件也可以。
2、如果只能看到你自己github上远程仓库的的两个源(fetch 和 push),那就需要添加fork时的原repo的源,也就是阿里巴巴dubbo项目本来的远程仓库:
git remote add upstream URL
// 这里的upstream是一个名字,可以自定义的,只要能表达出你要关联的远程仓库地址即可。
// URL 是目标远程仓库地址。
// 完整的语法为 git remote add <name> <URL>
比如我现在想关联到阿里巴巴的dubbo开源项目的远程地址可以这样来做:
git remote add alibaba https://github.com/alibaba/dubbo.git
以后想从阿里巴巴的dubbo项目仓库地址pull代码或者push代码到阿里巴巴的dubbo项目可以这样来做。
git pull alibaba master // 拉代码
git push alibaba master // 推代码 (当然,前提需要有权限)
再次查看
git remote -v
然后你就能看到upstream了。(自定义了名字叫upstream,自定义名字为alibaba,看到的就是alibaba)
3、如果想与主repo合并,执行以下命令:
git fetch upstream
git merge upstream/master
思考,难道不可能直接执行 git pull upstream 吗?
下面我拿dubbo开源项目来实际操作一遍。
首先我已经fork了dubbo的源代码到我自己的仓库,地址是:
https://github.com/xigua366/dubbo.git
dubbo项目本身的仓库地址是:
https://github.com/alibaba/dubbo.git
第一步,clone自己fork的dubbo项目到本地磁盘,我放到D:\githubcode下。
$ git clone https://github.com/xigua366/dubbo.git
第二步、查看远程仓库信息。
git remote -v
这个时候只能看到自己github仓库下的两个源(fetch 和 push),默认的远程仓库地址代号都叫做origin。
所以需要添加阿里巴巴dubbo项目本身的仓库地址源(这里我自定义这个远程仓库地址为upstream,可以任意定义的,自己能分得清就行)
git remote add upstream https://github.com/alibaba/dubbo.git
并在此查看关联的远程仓库信息,会发现多了dubbo项目本身的仓库地址源
执行合并,将 upstream上的最新代码合并到本地磁盘的代码中来,然后自己commit,然后如果没有冲突就push到origin 远程仓库中,有冲突就先解决冲突,再commit,再push到自己github的远程仓库中去。
因为我这的fork下来的dubbo已经是最新的了,没什么改动,所以merge的时候提示我 Already up-to-date,意思就是我我的自己的代码已经是最新的了。
如果不是最新的,就会有内容。
其它想说的:
我:
对应一个本地git仓库,可以同时指向多个远成仓库的。 origin 这个名字只是默认的。
:
嗯嗯,可以自定义的
我:
周六我以为upstream这个单词就表示原作者的github仓库。
我:
哈哈 其实我定义 abc 也可以的。
我:
origin 也好,upstream也好都是平等的。
我:
仅仅是不同的单词。
我:
懂了,懂了,哎,以前用svn多了。。
我:
git remote rm origin
git remote add yx https://github.com/alibaba/dubbo.git
我:
执行这两个命令,可以把默认的origin改掉。 改成 yx
我:
额 这样的话,我干嘛叫 upstream ,直接改成 alibaba 不就好了。
我:
如果关联了多个远程仓库,那么以后push代码或者pull代码的时候不能简单的使用git push了或者git pull了吧?
我:
一定要指明远程仓库的名字。 比如 git push alibaba master ?
:
嗯嗯,是的
我:
瞬间感觉打通了任督二脉。 以前天天用工具在界面操作。
我:
经过测试,发现并不是这样,如果origin 这个名字存在的话,默认还是找origin代表的远程分支的。
我:
除非把origin名字改掉,才需要明确指定。
:
是的,存在多个远程仓库时,push需要明确仓库和分支,否则会push到默认的
现在把origin 改成 yx试试:
结果证明,origin只是默认的远程分支,没有了默认的远程分支时,无论pull还是push都必须指明remote(远成仓库)才能操作成功。
2017-11-22 补充: 其实并不是origin这个单词就是默认的,而是-u参数决定的。
比如:
参考资料: https://segmentfault.com/q/1010000002590371