HEAD和ORIG_HEAD在Git中

这些符号是指什么,它们是什么意思?

(在官方文档中我找不到任何解释)

HEAD (直接或间接,即符号)引用当前提交。 这是你在工作目录中检查的一个提交(除非你做了一些修改或者等价的),它是一个提交,在这个提交之上,“git commit”会创build一个新的。 HEAD通常是其他命名分支的符号引用; 这个分支目前是检出分支,或当前分支。 HEAD也可以直接指向提交; 这个状态被称为“脱离HEAD”,可以理解为匿名的匿名分支。

从Git 1.8.5开始, @就是HEAD的捷径

ORIG_HEADHEAD先前状态,由具有可能危险行为的命令设置,以便于恢复它们。 现在Git有reflog: HEAD@{1}大致等于ORIG_HEADHEAD@{1}总是HEAD最后一个值, ORIG_HEAD是危险操作之前的HEAD最后一个值)。

有关更多信息,请阅读git(1)联机帮助页 , Git用户手册 , Git社区书和Git词汇表

从git重置

“拉”或“合并”总是将当前分支的原始尖端留在ORIG_HEAD

 git reset --hard ORIG_HEAD 

重置难以使您的索引文件和工作树回到该状态,并将分支的提示重置为该提交。

 git reset --merge ORIG_HEAD 

在检查合并的结果之后,你可能会发现另一个分支的变化是不能令人满意的。 运行“ git reset --hard ORIG_HEAD ”可以让你回到你所在的位置,但是会丢弃你不想要的本地修改。 “ git reset --merge ”保持您的本地更改。


在应用任何补丁之前,ORIG_HEAD被设置为当前分支的顶端。
如果您在多次提交时遇到问题,比如在错误的分支上运行“ git am ”,或者通过更改邮箱(例如,“From:”行中的错误)更容易修复提交中的错误,这将非常有用。

另外,合并总是将“ .git/ORIG_HEAD ”设置为HEAD的原始状态,这样可以通过使用' git reset ORIG_HEAD '来删除有问题的合并。


注意:从这里开始

HEAD是一个移动的指针。 有时它意味着当前的分支,有时它不是。

所以到目前为止HEAD并不是“当前分支”的同义词。

HEAD在git中的任何地方都意味着“当前” ,但并不一定意味着“当前分支”(即分离的HEAD)。

但是它几乎总是意味着“当前的承诺”。
它是build立在“ git commit ”之上的,并且“ git diff --cached ”和“ git status ”进行比较。
这意味着当前分支只在非常有限的情况下(正好当我们想要一个分支名称来操作—重置和通过提交/ rebase /等增加分支的提示)。

Reflog是时间和机器返回的工具,机器与“当前”概念有着有趣的相互作用。

HEAD@{5.minutes.ago}可能意思是“取消HEAD symref来查明我们现在在哪个分支,然后找出那个分支的尖端在5分钟前的位置”。
或者,它可能意味着“我在5分钟前提到HEAD的行为是什么,例如,如果我那时做了”git show HEAD“。


git1.8.4(2013年7月) 介绍 介绍了一个新的符号!
(实际上,2013年第四季度将是1.8.5或1.9:以commit 9ba89f4重新引入)

不要input四个大写字母“ HEAD ”,现在可以说“ @
例如“ git log @ ”。

见提交cdfd948

input' HEAD '是很乏味的,特别是当我们可以使用' @ '时。

select' @ '的原因是它自然地来自ref@op语法(例如HEAD@{u} ),除了我们没有引用,没有操作,并且当我们没有这些时,假设“ HEAD ”。

所以现在我们可以使用' git show @~1 '以及所有这些好东西。

到目前为止,“ @ ”是一个有效的名字,但是与这个想法相冲突,所以让我们把它变成无效的。 如果有的话,可能很less有人使用这个名字。


在1.8.4-rc3期间 (2013年8月14日)的博客文章宣布此function已经恢复并推迟(谢谢杯形蛋糕提醒 )。
再一次,它被再次引入提交9ba89f4 (2013年9月)。

参见提交2c2b664 :

还原“添加@ HEAD快捷键”

这将恢复提交cdfd948 ,因为它不仅适用于“ @ ”(和应用了修饰符如@{u}表单),还会影响例如“ refs/heads/@/foo ”,而不应该这样做。

短暂的基本思想可能是好的,这个话题可以稍后重试,但是为了避免影响到现在的即将到来的版本的现有用例,让我们来回顾一下。

我的理解是HEAD指向当前分支,而ORIG_HEAD用于在执行“危险”操作之前存储之前的HEAD。

例如git-rebase和git-am在应用任何更改之前logging分支的原始提示。