实际上当我从一个有新文件的本地分支进行git fetch和git checkout origin / branch时会发生什么?

时间:2018-06-11 07:36:48

标签: git github git-fetch

考虑我有一个本地分支A和两个远程分支AB
本地分支A包含远程 B中的部分文件。 那么,我这样做:

git fetch
git checkout origin/B

  

然后,来自本地A 的那些文件仍然存在,我删除了这些文件,并在origin/B中的某些文件中提交了我所需的更改:

git add .
git commit -m "fixes made"

  

然后,head显示提交哈希

已分离

所以,我在这里有两个问题

  1. 为什么我的本地分支A中的这些文件被复制/保留在origin/B中?

  2. 为什么头部脱离了?

2 个答案:

答案 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 branch
git checkout origin/B

HEAD最终将直接指向origin/B引用的提交,而不是本地分支名称;因此,它变成了分离的HEAD

  1. 这称为"head",小写。
  2. 事实上,.git目录中有一个名为HEAD的文本文件,它实际上包含了它所指向的分支的名称。