GitHub上fork和branch的区别

144

如果我在GitHub上fork一个项目,是否会同时fork所有分支?我如何知道我的fork是基于哪个分支的?换句话说,哪个分支会被下载到我的电脑上?


1
简单的英文解释: 分支就像是从父分支派生出来的一个分叉。 分叉就像是一个没有父分支的分支。 - Ken Kin
7个回答

170

这么说吧:

Repo(仓库) 是团队在一个或多个分支上协作工作的集合。所有贡献者都有自己的副本。

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

在fork和/或主repo中的每个分支可以对应几种不同的东西,具体取决于您想要工作的方式。每个分支可以引用项目的一个版本,也可以对应于开发的不同渠道,如热修复或实验性工作。

在GitHub生态系统中,拉取请求 对应于任务。每当我想要将一个独立完成的任务贡献给主repo时,我会创建一个对应于该任务中进行的提交的拉取请求。这些提交从我的fork分支拉到主repo中。

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


5
我喜欢你解释相关内容的方式,比如拉取请求对应分叉/分支。"你不是在传输文件,而是在传输更改的日志记录"......我已经知道了,但这个短语非常完美! - gawkface
3
感谢 plus-one 澄清 fork 是 GitHub,而不是 Git。谢谢! - emery.noel

51

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

但是,fork 是一个 GitHub 到 GitHub 的操作;没有内容被复制到您的个人电脑。它与 Git 的 clone 不完全相同。如果你想问“当我克隆一个项目时会复制什么?”,请参阅 git-clone(1) 的手册。


10

Fork是在GitHub上的一个克隆(它会克隆所有内容)。

当您克隆一个存储库时,您将获取该存储库的全部历史记录,包括其所有分支。

尽管理论上您可以更改远程存储库的默认分支,但从GitHub存储库克隆的副本主要查找默认的master分支。这意味着要更改GitHub克隆将获取的“默认”分支,您需要重命名master分支。


当我克隆派生的存储库(有效地将其下载到我的电脑上)时,所有分支都在我的电脑上吗?但是在一个分支中添加了额外的文件。那么我的电脑是否会有这些文件? - Jonathan.
1
@Jonathan:你的电脑将获取所有分支和所有文件。但是你的工作目录(你检出其中一个分支的空间)实际上是你将看到这些文件的唯一空间。 - VonC
其他文件将实际存储在.git文件夹中的哪个位置? - Jonathan.
@Jonathan:作为松散或紧凑的对象,请参见http://book.git-scm.com/7_how_git_stores_objects.html(对象是blob(您的“文件”),树,提交或标签:http://book.git-scm.com/1_the_git_object_model.html) - VonC

4
如果您 fork 一个项目,您会将整个项目复制到您的 git hub 账户中。您不会将任何东西复制到您的个人电脑上。
要在您的电脑上复制该项目,您需要克隆它并拉取所有内容,然后您就可以获得该项目的所有分支和代码。

3

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

分支是另一回事,并包含在 fork/repo 中。实际上,分支是您在开发的不同阶段的工作。它们根据需要创建,以保存一组功能,向不同用户提供访问权限,向客户演示站点等。


2
我想分享一个实际的例子,说明什么时候使用分支和什么时候使用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

请记住,主项目在生产中使用此软件包,因此我们无法通过简单地将更改推送到此软件包(以及其他原因)来进行更改。假设Web开发人员必须编辑此软件包以在生产环境中进行更改。
简单的分支也行不通,因为我们没有发布软件包就看不到我们的更改等。
分叉用法: 现在我们必须对软件包进行一些诡计,以便通过分支创建生产软件包的克隆。可以更新composer.json文件以指向现在位于用户或组路径下的分支。
所以我们将在https://github.com/yardpenalty/mypackage.git中创建一个分支
并将其命名为https://github.com/yardpenalty/yards/mypackage.git
现在,我们可以更新我们的composer.json文件以指向这个包在我们的“repositories”:[数组中,这样我们就可以开始了!
 {
            "type": "github",
            "url": "https://github.com/yardpenalty/yard/mypackage.git"
 }

]


2
如果您在Github网站上创建了一个项目的分支,您将获得来自上游项目的所有分支。
如果您从新创建的分支克隆到本地计算机,则您的PC上的origin远程将指向Github上您的分支的主分支。

根据 Help.GitHub 页面上的内容 Forking a project,创建 upstream 分支是必须要做的事情;并且他们告诉你如何去做。 - J. C. Salomon
2
那是一个远程分支,不是本地分支。 - Arrowmaster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接