从远程路径和直接从分支名称中签出分支之间的区别?

时间:2019-02-06 07:57:11

标签: git

我一直在努力通过远程路径和直接通过分支名称来了解结帐分支之间的区别。例如下面的分支列表,

remotes/origin/HEAD -> origin/master
remotes/origin/develop
remotes/origin/feature/iteration1
remotes/origin/feature/iteration2
remotes/origin/master

现在可以了

  

git checkout remotes/origin/feature/iteration1

然后它处于分离状态。下面是输出,

enter image description here

但是现在,如果我这样做

  

git checkout feature/iteration1

然后正确地指向分支,下面是输出

enter image description here

请问谁能解释这两种签出之间的区别,以及为什么在通过远程路径签出分支时为何将其变为分离状态?

2 个答案:

答案 0 :(得分:1)

HEAD实际上是一个引用,它存储在文件.git/HEAD中:

cat .git/HEAD

运行git checkout [something]时,git更新HEAD

  1. 如果[something] local 分支的名称,则HEAD设置为ref: [branchname]
  2. 在所有其他情况下(原始sha1,标签,远程跟踪分支...),HEAD设置为[sha1 of the target commit]-这是“分离的HEAD”状态

“分离的HEAD”存在的问题:它将不会被任何名称(无标记,无分支...)引用,并且下次您git checkout跳转到其他提交或分支时, git可能会垃圾收集此裸提交。

这就是显示警告的原因:表示如果您打算在此分离的HEAD上工作,则应采取一些措施(创建标签或分支)。

答案 1 :(得分:1)

您的第一个分支列表是远程跟踪分支,git不会将其用作您的其他本地分支。它们无法检出,只能作为远程存储库分支的参考

当您尝试签出远程跟踪分支时,git跟随该分支指向的提交,并签出 this ,导致分离的HEAD状态。它允许您检查某些提交,但并不意味着将分支用作本地分支,添加/提交/等。并且仅在您从匹配的存储库中获取时进行修改。