一、引言
最近在工作中接触到了一种 “别样” 的代码管理方式:
一个项目新建出来,先由项目负责人从主干的分支上 fork 出来一个仓库,然后各项目成员向这个 fork 出来的仓库中拉取上传代码,最后再由项目负责人将测试完成的项目代码与分支合并。
虽然我之前接触 SVN 代码管理比较多,但是实际上对于 Git 管理代码也不是很有经验。虽然私底下也有使用 Git 管理工具,但也只是起到个人代码版本备份管理的作用。对于这种 “别样” 的代码管理方式,很是不理解:
为什么要 fork?
Git 出现的意义,不就是方便多人协作更加方便的拉取分支和合并分支的吗?
二、fork 其实并不是 Git 操作
经过我搜集资料,我发现了一个非常令 “新人” (也就是我)震惊的事实,那就是:
fork 其实并不是 Git 操作,而是一个 GitHub 操作
也就是说,对于原生的 Git 工具来说,是没有 fork 的操作的,fork 是类似 GitHub、码云等等在线代码托管平台提出来的功能。
fork 的作用,类似于当你在托管平台上看到了一个很有趣的项目,想要自己去改进它,然后你 fork 了它(类似克隆),最后你改了一个很厉害的功能出来,想要推给原 fork 项目,这时候你可以 pull request,一旦对方接受了你的 pull request,你的代码就有可能会出现在原 fork 项目中了。
非常形象的例子可以参考这篇博客:
GitHub的Fork 是什么意思
三、branch 当然是一个 Git 操作
根据上一个标题,这个标题所要讲述的内容就很明显了:
branch 当然是一个 Git 操作
对于远端仓库来说,默认有一个 master 的分支,也叫作主干。当你接到了一个新的需求,你可以拉一个分支出来,在这上面修改代码而不影响原主干代码,等修改测试完毕后再合并到主干上去。
这也就是非常常见的 Git 分支管理的内容。
四、fork 还是 branch
根据我们上述的讨论,我们发现 fork 仿佛与 branch 有了一些重合点。一个是 GitHub 操作,一个是 branch 操作,同样可以拉一个与主干不影响的地方进行开发,那么他们之间有什么不同呢?
我认为,他们之间的不同,也就是我们如何使用他们的原因。我认为:
fork,归根结底还是克隆,只是一种可以 pull request 可以合并到原项目的一种克隆
branch,则是一个项目仓库中的代码管理方式,一种方便多人协作的方式
也就是说,fork 可以给你的,远比 branch 要大的多。fork 其实就是一个新的仓库,你可以为所欲为,可以随便开分支,只要最后不乱 pull request 乱合并到原项目就不会出事;而 branch 其实只是一个分支,比一个仓库的范围要小得多,你实际上还是处于同一个项目仓库中。
五、总结
那么现在再来看看为何要这么管理代码:
项目负责人 fork 一份到自己仓库,项目成员上传到这个 fork 的仓库,最大限度对于原项目没有任何影响,只要 pull request 的时候小心就行。
这样的代码管理方式,非常适合同一个大型项目下同时开发着好多个子项目,各个子项目又有着各自的项目成员。
避免在同一个仓库中开太多的子分支是为了最大限度的避免出错,这种代码管理方式自有其意义。
哈哈哈,总算是解了自己的疑惑。希望能够对有同样疑惑的朋友一些启发 ^_^
To be Stronger:)