我一直听到有人说他们在Git中分叉代码。Git“fork”听起来很可疑,就像Git“clone”加上放弃未来合并的心理意愿(毫无意义)。Git中没有fork命令,对吧?
GitHub通过将通信钉在分叉上,让分叉变得更加真实。也就是说,你按下分叉按钮,然后,当你按下拉请求按钮时,系统足够智能,可以给所有者发送电子邮件。因此,这有点像是围绕存储库所有权和权限跳舞。
是/否?对GitHub向这个方向扩展Git有什么担忧吗?或者有传言说Git吸收了这个功能?
我一直听到有人说他们在Git中分叉代码。Git“fork”听起来很可疑,就像Git“clone”加上放弃未来合并的心理意愿(毫无意义)。Git中没有fork命令,对吧?
GitHub通过将通信钉在分叉上,让分叉变得更加真实。也就是说,你按下分叉按钮,然后,当你按下拉请求按钮时,系统足够智能,可以给所有者发送电子邮件。因此,这有点像是围绕存储库所有权和权限跳舞。
是/否?对GitHub向这个方向扩展Git有什么担忧吗?或者有传言说Git吸收了这个功能?
当前回答
我一直听到有人说他们在用git分叉代码。Git“fork”听起来像Git“clone”,加上放弃未来合并的心理意愿(毫无意义)。git中没有fork命令,对吗?
“分叉”是一个概念,不是任何版本控制系统都特别支持的命令。
最简单的分叉与分支同义。每次创建分支时,无论VCS如何,都会“分叉”。这些分叉通常很容易合并在一起。
你所说的那种分叉,即一个单独的一方获取代码的完整副本并走开,必然发生在VCS之外的Subversion这样的集中式系统中。像Git这样的分布式VCS对分叉整个代码库和有效启动新项目有更好的支持。
Git(而不是GitHub)本机支持以两种方式“分叉”整个repo(即克隆它):
克隆时,将为您创建一个名为origin的远程默认情况下,克隆中的所有分支都将跟踪其原始分支从您派生的原始项目中获取和合并更改非常简单
Git使得将更改返回到fork的源代码变得简单,就像请求原始项目中的某个人从您那里提取,或者请求写访问权限将更改推回到您自己。这是GitHub使之更容易和标准化的部分。
Github向这个方向扩展git有什么焦虑吗?或者有传言说git吸收了这个功能?
没有焦虑,因为你的假设是错误的。GitHub通过一个漂亮的GUI和一种标准化的拉请求发出方式“扩展”了Git的分叉功能,但它并没有将该功能添加到Git中。完全回购分叉的概念在基本层面上直接融入到分布式版本控制中。你可以随时放弃GitHub,继续推/拉你“分叉”的项目。
其他回答
简单地说,
当你说你正在分叉一个存储库时,你基本上是在GitHub帐户中的GitHub ID下创建一个原始存储库的副本。
and
当你说要克隆一个存储库时,你是在你的系统(PC/笔记本电脑)中直接创建原始存储库的本地副本,而GitHub帐户中没有副本。
除了克隆是从服务器到您的机器,分叉是在服务器上复制之外,一个重要的区别是,当我们克隆时,我们实际上得到了所有的分支、标签等。
但当我们分叉时,我们实际上只得到主分支中的当前文件,除此之外什么都没有。这意味着我们没有其他分支等。
因此,如果您必须将某些内容合并回原始存储库,这是一个存储库间合并,并且肯定需要更高的权限。
Fork不是Git中的命令;这只是GitHub实现的一个概念。请记住,Git是为在对等环境中工作而设计的,无需将内容与任何主副本同步。服务器只是另一个对等体,但我们将其视为主副本。
在此上下文中,“Fork”的意思是“复制他们的代码,以便我可以添加自己的修改”。没什么好说的。每一个克隆本质上都是一个分叉,由原始人决定是否从分叉中提取更改。
当你决定为某个项目做出贡献时,就完成了分叉。您将制作整个项目及其历史日志的副本。此副本完全在您的存储库中创建,一旦您进行了这些更改,就会发出拉取请求。现在,由源代码所有者来接受拉取请求,并将更改合并到原始代码中。
Gitclone是一个实际的命令,允许用户获取源代码的副本。git克隆这将在您自己的本地存储库中创建[URL]的副本。
这里有一个关于“fork”是什么的误解。实际上,fork只不过是一组按用户划分的分支。当您推到一个fork时,实际上是推到原始存储库,因为这是唯一的存储库。
您可以通过推到一个fork,注意提交,然后转到原始存储库并使用提交ID来尝试这一点,您将看到提交“在”原始存储库中。
这很有道理,但还远远不够明显(我最近才偶然发现这一点)。
当John分叉存储库SuperProject时,实际发生的情况似乎是源存储库中的所有分支都使用“John.master”、“John.new_gui_project”等名称进行复制。
GitHub向我们“隐藏”了“John”,并给我们一种错觉,我们在GitHub上拥有自己的存储库“副本”,但我们没有,甚至也不需要。
因此,我的fork分支“master”实际上被命名为“Korporal.master”,但GitHub UI从未显示这一点,只显示“master”。
根据我最近所做的事情,我认为这是一个非常好的设计。
出于这个原因,我认为微软在其Visual Studio Team Services产品中实现Git分叉非常容易。