克隆存储库时我没有看到分支

时间:2018-05-27 19:55:02

标签: git

我正在新计算机上克隆一个gitlab项目。

如果我输入“git branch”,我只会看到master branch。

如果我输入“git branch -a”,我会看到红色的其他分支带有“遥控器/原点”前缀。

我可以通过输入以下内容来查看此分支中的内容:

git checkout remotes/origin/mybranch

但是我在一些教程中看到了这个命令:

git fetch origin mybranch:mybranch

在这种情况下,mybranch将出现在“git branch”命令中,但我不明白该命令的作用。已经通过第一次克隆操作下载并获取了分支?

由于

2 个答案:

答案 0 :(得分:1)

这是完全正常的。

当你第一次克隆某个​​存储库时,你指示你的Git在某个URL上调用其他一些Git:

git clone <url>

你的Git首先创建一个新的空存储库 - 它没有提交也没有分支。然后它会设置远程 - 名称origin,通常会记录您提供的网址并运行git fetch。这个获取操作带来了你没有的所有提交,当然这只是“所有提交”,因为你还没有提交。

在获取过程结束时,您的Git会设置所有远程跟踪名称 1 origin/*。你可以在另一个Git上为每个分支名称获得一个这样的名称。请注意,此时,您仍然没有自己的分支名称!

我们可以通常的方式绘制提交和远程跟踪名称:

...--o--o--o   <-- origin/master
      \
       o--o   <-- origin/develop

等等。每个单独的名称都指向一个特定的提交,即分支的提示

为了将您自己的提交添加到其中一个提交中,您需要做的是创建自己的分支名称,指向其中一个提交。事实上,你必须这样做才能git checkout somebranch。所以git clone做的最后一件事就是:

git checkout master

(或者其他一些名字,取决于你告诉它最后检查的内容)。这引发了一些魔力。

Git查看您自己的所有分支名称,其中没有分支名称。它找不到master。您的Git会继续浏览所有远程跟踪名称,而不是抱怨并且什么都不做。它会查找类似master的内容,并且只找到一个:origin/master。那么你的Git,创建名称master,并将其设置为指向相同的提交为origin/master

...--o--o--o   <-- master (HEAD), origin/master
      \
       o--o   <-- origin/develop

现在名称master已存在,git checkout可以查看,现在您已经在分支master上。

其他origin/*名称均未使用过...... 尚未。但是如果你现在运行:

git checkout develop

你的Git经历了相同的过程:没有develop,因此它会查看所有远程跟踪名称并找到origin/develop。它然后对自己说:啊哈,你必须要我创建develop指向与origin/develop相同的提交,然后切换到develop所以它那样做:

...--o--o--o   <-- master, origin/master
      \
       o--o   <-- develop (HEAD), origin/develop

在这些图中,我将单词HEAD附加到当前已签出的分支。 Git在内部做了同样的事情:这就是Git如何知道你所在的分支,以及在添加新提交时要修改的分支名称。

请注意,在您想要向其添加提交之前,无需创建新的分支名称。您可以通过其哈希ID检出特定提交,也可以使用git checkout origin/develop代替git checkout develop。这为您提供了Git所谓的分离的HEAD:

...--o--o--o   <-- master, origin/master
      \
       o--o   <-- HEAD, origin/develop

现在HEAD直接指向提交,而不是标记分支名称并让branch-name指向提交。在您进行 new 提交之前,这没关系;那么你可能想要一个分支名称来记住最新的这样的提交。

1 关于这些是否也被视为“分支名称”,这是有争议的。它们当然是 names ,它们识别提交图中结构分支的提示。但是有些人用来引用这些词的双字短语远程分支是一个误导性的名称。它们是你的 Git存储库中的名字! Git称他们为远程跟踪分支名称,它使用单词远程 + 跟踪 + 分支的组合字符串与Git使用每个单词的其他方式不同的方式。难怪人们发现Git令人抓狂。

答案 1 :(得分:0)

https://git-scm.com/docs/git-fetch

  

<refspec>

     

指定要获取的引用和要更新的本地引用。如果命令行中没有显示<refspec>,则会从remote.<repository>.fetch变量读取要获取的引用(请参阅下面的配置远程跟踪分支)。

     

<refspec>参数的格式是可选加+,后跟源<src>,后跟冒号:,后跟目标引用<dst><dst>为空时,可以省略冒号。 <src>通常是ref,但它也可以是完全拼写的十六进制对象名称。

     

tag <tag>refs/tags/<tag>:refs/tags/<tag>相同;它请求获取给定标记的所有内容。

     

获取与<src>匹配的远程引用,如果<dst>不是空字符串,则使用<src>快速转发与其匹配的本地引用。如果使用了可选的plus +,则即使本地引用不会导致快进更新,也会更新本地引用。

所以这个命令:从远程mybranch获取origin;将本地mybranch快进到提取的本地mybranch。所以

  
    

mybranch将出现在“git branch”命令

中   

因为现在有一个本地master

  

分支已经被第一次克隆操作下载和提取

但是没有创建本地分支(默认分支除外,通常为end1 = "C" end2 = "h" end3 = "e" # not working as intended for i in range(1, 4): print(f"end{i}") # works but not ideal print(end1+end2+end3) )。