GitHub上的Forking和Cloning有什么区别?


186

我想知道做一个项目的叉子和做clone它的区别。

如果我分叉了一个项目,是否只能通过GitHub发送请求请求?



2
对于在这里着陆的人,希望通过Git(而不是GitHub)来解释“ fork”。Git上没有“ fork”命令。它更多是一个GitHub(不是Git)的概念。区分很容易被遗忘。
ambassallo

Answers:


113

基本上是。A fork只是要求GitHub复制项目并将其注册到您的用户名下;GitHub还跟踪两个存储库之间的关系,因此您可以可视化两个项目(和其他分支)之间的提交和提取。

即使您不使用,您仍然可以要求人们从克隆的存储库中提取信息,fork但是您必须自己将其公开使用。或向开发人员发送git format-patch可以应用于其树的补丁程序(请参阅参考资料)。


4
与克隆相比,叉需要更多的工作来更新。可以使用简单的更新克隆git pull。叉子需要多个命令。毫不奇怪,几乎我看过的所有叉子都是过时的。叉子就像类固醇上的Maven存储库问题一样。而不是一个过时的仓库(Maven),而是成千上万的仓库(Git)。
jww

@jww听起来最好还是坚持克隆-为什么要使用fork?
serup

@serup-原因是可以复制分叉的副本git pull,因此仍然存在某种关系。如果克隆了整个副本,则它将位于您自己的本地计算机上,并与原始存储库断开连接。
JonH

134

当您说要派生存储库时,基本上是在GitHub ID下创建存储库的副本。这里要注意的要点是,对原始存储库所做的任何更改都将反映回您的分叉存储库(您需要获取并重新设置基础)。但是,如果您对派生的存储库进行任何更改,则必须显式创建对原始存储库的拉取请求。如果您的拉取请求已由原始存储库的管理员批准,则您的更改将与现有原始代码一起提交/合并。在此之前,您的更改将只在您的副本中反映分叉

简而言之:

Fork&Pull模型允许任何人分叉现有存储库,并将更改推送到其个人分叉,而无需授予源存储库访问权限。然后,更改必须由项目维护人员拉入源存储库。

请注意,在分叉之后,您可以在计算机上本地克隆存储库(名称下的存储库)。在其中进行更改,然后将其推送到您的分叉存储库中。但是,要在原始存储库中反映您的更改,必须批准您的提取请求。

几个其他有趣的讨论-

git fork实际上是git克隆吗?

如何更新GitHub分叉存储库?


24
“这里要注意的主要点是,对原始存储库所做的任何更改都将反映回您的分叉存储库中。” 我认为这有点误导。AFAIK,在派生后对原始存储库所做的更改不会自动反映在派生中;您必须手动移动这些更改。单击派生按钮时在派生之前发生的更改会复制到新派生。
Ajedi32

“对原始存储库所做的任何更改都将反映到您的分叉存储库中。”真的吗?我希望不会自动
KansaiRobot

我当时正在为客户的项目工作,并使用克隆和推送模型进行工作。一天,我分叉了它,我立即收到一条消息,说有什么需要分叉整个仓库。我真的不明白这怎么认为是错误的?
user3075740 '18

在派生后对原始存储库所做的更改不会自动反映在派生中,但要这样做,请查看此博客的第3步:-help.github.com/articles/fork-a-repo
Suhas Chikkanna

“对原始存储库所做的任何更改都将反映到您的分叉存储库中”-您是说克隆后无法做到这一点吗?
可变

26
  • 分叉的项目在您的在线存储库(仓库)上。
  • 克隆的项目在您的本地计算机上(我通常在分叉存储库后进行克隆)。

您可以提交在线仓库(或提交本地仓库,然后推送到在线仓库),然后发送请求请求。

项目经理可以接受它,以获取其主要在线版本中的更改。


13

克隆是您在两个(可能不同)版本库之间进行适当的复制和分隔的地方。修改一个存储库后,必须使用push命令将新内容主动复制到另一个存储库中。并获取其他回购中的更改。

当您在服务器上分叉存储库时,不需要重复内容,因为两个存储库都将使用同一台服务器上的相同[固定对象]内容。技巧是管理不同的用户观点,以便每个用户都认为自己拥有该回购协议的完整个人副本。叉之间的推入和提取只是更新用户的指针。

在较低的级别上,git内部执行相同的操作。如果您有三个不同的文件,每个文件包含Hello World,则git只需“分叉”其Hello World Blob的单个副本,然后根据需要在三个位置中的每个位置提供它。

能够在服务器上分叉的能力意味着,Github的大量存储配额并不是平均而言那么大,因为每个机构都共享一个基础存储库。


5

简而言之,Forking可能与“在GitHub ID /配置文件下克隆”相同。很明显,分叉总是比克隆更好,但有一些例外。与克隆存储库不同,分支存储库始终会与原始存储库进行监视/比较。这样,您就可以跟踪更改,发起拉取请求,还可以手动将原始存储库中所做的更改与派生的存储库进行同步。


5

@AniketThakur的回答非常好。还没有人回答以下问题。

如果我分叉了一个项目,是否只能通过GitHub发送请求请求?

否。如果您是存储库的提供者,则可以:创建本地克隆。建立一个本地分支。将提交添加到该分支。将本地分支推回github(在此过程中创建一个远程分支)。发出拉取请求,请求将该分支合并到master分支(或您喜欢的任何分支)中。


3

如果您完成了发问者的提示(忘记分叉,而只是在本地克隆了一个仓库,进行了更改,现在需要发出拉取请求),那么您可以回到正轨:

  1. 派发您要发送拉取请求的仓库
  2. 将本地更改推送到远程
  3. 发出拉取请求

2

GitHub上另一个奇怪的细微差别是,直到将更改拉入原始存储库,才对活动日志中的派生更改进行计数。此外,显然,要将分叉更改为合适的克隆,您必须联系Github支持人员。

为什么我的贡献没有显示出来

提交是用叉子完成的

分叉中的承诺不会计入您的贡献。要使它们计数,您必须执行以下操作之一:

打开拉取请求,以将您的更改合并到父存储库中。要分离叉子并将其变成GitHub上的独立存储库,请联系GitHub支持。如果叉子有自己的叉子,请让支持人员知道叉子是应该随存储库一起移动到新网络还是保留在当前网络中。有关更多信息,请参见“ 关于叉子”


2

简而言之,“ fork”会创建托管在您自己的GitHub帐户上的项目的副本。

“克隆”使用计算机上的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.