在远程克隆远程分支

时间:2020-04-01 17:19:45

标签: git

我在mainline上已经有一个远程分支origin,现在我想从{{1}上的mainline-clone克隆另一个远程分支(称为mainline)。 }。

这是我计划要做的事情

origin

git checkout -b mainline-clone origin/mainline

但是我不确定这是正确的方法,因为git push -u origin mainline-clone最初设置为跟踪mainline-clone,在{{1之后,origin/mainline分支是否有任何副作用}}? (我只想确保在origin/mainline之后将git push -u origin mainline-clone保留完整)。

谢谢。

1 个答案:

答案 0 :(得分:2)

这不是问题,但是有一个较短的方法:

git push origin origin/mainline:refs/heads/mainline-clone

将完成这项工作。 (在所有情况下,在此处执行任何其他Git命令之前,先运行git fetch可能都是明智的选择。)

长:了解什么

分支“跟踪”信息纯粹是本地的。更准确地说,存储库中的每个分支都没有上游,也没有上游。如果分支 B 具有上游 U ,则Git会说 B 正在“跟踪” U 1

分支的上游可以是:

  • 远程跟踪名称,或
  • 本地分支机构名称

这是仅有的两个选择。

origin这样的远程只是一个Git存储库:它有自己的分支名称。如果这些分支具有上游,则这些上游对其他Git存储库是私有的,您既无法查看也无法从自己的Git进行设置。 (如果Git存储库位于GitHub上,则这些分支没有上游设置。)

在任何Git存储库中,每个分支名称仅包含一个哈希ID。因此,您根本不需要这样做:

git checkout -b mainline-clone origin/mainline

这将创建您自己的本地名称mainline-clone,并将其上游设置为origin/mainline,但您现在还不需要自己的本地mainline-clone。相反,您可以执行以下操作:

git push origin origin/mainline:refs/heads/mainline-clone

这里的最后一个参数origin/mainline:mainline-clone refspec 。粗略地说,refspec是一对用冒号分隔的名称。 git fetchgit push命令是实际使用refspecs的两个命令。

在任何参考规范中,冒号左侧的名称为 source ,冒号右侧的名称为目的地。任何refspec的目的地都必须是一个名称-通常会使用分支或标记名称,或者您可以拼写完整的引用名称,例如refs/heads/somebranchrefs/tags/v2.1或{{ 1}}。源有时可以是原始哈希ID(使用refs/remotes/origin/remotetrackingname时),尽管您在这里不需要。

git push命令本身的意思是:

  • 通过URL或远程名称(例如git push)调用其他一些Git。
  • 根据需要发送Git提交和/或其他对象。
  • 然后,要求Git将其某些名称(分支名称,标签名称,等等)设置为某些哈希ID。

在这种情况下,另一个Git是origin,因此是origin

所需的提交和其他对象是:根本没有对象;你已经有了它们。

您希望它们设置的哈希ID现在是您自己的git push origin ...中的ID。这就是refspec的 source 部分。

您希望他们设置的名称为origin/mainline:即分支,名为refs/heads/mainline-clone。通常不需要使用这样的全称名称。您可能只写:

mainline-clone

但是明确告诉他们的Git:这是一个分支名称并没有害处,如果您的Git不这样做,他们的Git可以决定是否将git push origin origin/mainline:mainline-clone 视为分支名称,标记名称或其他名称。

因此,您可以在mainline-clone中明确说出使用我的远程跟踪名称origin / mainline来阐明其git push,以设置其分支名称mainline-clone 这里。实际上,如果您正在编写脚本,则使用:

origin/mainline:refs/heads/mainline-clone

以防有人意外创建名为git push origin refs/heads/origin/mainline:refs/heads/mainline-clone local 分支(或标签)。当然,您不会自己这样做。 :-)


1 我不喜欢使用 tracking 这个词,在Git中已经很重了。请注意,如果文件在您的工作树中并且在Git的索引中,则被称为已跟踪;而如果文件在您的工作树中但未存在,则被称为未跟踪。在Git指数中;这与分支名称无关。同时,诸如origin/mainline之类的名称是远程跟踪名称,或者像Git所说的那样,是远程跟踪分支名称。这也与分支名称无关,除非您为分支名称使用Git的名称(我不这样做,这太令人困惑了)。

相关问题