fork 与 branch、clone 的区别

  • fork
  • branch
  • clone

  对于没有使用 git 进行企业级的多人协作的 git 使用者来说,往往认为使用 git 进行代码仓的操作的过程中,fork 得到的结果就相当于一个新的 branch,但实际上,这是完全不同的概念。另外,也有人分不清 fork 与 clone 的区别,笔者也在此一并解释一下。

fork

  fork 的原意是“叉子”,一种西方人的餐具(西方人很喜欢使用与饮食相关的内容来命名),这相当于中国人的筷子。对于一个菜,大家可以使用筷子一起吃,因此,fork 是一种实现多人协作的方式。

  fork 只能对代码仓进行操作,且 fork 不属于 git 的命令,它是远程代码仓托管平台的一种“操作”,一般还是该平台网站上的一个可点击的文字,在点击该文字之后就可以触发 fork 操作。对于远程的原代码仓,使用 fork 之后,得到的是该远程仓的一个副本,但其(副本仓)的所有人变成了使用的 fork 的人(为了简化描述,下面假设使用的 fork 的人是你)。之所以说 fork 得到的代码仓的所有者变成了你,是因为该仓的 clone 中的 URL 变成了关于你的 URL,而原代码仓的 clone 中的 URL 是关于该原代码仓所有者的 URL。在这个意义下,fork 相当于对代码仓的“copy”。但是,对原代码仓使用 fork 得到的副本仓,远程代码仓管理网站会保留副本仓与原代码之间的一种“联系”。这种“联系”并不是它们之间的同步更新,因为这种同步更新的技术是不可能实现的,原因是多人协作提交的代码有可能引起冲突。这种“联系”只是标记此副本仓是从原代码仓中使用 fork 得到的,这对以后将进行的从副本仓到原代码仓的代码合入提供了可能。

branch

  branch 的原意是“分支”。这很好理解,这意味着新 branch 是为原 branch 提供了一种新的开发方向。

  branch 只能对某一分支(branch)或提交(commit)进行操作,它是 git 的一种命令,操作结果是建立一个新分支。然后使用 checkout 到新分支之后,以后提交将建立一个与原分支相对独立的一个提交记录。这些特征好像与 fork 很类似,但 fork 得到的是一个新的、自己的代码仓,而 branch 得到的是一个自己的代码仓的一个新分支,两者在概念上大相径庭。

clone

  clone 的一词容易让人望文生义。有人说它就是“copy”,但实际上它的含义更接近“download”,而 fork 更接近于“copy”。

  clone 是 git 的一种命令,它的作用是将文件从远程代码仓下载到本地,从而形成一个本地代码仓,而这个远程代码仓可以是自己的远程代码仓,也可以是他人的,只要能获取该代码仓关于命令 clone 的 URL 即可。clone 与 fork 的区别在于,fork 是将远程别人的代码仓,创建一个自己的远程副本,而 clone 是将远程的某个代码仓,创建一个自己的本地副本,而这“某个代码仓”可以是远程自己的代码仓,也可以是他人的。

fork 与 branch、clone 的区别相关推荐

  1. Unix/Linux fork后传-clone

    来自<Fork三部曲之clone的诞生>.本文fork三部曲的后传,建议先阅读: 正传:<Linux fork那些隐藏的开销> 前传:<Unix/Linux fork前传 ...

  2. 使用 Git 的一点点疑惑:fork 跟 branch 的关系

    一.引言 最近在工作中接触到了一种 "别样" 的代码管理方式: 一个项目新建出来,先由项目负责人从主干的分支上 fork 出来一个仓库,然后各项目成员向这个 fork 出来的仓库中 ...

  3. fork与clone的区别

    fork:在github页面,点击fork按钮.将别人的仓库复制一份到自己的仓库. clone:将github中的仓库克隆到自己本地电脑中 问题1:pull request的作用 比如在仓库的主人(A ...

  4. linux中fork, source和exec的区别

    shell的命令可以分为内部命令和外部命令. 内部命令是由特殊的文件格式.def实现的,如cd,ls等.而外部命令是通过系统调用或独立程序实现的,如awk,sed. source和exec都是内部命令 ...

  5. fork他人仓库clone到本地

    1.在他人代码仓库中点击fork. 2.回到自己的仓库,打开刚才fork的仓库.复制地址. 3.打开你要clone到本地的文件夹,右键bush here,打开git. 4.输入 git clone 复 ...

  6. SVN中trunk、branch、tag区别

    虽然一直都在用svn作项目管理,但是一直都是傻傻的分不清主干.分支.今天小编就来详细介绍一下: [branch] 分支:版本控制系统的一个特性就是能够把各种修改分离出来放在开发品的一个分割线上.这条线 ...

  7. copy() 与 clone() 的区别

    clone 是传递一个引用,相当于创建一个指向元字符串的一个指针,而copy使赋值一个对象. DataTable dt = new Data Table(); DataTable dtcopy = d ...

  8. opencv Mat类赋值函数copyTo、clone的区别

    被赋值Mat之前已经被分配足够空间时,copyTo()不重新给分配空间,继续使用之前的空间,当已分配空间不足时,则会重新分配空间:clone()则均重新分配空间. Mat M(1, 3, CV_8UC ...

  9. Opencv copyTo() 与clone()的区别

    copyTo 也是深拷贝,但是否申请新的内存空间,取决于dst矩阵头中的大小信息是否与src一至,若一致则只深拷贝并不申请新的空间,否则先申请空间后再进行拷贝. clone 是完全的深拷贝,在内存中申 ...

最新文章

  1. 导购的路上,媒体向左,社区向右
  2. OpenGL编程低级错误范例手册
  3. javascript V8引擎垃圾收集机制
  4. opencv1-加载、修改、保存图像
  5. C#LeetCode刷题之#283-移动零(Move Zeroes)
  6. 亚马逊AWS免费套餐EC2安装centos连接登录并创建root
  7. JavaScript数据结构——链表(Linked List)
  8. Word 模板 - 新建向导
  9. 易懂的比特币工作机理详解
  10. spring3.0学习之环境搭建
  11. 编写if语句时then子句为空语句_Python入门 5——循环语句及条件判断
  12. Producter:让产品从0到1
  13. 怎么把.nii文件转成.dcm文件
  14. 使用pdfFactory Pro虚拟打印机给文档加上水印
  15. linux中花括号的用法,linux 下 {}大括号的用法
  16. 使用线程安全型双向链表实现简单 LRU Cache 模拟
  17. CSDN阅读全文自动展开插件,安排上!
  18. Awesome Chrome 插件集锦
  19. 常见锐捷光模块型号大全
  20. javascript读取本地文件打印到浏览器中

热门文章

  1. MAC jupyter notebook
  2. 【Eclipse】将控制台输出直接保存到文本文件
  3. Aidl调用何时使用本地对象问题
  4. mysql中utf8_general_cs和utf8_general_ci和utf8_bin的一点区
  5. POJ 2195 Going Home / HDU 1533(最小费用最大流模板)
  6. iphone数据存储之-- Core Data的使用(一)
  7. 快速游戏开发工具GameMaker,Action Game Maker使用体验
  8. restful是什么php,什么是RESTful?
  9. oracle语句优化pl sql语句,求oracle插入初始数据pl/sql语句优化,该怎么处理(2)
  10. springboot创建多个对象