【Github】fork 和 branch 的联系与区别 | 青训营笔记

1,482 阅读6分钟

这是我参与「 第五届青训营 」伴学笔记创作活动的第 15 天

主要介绍 - 目录👇

  • fork 和 branch 的联系与区别
  • 如何 fork 其他作者的代码到自己的仓库并进行贡献
  • fork 别人的项目,在源作者更新后要如何同步更新

详细介绍

一 fork 和 branch 的联系与区别

在本次青训营的大项目安排中,队长让我们将项目fork到自己的github中,但以我过往开发的浅薄经验理解不是直接通过branch就好了吗?感觉两者都是分支类的存在,非常不明白他们之间的区别,于是去查了一手资料才算是明白二者的不同在哪,下面做一下简单的介绍:

fork - 代码管理方式 一个项目新建出来,先由项目负责人从主干的分支上 fork 出来一个仓库,然后各项目成员向这个 fork 出来的仓库中拉取或上传代码,最后再由项目负责人将测试完成的项目代码与分支合并。

1 Github 的 fork 是什么?

从单词字面上理解其实就是分支、分流。
图片.png

现在有这样一种情形:

有一个叫做Joe的程序猿写了一个游戏程序,而你可能要去改进它。并且Joe将他的代码放在了GitHub仓库上。
下面是你要做的事情
fork并且更新GitHub仓库的图表演示

  1. Fork他的仓库:这是GitHub操作,这个操作会复制Joe的仓库(包括文件,提交历史,issues,和其余一些东西)。复制后的仓库在你自己的GitHub帐号下。目前,你本地计算机对这个仓库没有任何操作。
  2. Clone你的仓库:这是Git操作。使用该操作让你发送"请给我发一份我仓库的复制文件"的命令给GitHub。现在这个仓库就会存储在你本地计算机上。
  3. 更新某些文件:现在,你可以在任何程序或者环境下更新仓库里的文件。
  4. 提交你的更改:这是Git操作。使用该操作让你发送"记录我的更改"的命令至GitHub。此操作只在你的本地计算机上完成。
  5. 将你的更改push到你的GitHub仓库:这是Git操作。使用该操作让你发送"这是我的修改"的信息给GitHub。Push操作不会自动完成,所以直到你做了push操作,GitHub才知道你的提交。
  6. 给Joe发送一个pull request:如果你认为Joe会接受你的修改,你就可以给他发送一个pull request。这是GitHub操作,使用此操作可以帮助你和Joe交流你的修改,并且询问Joe是否愿意接受你的"pull request",当然,接不接受完全取决于他自己。
  7. 如果Joe接受了你的pull request,他将把那些修改拉到自己的仓库!

内容来源(英文原文)👉 Simple guide to forks in GitHub and Git
内容来源(中文)👉 在Github和Git上fork之简单指南

这时候你已经简单理解了 fork 的作用以及使用方式,那么我们一起更深入的了解吧~

2 fork - Github操作,branch - Git操作

原生的Git中其实是没有fork操作的,这个功能是类似Github的在线代码托管平台提出的。

这里对fork和branch做简单的说明能够更好地区分二者:

  • fork 可以理解做你将源作者的代码clone到了自己的线上仓库中,如果需要在本地编辑则需要从自己的仓库中clone到本地计算机,当你完成一个功能并且想推到源仓库时,你可以将你的改动push到自己的仓库里,再通过pull request提交到源仓库下,一旦源作者接受了你的 pull request,你的代码就有可能会出现在原 fork 项目中了。

  • branch 则可以理解做,当你接到了一个新的需求,你可以拉一个分支出来单独对该需求进行开发,在这上面修改代码是不影响原主干代码的,可以等修改、测试完毕后再合并到主干上去。(对于git中branch的操作可以看看我前面的笔记Git 基础学习与使用(上) | 青训营笔记 以及 Git 基础学习与使用(下) | 青训营笔记

到了这里,应该已经能够理解二者的不同了!

简单来说其实,如果我们不是源作者,那么branch相当于在别人家里开一个新房间开工,而fork则相当于将工作带回自己家再做。在别人家里工作肯定不如自家随意舒适,fork后我可以在自己的仓库里头随意造作、随意开分支,只要不随便将半成品工作拿去老板家(源仓库)就完全不会影响;branch在老板家开了个新分支,房间显然要小一些,也要拘谨一点~

这个作者:曾经去过跨越一个小时的地方 对此也给出了一个很容易理解的说法:

根据我们上述的讨论,我们发现 fork 仿佛与 branch 有了一些重合点。一个是 GitHub 操作,一个是 branch 操作,同样可以拉一个与主干不影响的地方进行开发,那么他们之间有什么不同呢?

作者认为,他们之间的不同,也就是我们如何使用他们的原因:

  • fork,归根结底还是克隆,只是一种可以 pull request 可以合并到原项目的一种克隆

  • branch,则是一个项目仓库中的代码管理方式,一种方便多人协作的方式

也就是说,fork 可以给你的,远比 branch 要大的多。fork 其实就是一个新的仓库,你可以为所欲为,可以随便开分支,只要最后不乱 pull request 乱合并到原项目就不会出事;而 branch 其实只是一个分支,比一个仓库的范围要小得多,你实际上还是处于同一个项目仓库中。

文章来源👉 使用 Git 的一点点疑惑:fork 跟 branch 的关系
个人总结中引用部分也同样来自该作者

个人总结

很有意义的一次学习,算是在又一次的实际开发中了解的一个小小知识点。因为担心篇幅过长影响阅读感受,决定将后面的内容编入下一篇文章中,点击这里即可跳转喔~进一步了解 fork 👉【Github】fork 的运用 | 青训营笔记

项目负责人 fork 一份到自己仓库,项目成员上传到这个 fork 的仓库,最大限度对于原项目没有任何影响,只要 pull request 的时候小心就行。
这样的代码管理方式,非常适合同一个大型项目下同时开发着好多个子项目,各个子项目又有着各自的项目成员。
避免在同一个仓库中开太多的子分支是为了最大限度的避免出错,这种代码管理方式自有其意义。



文章参考如下:
[1]. Simple guide to forks in GitHub and Git
[2]. 在Github和Git上fork之简单指南
[3]. 使用 Git 的一点点疑惑:fork 跟 branch 的关系