我在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
保留完整)。
谢谢。
答案 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 fetch
和git push
命令是实际使用refspecs的两个命令。
在任何参考规范中,冒号左侧的名称为 source ,冒号右侧的名称为目的地。任何refspec的目的地都必须是一个名称-通常会使用分支或标记名称,或者您可以拼写完整的引用名称,例如refs/heads/somebranch
或refs/tags/v2.1
或{{ 1}}。源有时可以是原始哈希ID(使用refs/remotes/origin/remotetrackingname
时),尽管您在这里不需要。
git push
命令本身的意思是:
git push
)调用其他一些Git。在这种情况下,另一个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的名称(我不这样做,这太令人困惑了)。