GIT中的HEAD和ORIG_HEAD

时间:2009-06-08 13:17:19

标签: git

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

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

4 个答案:

答案 0 :(得分:285)

HEAD是对当前提交的(直接或间接,即符号)引用。它是您在工作目录中检查的提交(除非您进行了一些更改或等效),并且它是一个提交,其中“git commit”将创建一个新提交。通常HEAD是对其他一些命名分支的符号引用;此分支当前已检出分支或当前分支。 HEAD也可以直接指向提交;这个状态被称为“分离的HEAD”,可以理解为在未命名的匿名分支上。

单独 @ HEAD的快捷方式,因为Git 1.8.5

ORIG_HEADHEAD的先前状态,由具有可能危险行为的命令设置,以便易于还原它们。现在Git有reflog它不太有用:HEAD@{1}大致相当于ORIG_HEADHEAD@{1}始终是HEAD的最后一个值,ORIG_HEAD是最后一个值在危险操作之前HEAD

有关详细信息,请参阅git(1) manpageGit User's ManualGit Community BookGit Glossary

答案 1 :(得分:94)

来自git reset

  

“pull”或“merge”始终将当前分支的原始提示留在 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”删除有问题的合并。


注意:来自here

  

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

     

所以HEAD NOT 已经是“当前分支”的同义词。

     

HEAD在git中意味着“当前”无处不在,但它并不一定意味着“当前分支”(即分离的HEAD)。

     

但它几乎总是意味着“当前的提交”   提交“git commit”建立在“git diff --cached”之上,“git status”与“HEAD@{5.minutes.ago}”进行比较。
  它仅在非常有限的上下文中表示当前分支(当我们想要分支时)   操作的名称---通过commit / rebase / etc重置和增长分支提示。)。

     

Reflog是一种能够及时回顾机器与“当前”概念进行有趣互动的工具。

     

HEAD可能意味着“取消引用HEAD symref以找出我们现在正在进行的分支,然后找出该分支的尖端在5分钟前的位置”。   或者,它可能意味着“我将称之为HEAD 5的提交是什么   几分钟前,例如如果我做了“git show HEAD”,那么“。


git1.8.4 (July 2013) 介绍 介绍一种新的符号!
(实际上,它将是1.8.5或1.9,2013年第4季度:重新引入commit 9ba89f4

  

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

请参阅commit cdfd948

  

键入“@”非常繁琐,尤其是当我们可以使用“@”时。

     

选择“ref@op”的原因是它自然地遵循HEAD@{u}语法(例如HEAD),除了我们没有参考,没有操作,当我们不做没有那些,假设'git show @~1'是明智的。

     

所以现在我们可以使用'@'和所有善良的善良。

     

直到现在'@'是一个有效的名称,但它与这个想法相冲突,所以让它变得无效。可能很少有人使用这个名字。


A blog post during the 1.8.4-rc3 period(2013年8月14日)宣布此功能已恢复并延迟(感谢您Cupcake感谢the heads-up)。
同样,它再次引入commit 9ba89f4(2013年9月)。

请参阅commit 2c2b664

还原“为HEAD

添加新的@快捷方式
  

这会还原提交cdfd948,因为它不仅适用于“@{u}”(以及应用了refs/heads/@/foo等修饰符的表单),但也会影响到“{{1}}”,它本不应该。

     

提供简写的基本想法可能会很好,主题可以在以后重试,但让​​我们回过头来避免影响即将发布的现有用例。

答案 2 :(得分:2)

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

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

答案 3 :(得分:2)

来自man 7 gitrevisions

HEAD在Windows中将更改命名所基于的提交 工作树。 FETCH_HEAD记录您提取的分支 从上次git fetch调用的远程存储库中。 ORIG_HEAD是通过将HEAD移动到 激烈的方式,在他们之前记录HEAD的位置 操作,以便您可以轻松更改分支的尖端 回到状态,然后再运行它们。 MERGE_HEAD记录 运行时要合并到分支中的提交 git合并。 CHERRY_PICK_HEAD记录您的提交 当您运行git cherry-pick时,请选择樱桃。