在GitHub上,Fork和Clone有什么区别?

222

我想了解在IT技术中,对项目进行Fork和Clone的区别。

如果我没有Fork一个项目,我只能通过GitHub发送pull request吗?


3
可能是Are git forks actually git clones?的重复问题。 - j08691
7
针对在此查找“Git中的fork”(不是GitHub)解释的用户,需要说明的是,Git 中没有“fork”命令,这更多是 GitHub(而非 Git)的概念。这是一个容易被遗忘的区别。 - ambassallo
9个回答

154
当你说你正在“分叉”一个存储库时,你基本上是在你的GitHub ID下创建一个存储库的副本。这里需要注意的主要点是,对原始存储库所做的任何更改都将反映在你的“分叉”存储库中(你需要获取并重新设置基础)。但是,如果你对你的“分叉”存储库进行任何更改,你必须明确地向“原始”存储库创建拉取请求。如果你的拉取请求被“原始存储库”的管理员批准,那么你的更改将与现有的“原始”代码库合并。在此之前,你的更改只会反映在你“分叉”的副本中。
简而言之:
Fork & Pull模型允许任何人分叉现有存储库并将更改推送到他们的个人分叉,而无需授予对源存储库的访问权限。然后,项目维护者必须将更改拉入源存储库中。
请注意,在分叉后,你可以在本地机器上克隆你的存储库(在你的名字下的存储库)。对它进行更改并将其推送到你的分叉存储库。然而,为了反映你的更改在原始存储库中,你的拉取请求必须被批准。
还有一些有趣的讨论 -

Git分支实际上是Git克隆吗?

如何更新GitHub上的分支库?


35
这里需要注意的主要点是,对原始存储库所做的任何更改都将反映在您派生的存储库中。我认为这有点误导人。据我所知,在分叉之后对原始存储库进行的更改不会自动反映在分叉中;您必须手动移动这些更改。但是,在单击分叉按钮时发生的更改会复制到新的分叉中。 - Ajedi32
1
对原始存储库所做的任何更改都将反映在您派生的存储库中...真的吗?我希望不是自动的。 - KansaiRobot
我正在为客户的项目工作,使用克隆和推送模型进行工作。有一天,我分叉了它,立刻收到一条消息,询问为什么需要分叉整个存储库。我真的不明白这被认为是错误的原因是什么? - user3075740
对原始存储库进行分叉后所做的更改不会自动反映在分叉中,但要实现这一点,请查看此博客的第3步:-https://help.github.com/articles/fork-a-repo/ - Suhas Chikkanna
任何对原始存储库所做的更改都将反映在您派生的存储库中。您是指在克隆后这不可能吗? - variable
1
这听起来就像是克隆。 - GenDemo

124

基本上,是的。 fork 是请求 GitHub 克隆项目,并在您的用户名下注册的操作; GitHub 也会跟踪这两个仓库之间的关系,因此您可以可视化查看这两个项目(以及其他 fork)之间的提交和拉取。

即使您不使用 fork,仍然可以请求其他人从您克隆的存储库中提取内容--但您必须自己处理使其公开可用的问题。或者向开发人员发送补丁(参见git format-patch),让他们应用到自己的代码树中。


7
分支更新比克隆更费力。克隆可以通过简单的“git pull”进行更新。分支需要多次命令才能完成更新。并且并不奇怪,我看到的几乎每个分支都已经过时了。分支就像是放大了的Maven存储库问题。不是一个过时的存储库(Maven),而是成千上万个(Git)。 - jww
2
@jww 听起来最好还是坚持使用克隆 - 为什么要使用分叉呢? - serup
1
@serup - 原因是分叉的副本可以通过 git pull 拉取,因此仍然存在某种关系。如果您克隆了整个副本,则它将位于您自己的本地计算机上,并与原始存储库断开连接。 - JonH

37
  • 分叉项目是存在您的在线存储库(repo)中的。
  • 克隆项目存在于您的本地计算机上(通常在分叉repo之后进行克隆)。

您可以在在线repo上提交(或在本地repo上提交然后推送到在线repo),然后发送拉取请求。

项目经理可以接受它以获取您的更改并将其合并到他的主要在线版本中。


13
克隆是指在两个(也可能不同的)版本库之间进行适当的复制和分离。当一个版本库发生改变时,需要使用推送命令将新内容主动复制到另一个版本库中。并且获取另一个版本库中的更改。
当您在服务器上 fork 一个版本库时,不需要复制内容,因为这两个版本库都将使用来自同一服务器的相同 [固定对象] 内容。关键在于管理不同用户视图,以使每个用户都认为他们拥有完整的个人版本库副本。在 fork 之间进行的推送和提取只是更新用户的指针。
在较低层次上,Git 在内部执行相同的操作。如果您有三个包含“Hello World”的不同文件,则 Git 只需“分叉”其单个“Hello World” blob,并根据需要在三个位置提供它。
在服务器上进行 fork 的能力意味着 Github 的大容量存储平均而言并不那么大,因为每个人都共享同一个基础版本库。

6
尽管 @AniketThakur 的回答非常好,但还没有人回答以下问题。
我只有在 fork 了一个项目之后才能通过 GitHub 发送 pull request 吗?
不是的。如果您是存储库的贡献者,可以执行以下操作:
1.创建本地克隆。
2.创建本地分支。
3.向该分支添加提交。
4.将本地分支推回 github(在此过程中创建远程分支)。
5.发出拉取请求,请求将该分支合并到主分支(或任何您喜欢的分支)。

5

简而言之,Forking 可能与“在您的 GitHub ID/profile 下克隆”相同。除了一些明显的例外情况,分叉总是比克隆更好。与克隆存储库不同,分叉存储库始终受到原始存储库的监视/比较。这使您可以跟踪更改、发起拉取请求并手动同步原始存储库中所做的更改与您的分叉存储库。


3

如果您按照提问者的暗示(忘记 fork 并仅本地克隆一个仓库,进行更改后现在需要发出 pull 请求),您可以重新回到正确的轨道:

  1. fork 您想要发送 pull 请求的存储库
  2. 将您的本地更改推送到您的远程分支
  3. 发出 pull 请求

2
在GitHub上的另一个奇怪而微妙的不同之处在于,直到您的更改被合并到原始存储库中,对分支的更改不会计入您的活动日志。此外,要将分支更改为正确的克隆版本,您需要联系Github支持。根据Why are my contributions not showing up的说法:
在分支中进行的提交不会计入您的贡献。要使它们计入,请执行以下操作之一: - 打开拉取请求,将您的更改合并到父存储库中。 - 联系GitHub支持,将分支分离并将其转换为GitHub上的独立存储库。如果分支有自己的分支,请告知支持人员是否应将这些分支与您的存储库一起移动到新网络中或保留在当前网络中。有关更多信息,请参见“关于分支”。

2
简而言之,“fork”会在您自己的GitHub账户上创建一个项目的副本。
“Clone”使用计算机上的git软件将源代码及其完整的版本历史下载到该计算机上。
最初的回答:Fork是创建项目副本到您的GitHub账户,Clone则是使用git软件将源代码和版本历史下载到计算机上。

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