GitHub上的fork和branch之间的区别


127

如果我分叉一个托管在github上的项目。我会分叉所有树枝吗?我怎么知道我的叉子基于哪个分支?换句话说,哪个分支将下载到我的PC?


1
简单的英语解释:分支就像来自父分支的分支。叉子就像没有父分支的分支。
肯健'18

Answers:


41

GitHub上的所有分支都将被复制到fork中。(显然,这不包括一开始从未被推送到GitHub的分支。)

但是fork是GitHub到GitHub的操作;什么都不会复制到您的PC。它与Git 克隆并不完全相同。如果您想问“克隆项目时复制了什么?”,请参阅手册git-clone(1)


153

这样想:

仓库对应于团队在一个或多个分支机构中的协作工作。所有贡献者都有自己的副本。

主仓库的每个分支都对应于贡献者的工作。fork实际上是一个Github(不是Git)构造,用于在您的用户帐户中存储仓库的副本。作为一个克隆,它将在您创建fork时包含主仓库中的所有分支。

分支和/或主仓库中的每个分支都可以对应多种事物,具体取决于您的工作方式。每个分支都可以引用项目的一个版本,但也可以对应于不同的开发渠道,例如修补程序或实验性工作。

拉请求(在GitHub的生态系统)对应的任务。每当我想为主仓库提供一个隔离的完成任务时,我都会创建一个与该任务中的提交相对应的拉取请求。这些提交从我的fork或我的分支拉主仓库

提交是一组改变到代码。这是有关Git的最有趣的事情之一。您不传输文件,而是传输更改日志。


4
喜欢您如何解释所有相关的位,例如将请求请求映射到fork / branch。“您不传输文件,您传输更改日志” ...我已经知道,但是这句话很完美!
harshvchawla

2
用来说明fork是github而不是git的加号。谢谢!
emery.noel19年

10

Fork是GitHub方面的一个克隆(它将克隆所有内容)。
克隆存储库时,将获得该存储库的所有历史记录及其所有分支。

即使理论上您可以更改远程存储库的默认分支,但来自GitHub存储库的克隆仍主要查找master分支。这意味着要更改GitHub克隆将获得的“默认”分支,您需要重命名master分支。


因此,当我克隆叉式仓库(有效地将其下载到PC上)时,分支机构也位于PC上吗?但是在一个分支中,添加了其他文件。那我的电脑上是否有这些文件?
乔纳森。

1
@Jonathan:您的PC将获得所有文件的所有分支。但是,您的工作目录(签出这些分支之一的空间)实际上是您将看到这些文件的唯一空间。
VonC

那么,其他文件实际上将存储在.git文件夹中吗?
乔纳森。

@Jonathan:作为松散或打包的对象,请参见book.git-scm.com/7_how_git_stores_objects.html(对象是blob(您的“文件”),树,提交或标签):book.git-scm.com/ 1_the_git_object_model.html
VonC

4

如果您分叉一个项目,则将整个项目复制到git hub帐户。您没有对PC进行任何处理

要在您的PC中进行复制,您必须将其克隆并提取所有内容,然后您将获得该项目的所有分支和代码


2

如果您从Github网站创建项目的分支,则会从上游项目获得所有分支。

如果从新铸造的分支克隆到本地PC,PC上的origin遥控器将指向Github上的分支的主分支。


根据Help.GitHub页面Forking a project,创建upstream分支是您必须要做的;他们告诉您如何做。
JC Salomon

2
那是一个远程,而不是分支。
Arrowmaster

1

这可以很好地解释。您在GitHub上有一个中央存储库。每当您在个人计算机上对其进行克隆以进行某些更改时,主存储库的此本地克隆称为分叉。

分支是不同的,包含在fork / repo中。实际上,分支机构是您处于不同开发阶段的工作。它们是在需要时创建的,以保存一组功能,授予不同用户访问权限,向客户端演示站点等。


1

我想分享一个现实的例子,当我们使用分支和何时使用Forks

我们的车间有GitLab,有时我们需要处理Laravel项目中的软件包。通常,当创建实际的Laravel项目时,我们会创建一个分支并将更改推送到我们在本地VM开发环境中已经测试过的分支。

假设我们的项目位于

https://github.com/yardpenalty/mainproject.git

分支机构的用法:

假设分支称为 It_doesnt_matter

一旦按照我们想要的生产方式拥有了分支机构,我们便将其最终推送到该分支机构,并创建一个合并请求,然后将其合并到UAT中进行测试。一旦测试通过了QC,更改就被合并到了生产中。

来自分支合并现在被推送到主项目It_doesnt_matter

https://github.com/yardpenalty/mainproject.git

假设套件项目位于

https://github.com/yardpenalty/mypackage.git

请记住,mainproject在生产中使用了此程序包,因此我们不能仅仅通过将其推入该程序包来进行更改(其他原因)。假设某个Web开发人员必须编辑此程序包才能进行生产更改。

一个简单的分支不会起作用,因为如果不发布包等就看不到更改。

叉的用法: 现在是时候需要对我们的程序包进行一些欺骗性操作了,因此我们可以通过fork创建生产程序包的副本。可以将composer.json文件更新为指向现在位于用户或组路径中的fork。

因此,我们将在其中创建一个fork https://github.com/yardpenalty/mypackage.git

叫它 https://github.com/yardpenalty/yards/mypackage.git

现在,我们可以更新composer.json文件,使其指向“存储库”中的此包:[这样的数组,我们走了!

 {
            "type": "github",
            "url": "https://github.com/yardpenalty/yard/mypackage.git"
 }

]

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.