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

我一直听到人们说他们在Git中分叉代码。Git“分叉”听起来很可疑,就像Git的“克隆”加上一些(无意义的)放弃未来合并的心理意愿。Git中没有分叉命令,对吧?

GitHub通过将对应关系装订到分叉上,使分叉更加真实。也就是说,你按下分叉按钮,然后,当你按下拉取请求按钮时,系统足够智能地向所有者发送电子邮件。因此,它有点像存储库所有权和权限的舞蹈。

是/否?对GitHub向这个方向扩展Git有任何担忧吗?或者有任何关于Git吸收该功能的谣言?

355973 次浏览

“分叉”在这种情况下的意思是“复制他们的代码,以便我可以添加自己的修改”。没什么好说的。每个克隆本质上都是一个分叉,由原始人决定是否从分叉中提取更改。

克隆涉及将git存储库复制到本地机器,而forking是将存储库克隆到另一个存储库中。克隆仅供个人使用(尽管将来可能会发生合并),但通过forking,您正在复制并打开一个新的可能的项目路径

分叉在GitHub上下文中不扩展Git。
它只允许在服务器端克隆。

当您在本地工作站上克隆GitHub存储库时,除非您被显式声明为“贡献者”,否则您无法贡献回上游存储库。这是因为您的克隆是该项目的单独实例。如果您想为项目做出贡献,您可以使用分叉来完成,方式如下:

  • 在您的GitHub帐户上克隆该GitHub存储库(即“分叉”部分,服务器端的克隆)
  • 贡献提交到该GitHub存储库(它在您自己的GitHub帐户中,因此您完全有权推送到它)
  • 将任何有趣的贡献发回原始GitHub存储库(即通过您对自己的GitHub存储库所做的更改"拉取请求"部分

检查“协作GitHub工作流”。

如果要保留与原始存储库(也称为上游)的链接,则需要添加引用该原始存储库的远程。
返回“GitHub上的起源和上游有什么区别?

分叉和上游

在Git 2.20(2018年第四季度)和更多版本中,从分叉获取更高效,与<强>三角洲岛屿

我一直听到人们说他们在git中分叉代码。Git“分叉”听起来很可疑,就像git“克隆”加上一些(无意义的)放弃未来合并的心理意愿。git中没有分叉命令,对吧?

“分叉”是一个概念,而不是任何版本管理系统专门支持的命令。

最简单的分叉是分支的同义词。每次创建分支时,无论您的VCS如何,您都“分叉”了。这些分叉通常很容易合并回一起。

你所谈论的那种分叉,其中一个单独的方拿走了代码的完整副本并走开,必然发生在VCS之外,在像Subversion这样的集中式系统中。像Git这样的分布式VCS对分叉整个代码库和有效启动新项目有更好的支持。

Git(不是GitHub)原生支持通过多种方式“分叉”整个仓库(即克隆它):

  • 当您克隆时,将为您创建一个名为origin的远程
  • 默认情况下,克隆中的所有分支都将跟踪它们的origin等价物
  • 从您分叉的原始项目中获取和合并更改非常容易

Git使将更改贡献回分叉的源代码变得简单,就像要求原始项目中的某个人从您那里拉取,或者请求写访问权限以自己将更改推回一样。这是GitHub使其更容易和标准化的部分。

对Github向这个方向扩展git有任何担忧吗?或者有任何关于git吸收功能的谣言?

并不需要担心,因为你的假设是错误的。GitHub通过一个漂亮的GUI和标准化的拉取请求方式“扩展”了Git的分叉功能,但它并没有将功能添加到Git。完全存储分叉的概念在基本层面上被直接融入了分布式版本控制中。你可以在任何时候放弃GitHub,仍然可以继续推/拉你“分叉”的项目。

是的,分叉是一个克隆。它的出现是因为,你不能在未经他人允许的情况下推送他人的副本。他们为您制作了复制),您也将拥有写入权限。

将来,如果实际所有者或其他用户喜欢您的更改,他们可以将其拉回自己的存储库。或者,您可以向他们发送“拉取请求”。

例如,如果你直接在本地克隆其他存储库,远程对象源仍然使用你克隆的帐户。你不能提交和贡献你的代码。它只是代码的纯副本。否则,如果你分叉存储库,它将在你github帐户中更新你的帐户设置来克隆存储库。然后在你帐户的上下文中克隆存储库,你可以提交你的代码。

当你决定为某个项目做出贡献时,分叉就完成了。你需要复制整个项目及其历史日志。这个副本完全在你的存储库中制作,一旦你做出这些更改,你就会发出一个拉取请求。现在由源的所有者接受你的拉取请求并将更改合并到原始代码中。

Git clone是一个实际的命令,允许用户获取源代码的副本。git clone[URL]这应该在您自己的本地存储库中创建[URL]的副本。

除了克隆是从服务器到您的机器,分叉是在服务器本身上复制之外,一个重要的区别是,当我们克隆时,我们实际上获得了所有分支、标签等。

但是当我们分叉时,我们实际上只获得master分支中的当前文件,仅此而已。这意味着我们不会获得其他分支等。

因此,如果您必须将某些内容合并回原始存储库,这是一个存储库间合并,肯定需要更高的权限。

Fork不是Git中的命令;它只是GitHub实现的一个概念。请记住,Git旨在在点对点环境中工作,而无需与任何主副本同步。服务器只是另一个对等方,但我们将其视为主副本。

这里有一个关于“分叉”是什么的误解。分叉实际上只不过是一组每个用户的分支。当你推送到分叉时,你实际上确实推送到原始存储库,因为那是唯一的存储库。

您可以通过推送到分叉来尝试此操作,注意提交,然后转到原始存储库并使用提交ID,您将看到提交“在”原始存储库中。

这很有意义,但远非显而易见(我最近才偶然发现这一点)。

当John分叉存储库SuperProject时,似乎实际发生的是源存储库中的所有分支都以“John.master”,“John.new_gui_project”等名称复制。

GitHub对我们“隐藏”了“John”,并给我们一种错觉,我们在GitHub上拥有自己的存储库“副本”,但我们没有,甚至也不需要。

所以我的分叉分支“master”实际上被命名为“Korporal.master”,但GitHub UI从未显示过这一点,只显示给我“master”。

这几乎是我认为在引擎盖下发生的事情,基于我最近一直在做的事情,当你思考它时,是非常好的设计。

出于这个原因,我认为微软很容易在他们的Visual Studio Team Services产品中实现Git分支。

简单来说,

当您说您是分叉存储库时,您基本上是在您的GitHub帐户中的GitHub ID下创建原始存储库的副本。

当您说您是克隆存储库时,您正在直接在您的系统(PC/笔记本电脑)中创建原始存储库的本地副本,而无需在您的GitHub帐户中创建副本。