GitHub:我为什么要分叉?

Avi*_*ohn 21 git github

我知道分叉是在服务器端克隆存储库.但我不明白为什么我会这样做.

为什么不将原始存储库克隆到我的机器,添加我的代码,而不是将新分支推送到GitHub并发出拉取请求?

jub*_*0bs 28

我知道分叉是在服务器端克隆存储库[...]

那是对的.在GitHub上,fork是其他一些GitHub仓库的副本,其中引用了从中复制的仓库.

在此输入图像描述

备注:fork的概念起源于GitHub; 它不是 Git概念.

[...]但我不明白为什么我会这样做.为什么不将原始存储库克隆到我的机器,添加我的代码,然后将新分支推送到GitHub并发出拉取请求?

除非您对相关存储库具有写入权限,否则您不能简单地向其推送任何内容; 服务器将拒绝您的推送,并显示表单的错误消息

remote: Permission to bos/text.git denied to Jubobs.
fatal: unable to access 'https://github.com/bos/text/': The requested URL returned error: 403
Run Code Online (Sandbox Code Playgroud)

这就是叉子发挥作用的地方.通过分配别人的回购,您可以获得一份您具有写入权限的副本,即您可以推送您的贡献.整个工作流程如下:

  1. 确定Bob的回购中可以改进的区域.
  2. 那个回购的叉子.
  3. 在本地计算机上复制fork.
  4. 在该克隆中,进行更改,运行测试,创建提交(可能在新分支上)等.
  5. 可选地,一旦您对Bob的代码修改感到满意,就可以使您的工作更具代表性:整理/压缩您的提交,写出尊重Bob回购样式的良好提交消息.您可能还想将您的分支机构重新分配到Bob的分支,如果Bob已经将更改推送到他的仓库,因为您分配了他的仓库.
  6. 推到你的前叉.
  7. 向Bob发出拉取请求,并等待他查看.
  8. 推送更多提交,并可能重新设置你的分支,直到Bob对你的工作满意为止.
  9. Bob合并你的拉取请求; 你的工作被整合到他的GitHub仓库中.香槟酒!你的工作没有白费.
  10. 为了节省GitHub服务器上的空间,如果您不打算很快为Bob的回购做出贡献,您可以安全地删除您的分支.

  • 一个很棒的How-To @Jubobs.Github应该以同样的方式拥有它! (3认同)
  • 我喜欢您通过添加典型的整个工作流程来解释这一点的方式。谢谢。 (2认同)

The*_*ous 17

来自Github文档

fork是存储库的副本.分叉存储库允许您在不影响原始项目的情况下自由地尝试更改.

最常见的是,叉子用于建议对其他人项目的更改或使用其他人的项目作为您自己想法的起点.

https://help.github.com/articles/fork-a-repo/

  • 通常,除非您已在该回购中添加为协作者,否则无法推送新分支.分叉和创建拉取请求是提出变更的礼貌方式.原始作者是否可以添加更改 (5认同)
  • 那么为什么不“克隆”存储库,将我的新功能实现为新分支,推送分支(你能这么说吗?)并在其上发出拉取请求? (2认同)

pqn*_*net 5

通过将存储库标记为“从...派生”,Forking可以清楚地表明您的存储库是从另一个存储库派生的,更重要的是,它将在原始项目的派生列表中列出您的存储库。

这样做的优点之一是,当您仍在进行原始项目时,如果原始项目停止运行,人们仍然可以在主存储库的派生列表中找到您的存储库。

从github的角度来看,他们可以节省一些磁盘空间,这是因为您知道原始存储库与原始存储库之间的git对象相同并且可以共享

而且,我认为您不能从不是原始存储库的存储库中发出拉取请求。至少我做不到,我不得不叉子,推到叉子,请求拉动请求。


小智 5

另一个角度——为什么在一家你可能拥有推送许可的公司内进行分叉。

我也更喜欢我公司的分叉工作流程。这使上游存储库保持干净状态。它只有官方分支和标签,并且不会被 100+ 或 1000+ 的开发分支等弄乱。当你获取上游时,你可以清楚地看到发生了什么,就像没有分叉一样,当获取时你会得到太多的变化,以至于太混乱了。有些团队将他们的存储库视为外部开源存储库 - 即他们不允许将任何内容推送到他们的存储库 - 只允许来自分叉的拉取请求。