1

我一直在阅读命令如何简化生活的示例stash,并遇到了以下代码片段:

# ... hack hack hack ...
$ git checkout -b my_wip
$ git commit -a -m "WIP"
$ git checkout master
$ edit emergency fix
$ git commit -a -m "Fix in a hurry"
$ git checkout my_wip
$ git reset --soft HEAD^
# ... continue hacking ... 

据我所知,这里发生的情况如下:

我们在当前提交处创建一个新分支:

--1
  |
  master
  my_wip
  HEAD

然后我们暂存修改过的文件并对my_wip分支进行新的提交:

--1 ------------ 2
  |              |
  master         my_wip
                 HEAD

然后我们结帐master

--1 ------------ 2
  |              |
  master         my_wip
  HEAD

然后我们修改一些文件并进行新的提交(带有初步暂存(-a标志)):

                 HEAD
                 master
                 |
    -------------3
   /
  /
--1 ------------ 2
                 |
                 my_wip

然后我们结帐my_wip

                 master
                 |
    -------------3
   /
  /
--1 ------------ 2
                 |
                 my_wip
                 HEAD

然后我们做git reset --soft HEAD^

在这个命令之后,我希望 git 移动HEAD到它之前的位置,即3提交。所以我希望它能让我们进入这个阶段(工作目录和暂存区来自2提交):

                 HEAD
                 master
                 my_wip
                 |
    -------------3
   /
  /
--1 ------------ 2

但正如我从文档中得到的那样,它会这样做(因为在取消存储后,我们应该到达我们决定存储时所处的位置):

                master
                 |
    -------------3
   /
  /
--1 ------------ 2
  |              
  my_wip
  HEAD           

这是否意味着这HEAD^是当前分支的先前位置,因此它取决于所选分支(我一直认为这HEAD^只是HEAD当前分支的先前位置)?还是我误解了什么?

4

1 回答 1

1

git概念head上并不笼统。可以说,每个branch人都有自己的head正常指向时间线中该分支的最后一次提交。

另一方面HEAD,每个存储库只存在一次,并指向当前分支的头部,即当前头部。

所以HEAD总是在你的分支而不是整个存储库的上下文中使用。这就是为什么git reset --soft HEAD^将您移回一个提交而不是前一个位置的原因

如果您查看文件.git夹中的文件,您可以清楚地理解这个概念:

.git/HEAD

此文件包含对 repo 的 HEAD(大写)所在位置的引用

.git/refs/heads

此文件夹包含每个分支的一个文件,并引用其头部(小写)。前一个文件通常会指向其中一个,除非有detached HEAD

于 2013-04-11T11:56:32.653 回答