我一直在努力通过远程路径和直接通过分支名称来了解结帐分支之间的区别。例如下面的分支列表,
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
然后它处于分离状态。下面是输出,
但是现在,如果我这样做
git checkout feature/iteration1
然后正确地指向分支,下面是输出
请问谁能解释这两种签出之间的区别,以及为什么在通过远程路径签出分支时为何将其变为分离状态?
答案 0 :(得分:1)
HEAD
实际上是一个引用,它存储在文件.git/HEAD
中:
cat .git/HEAD
运行git checkout [something]
时,git
更新HEAD
[something]
是 local 分支的名称,则HEAD
设置为ref: [branchname]
,HEAD
设置为[sha1 of the target commit]
-这是“分离的HEAD”状态“分离的HEAD”存在的问题:它将不会被任何名称(无标记,无分支...)引用,并且下次您git checkout
跳转到其他提交或分支时, git可能会垃圾收集此裸提交。
这就是显示警告的原因:表示如果您打算在此分离的HEAD
上工作,则应采取一些措施(创建标签或分支)。
答案 1 :(得分:1)
您的第一个分支列表是远程跟踪分支,git不会将其用作您的其他本地分支。它们无法检出,只能作为远程存储库分支的参考。
当您尝试签出远程跟踪分支时,git跟随该分支指向的提交,并签出 this ,导致分离的HEAD状态。它允许您检查某些提交,但并不意味着将分支用作本地分支,添加/提交/等。并且仅在您从匹配的存储库中获取时进行修改。