考虑我有一个本地分支A
和两个远程分支A
和B
。
本地分支A
包含远程 B
中的部分文件。
那么,我这样做:
git fetch
git checkout origin/B
然后,来自本地A 的那些文件仍然存在,我删除了这些文件,并在
origin/B
中的某些文件中提交了我所需的更改:
git add .
git commit -m "fixes made"
然后,head显示提交哈希
已分离
所以,我在这里有两个问题
为什么我的本地分支A
中的这些文件被复制/保留在origin/B
中?
为什么头部脱离了?
答案 0 :(得分:3)
为什么我的本地分支A中的那些文件被复制/保留到原点/ B?
因为不是来自分支A的文件。它们是工作目录中不由git管理的文件。您没有将它们添加到分支A或其他任何地方的任何提交中。并且git对它没有被告知要管理的文件没有任何作用。在你提交之前,工作不是“在一个分支上”。
为什么头被分开?
因为您git checkout origin/B
HEAD
分离了git checkout -t origin/B
。您可能需要B
,它会创建一个新的分支origin/B
,其上游为HEAD
,并在那里指向var SendInfo= {"dataKey":"1013"};
。
答案 1 :(得分:1)
@hobbs已经为您提供了right answer。
在your comment中回答问题:
每个分支都有不同的
HEAD
。那实际上是怎么发生的?
在Git中,单词HEAD
(大写字母)并不意味着“分支的尖端”,正如您所期望的那样 1 ;相反,HEAD
是一个特殊的引用,指向您当前在工作目录中签出的分支。
documentation说得最好:
单个Git存储库可以跟踪任意数量的分支,但是您的工作树只与其中一个分支相关联(“当前”或“已检出”分支),
HEAD
指向该分支。
通常HEAD
指向分支名称 2 ,但它也可以指向特定的提交。当发生这种情况时,它被称为“detached HEAD”。
现在,因为当你说:
时,你无法直接提交remote tracking branchgit checkout origin/B
HEAD
最终将直接指向origin/B
引用的提交,而不是本地分支名称;因此,它变成了分离的HEAD 。
.git
目录中有一个名为HEAD
的文本文件,它实际上包含了它所指向的分支的名称。