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

Bri*_*ian 801 git github git-clone git-fork

我一直听到有人说他们在Git中提供代码.Git"fork"听起来像Git"克隆",还有一些(毫无意义的)放弃未来合并的心理意愿.Git中没有fork命令,对吧?

GitHub通过将对应关系固定到它上来使叉子变得更加真实.也就是说,您按下前叉按钮后,当您按下拉取请求按钮时,系统足够智能,可以通过电子邮件发送给所有者.因此,它是围绕存储库所有权和权限的一点点舞蹈.

是/否?对GitHub的任何焦虑都会向这个方向扩展Git?或者Git吸收功能的任何谣言?

Von*_*onC 911

在GitHub上下文中, Fork不会扩展Git.
它只允许在服务器端克隆.

在本地工作站上克隆GitHub存储库时,除非明确声明为"贡献者",否则无法返回上游存储库.那是因为你的克隆是该项目的一个单独的实例.如果您想为项目做出贡献,可以通过以下方式使用分叉来执行此操作:

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

另请参阅 " Collaborative GitHub Workflow ".

如果要保留与原始存储库(也称为上游)的链接,则需要添加引用该原始存储库的远程数据库.
请参阅" GitHub上的源和上游有什么区别? "

叉和上游

使用Git 2.20(2018年第四季度)以及更多,使用delta岛更有效率.

  • @TestSubject528491没有,用fork,这意味着你将上游repo克隆为GitHub服务器端的*你自己的*repo.然后你可以在你的计算机上本地克隆这个新的"fork"repo并自由地推回它,因为你是该fork的创建者和所有者. (61认同)
  • 对我而言,关键是你不能从你的本地副本提交公关 - 如果你被宣布为贡献者_.我习惯于从当地的回购中提交PR,但那是因为我总是被标记为贡献者.如果您考虑一下,要提交PR,您必须将分支推送到远程仓库,然后创建PR.我想如果你不希望随机的人在你的回购上创建分支,这是有道理的.并且你希望他们分叉并以这种方式提交PR. (8认同)
  • "当您在本地工作站上克隆GitHub存储库时,除非明确声明为"贡献者",否则无法返回上游存储库." ---"分叉"是不是这样?请解释. (6认同)

mea*_*gar 134

我一直听到有人说他们用git代码.Git"fork"听起来像git"clone",加上一些(无意义的)放弃未来合并的心理意愿.git中没有fork命令,对吧?

"分叉"是一个概念,而不是任何版本控制系统特别支持的命令.

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

你正在谈论的那种分支,一个单独的一方获取代码的完整副本并走开,必然发生在VCS之类的集中式系统中,如Subversion.像Git这样的分布式VCS可以更好地支持分支整个代码库并有效地启动新项目.

Git(不是GitHub)本身支持以几种方式"分叉"整个回购(即克隆它):

  • 克隆时,origin会为您创建一个名为的远程调用
  • 默认情况下,克隆中的所有分支都将跟踪其origin等效项
  • 从您分叉的原始项目中获取和合并更改非常简单

Git将更改贡献给fork的源代码就像要求原始项目中的某些人从您那里获取,或者请求写访问权来自行推送更改一样.这是GitHub更容易和标准化的部分.

对Github的任何焦虑都会向这个方向扩展git?或者任何关于git吸收功能的谣言?

没有焦虑,因为你的假设是错误的.GitHub通过一个漂亮的GUI和一个标准化的发布拉取请求的方式"扩展"了Git的分叉功能,但它没有向Git 添加功能.完全复制分叉的概念在基础层面上直接进入分布式版本控制.您可以随时放弃GitHub并继续推送/拉动您"分叉"的项目.

  • 谢谢你的出色答案.我只想澄清,这意味着,**在github的上下文之外**我可以在我的机器上克隆一些`X project`.如果我在我的本地进行更改并且**没有**写入访问权限,我将通过电子邮件发送该项目的作者请求提取.他将制作一个名为_gideon_的遥控器,它将成为我当地克隆的网址,他可以拉,对吗? (6认同)

ssa*_*ota 78

是的,fork是一个克隆.它的出现是因为,未经他们的许可,你不能将他人的副本推送给他人.他们为你制作了一份副本(fork),你也有写权限.

将来,如果实际的所有者或其他用户拥有类似您的更改的分支,他们可以将其拉回到自己的存储库中.或者,您可以向他们发送"拉动请求".

  • @Casey你只能从GitHub本身通过GitHub发送一个pull请求,你只能从GitHub上存在的分支发送一个GitHub pull请求.如果您不是相关存储库的协作者,则无法创建可从中启动GitHub拉取请求的分支.没有什么可以阻止你通过电子邮件以老式的方式做到这一点,但GitHub没有参与其中. (4认同)
  • @Casey,_reason_通常是其他人没有对您的工作站的URL访问权限.GitHub"fork"意味着你的工作副本在GitHub服务器上,你可以"推送"到其他人有URL访问权限,这样他们就可以"拉".`pull request`只是将你的副本的URL(在GitHub上)获取给他们的标准方法,这样他们就可以轻松地将它拉入他们的存储库. (2认同)

Dae*_*yth 37

在这种情况下,"Fork"意味着"复制他们的代码,以便我可以添加自己的修改".没有什么可说的了.每个克隆本质上都是一个fork,它由原来决定是否从fork中提取更改.

  • 具体来说:"在GitHub服务器上复制他们的代码`以便我可以添加自己的修改`,其他人可以访问我的版本`".大多数本地工作站都没有为任何人提供URL访问权限.但是如果你在服务器上推送你的fork,那么他们就可以获得pull的URL. (2认同)

Sam*_*son 26

克隆涉及将git存储库的副本制作到本地计算机,而分叉则将存储库克隆到另一个存储库.克隆仅供个人使用(尽管可能会出现未来的合并),但是在分叉的情况下,您正在复制并打开一个新的可能的项目路径


Dan*_*hen 10

我认为fork是其他存储库的副本,但随着您的帐户修改.例如,如果您在本地直接克隆其他存储库,则远程对象源仍在使用您从中克隆的帐户.您无法提交和贡献您的代码.它只是一个纯粹的代码副本.否则,如果您分叉存储库,它将使用您的github帐户中的帐户设置更新来克隆存储库.然后在您的帐户上下文中克隆回购,您可以提交您的代码.


ali*_*sav 10

当您决定为某个项目做出贡献时,就会完成分叉.您可以复制整个项目及其历史记录日志.此副本完全在您的存储库中完成,一旦您进行了这些更改,您就会发出拉取请求.现在它可以接受您的拉取请求并将更改合并到原始代码中.

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


Dee*_*G M 7

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

但是当我们分叉时,我们实际上只获取主分支中的当前文件,除此之外.这意味着我们没有得到其他分支机构等.

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

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

  • 咦?fork获取所有分支,但你必须知道在哪里看(提示:`git branch -a`). (6认同)

小智 6

关于什么是“叉子”,这里存在误解。实际上,派生不过是一组按用户分支。当您推入叉子时,实际上您确实会推入原始存储库,因为那是唯一的存储库。

您可以通过将其推入一个叉子,注意提交,然后转到原始存储库并使用提交ID来进行尝试,您将看到该提交位于原始存储库中。

这很有道理,但远非显而易见(我是最近才偶然发现的)。

当John分支存储库SuperProject时,实际上发生的事情是使用“ John.master”,“ John.new_gui_project”等名称复制源存储库中的所有分支。

GitHub“隐藏”“ John”。从我们这里得到的错觉给我们一种错觉,即我们在GitHub上拥有自己的存储库“副本”,但我们不需要,甚至也不需要。

因此,我的叉子的分支“ master”实际上被命名为“ Korporal.master”,但是GitHub UI从未显示此信息,只向我显示了“ master”。

无论如何,根据我最近所做的事情,这几乎是我认为可以进行的事情,当您仔细考虑时,这是非常好的设计。

因此,我认为Microsoft在其Visual Studio Team Services产品中实现Git分支将非常容易。