某一天,你在github上看到了一个很棒的仓库,你觉得不错,于是你fork了这个仓库。但是某一天,仓库原作者修改了一些bug和增加了一些功能。按照理想状态下,好像觉得这个源仓库都更新了,那么我拷贝的这个仓库也会自动同步更新吧?
真实情况其实是:并不会自动更新,因为如果git这样设计的话会造成一些不可预知的情况发生。同步源仓库是理想状态下实现的效果,但是如果我们在完成自己的项目的时候,突然源仓库更新了,结果你现在项目的一些逻辑和之前不匹配了,这问题就大了。
在实际开发过程中经常会遇到上这样一种场景,需要同步上游仓库的代码。
方法一
回到正题:git如何同步上游仓库(以apisix-dashboard仓库为例)
因为记录这篇文章也是我学习的过程,所以我会从头开始慢慢讲解,以方便初学者查阅。
一.首先打开github
看到我们之前fork过的仓库,点进去会看到醒目的一个Fetch upstream
点击Compare按钮会出现到一个比较当前仓库和更新后仓库不同的地方,你可以通过这里简单的查看文件有哪些差异。
点击 Fetch and merge按钮,看到这两个单词,其实我们已经能猜出来它的功能是什么了,git fetch and git merge,具体实现了什么,我们马上就会解释。(下面是点击以后的界面)
这里需要解释清楚的是,这一步仅仅是将你自己fork的仓库代码和源仓库代码同步了,但是你本地工作区的仓库还没有更新。
二.回到vscode
执行git pull命令,将远程自己仓库的代码拉到自己的工作区即可。
如果已经是最新的代码,会出现下面的提示。
方法二
在这里需要进一步补充的内容是。其实上面的方法是接下来要讲的内容的语法糖(可以这么理解)
我们某一天不能查看github,但是我们知道上游仓库已经更新,想要把本地仓库更新为最新的上游仓库,和源仓库代码保持一致呢?这样该怎么办呢?(还有一种简单的,把现在的仓库删除,重新fork,然后重新clone也可,这里不讨论)
一.打开终端切换到当前代码路径下
输入git remote
,查看你当前远程仓库
这个代表什么意思呢?简单理解就是,本地工作区只和这个origin远程仓库发生关系,不管是fetch 和 push 其实都是操作的这个仓库。如果在当前目录下执行git fetch
命令,其实相当于写了git fetch origin master
只不过省略了后面的origin mater
而已。
那我们应该如何和远程上游仓库建立起联系呢?这里需要用到git remote add <name> <url>
这个命令,具体怎么实现如下:
是我们自定义设置的,关键就是这个url在哪里获取?
首先,点击这里进入到源仓库
然后复制这里的地址即可
切换到终端执行下面命令
输入git remote -v
查看现在远程仓库的信息
二.追踪查看上游代码
输入git fetch upstream master
命令,注意这里如果使用git fetch
其实还是默认拉下来origin的代码,一定要fetch upstream
,这样才是把上游代码拉到本地查看。(我这里写了master,意思就是只拉下来上游master分支查看,省略的话就是拉下全部分支的代码)
接下来就是merge upstream/master
三.推送到origin 仓库
git push
即可
现在你的仓库已经和上游master仓库同步了~