在github上,当看到好的项目代码时,有两种方式可以将代码“下载”到本地。一是可以直接clone原项目,二是通过github的“fork”功能“拷贝”项目到我们自己的主页上,再从主页上clone“拷贝项目”。
两种方式最重要的区别是,如果我们修改了clone到本地的代码,想push一下,显然第一种方式不可行,因为项目的远程信息是别人的(通过git remote -v 可以查看),而第二种方式,由于创建者相当于是我们自己,是能够push的(当然先要add 和commit)。但是我们push之后,原项目的主人是看不到我们修改的代码的,如果想让原作者接受并merge你的修改,这时可以发起pull request,这样原作者就能收到pull request请求,并可以审阅你的代码是否合理,如果他比较满意,就可以merge你的修改,这样原项目就得到了完善,而你也就成为了光荣的“贡献者”之一。
一般情况我们是不需要fork的。很多人错误的在使用fork,把它当成一种“收藏”功能,这其实并没有什么必要。一来,可以直接用“watching”来关注该项目,当有新的issue,commit,pull request时,你会收到相应的邮件提醒(前提是设置了邮箱)。二来fork的项目只是保留了fork当时的状态,如果项目作者在你fork之后更新了项目,你是看不到的。这就带来一个问题:如何实现fork后的项目与原项目的同步?这是我今天参与一个项目的时候才意识到的,以前没有思考过这个问题(诸位莫要见怪)。查阅了一些资料,找到了一个比较简单可行的答案。方法如下:
在我的主页上有一个项目“zhihu-api”,可以看到,它是从“lzjub567/zhihu-api”fork来的。

1. 将自己主页的项目clone到本地,如下图:

此时,若我们查看项目的远程信息,发现结果都是关于我自己主页的,origin是分支名称:

2. 为项目添加远程分支:

其中 upstream是远程分支名,后面的链接是原作者的仓库地址,此时再重新查看项目的远程信息,发现多了upstream的信息,是刚刚添加的原作者的仓库

3. 如果远程项目进行了更新,我们需要从upstream分支进行拉取,这样本地的代码就和原作者的代码同步了。

4. 将本地代码提交到自己主页的分支,即origin上了,这样,我自己主页的项目就和原作者的项目进行了同步。

总结一下:实现fork的项目和原项目同步的方法是利用本地的项目作为“中转”,为本地的项目添加两个远程信息,拉取原仓库的新代码,push到自己的仓库上,就达到了“同步”。
实现这个目的的做法不止这一种,只是我刚好看到了,觉得比较简单,就记录到这里备忘。
推荐文章:
网友评论