HEAD在Git中

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

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


HEAD (直接或间接,即符号)引用当前提交。 它是你在工作目录中检查的一个提交(除非你做了一些改变或者等效),它是一个提交,其中“git commit”会做出一个新提交。 通常HEAD是对其他某个命名分支的符号引用; 这个分支目前被检出分支或当前分支。 HEAD也可以直接指向提交; 这个状态被称为“detached 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)。

但它几乎总是意味着“当前的承诺”。
它是在“ 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重新引入)

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

参见提交cdfd948

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

选择' @ '的原因是,它自然遵循ref@op语法(例如HEAD@{u} ),除了我们没有引用,没有操作,并且当我们没有这些时,它会使假设' HEAD '。

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

到目前为止,' @ '是一个有效的名称,但它与这个想法相冲突,所以让我们将其视为无效。 可能很少有人使用这个名字。


在1.8.4-rc3期间(2013年8月14日)发布的一篇博客文章宣布此功能已经恢复并推迟(谢谢Cupcake参加单挑)。
再一次,它被再次引入提交9ba89f4(2013年9月)。

参见提交2c2b664:

还原“为HEAD添加新@快捷键”

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

提供简短的基本想法可能会很好,并且可以稍后重试该主题,但现在回过头来避免影响即将发布的现有用例。


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

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

链接地址: http://www.djcxy.com/p/925.html

上一篇: HEAD in Git

下一篇: String contains in Bash