`
xigua366
  • 浏览: 101109 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

github下fork后如何用命令行同步源仓库的新更新

阅读更多

 

背景:

 

我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参数决定的。

比如:

git push -u origin master 第一次执行push时加了 -u 参数,那么就意味着把origin这个远程仓库作为默认的了。 如果执行 git push -u albaba master 那么 alibaba 这个远程仓库就是默认的了,git并不是认origin这个单词的。

 

 

参考资料: https://segmentfault.com/q/1010000002590371 

  • 大小: 34.8 KB
  • 大小: 43.7 KB
  • 大小: 50.3 KB
  • 大小: 52.4 KB
  • 大小: 81.4 KB
  • 大小: 149.8 KB
0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics