【问题标题】:HEAD position in the example from git docs on stash command示例中的 HEAD 位置来自 git docs on stash 命令
【发布时间】:2013-04-11 11:25:35
【问题描述】:

我一直在阅读the examplesstash 命令如何缓解生活,并遇到了这段代码 sn-p:

# ... 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 commit):

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

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

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

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

【问题讨论】:

  • 我看到问题中有一个错误:reset 应该使用HEAD 移动分支指针。我会马上编辑它。但这并不影响我对HEAD^ 指向哪里的问题。

标签: git git-reset


【解决方案1】:

git 中,head 的概念并不通用。这样一来,每个branch 都有自己的head,通常指向该分支时间线中的最后一次提交。

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

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

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

.git/HEAD

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

.git/refs/heads

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

,否则之前的文件通常会指向其中一个

【讨论】:

  • 但可能有一个分离的HEAD。所以,它可能根本没有任何分支。
  • 好的!谢谢你。所以每个分支都有自己的 HEAD 历史。哇!
  • HEAD 并不需要一个分支来生存。进入分离状态时,git 会以任何方式通知您特殊情况是
  • 其实每个分支都有自己的head(小写)历史,可以在.git/logs/refs/heads看到
猜你喜欢
  • 2010-12-30
  • 1970-01-01
  • 2017-12-13
  • 1970-01-01
  • 2023-02-08
  • 2022-06-16
  • 2013-03-26
  • 2011-05-12
  • 2020-12-12
相关资源
最近更新 更多