GIT中的HEAD和ORIG_HEAD

col*_*rco 230 git

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

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

Jak*_*ski 299

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

@单是一个捷径HEAD,因为Git的1.8.5

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

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

  • ORIG_HEAD只能通过'危险'命令设置(我认为),这会使HEAD多次提交.因此,并不总是设置ORIG_HEAD,而始终设置HEAD @ {1}.@ {1}是$(git symbolic-ref HEAD)@ {1},即它使用reflog作为当前分支,而不是HEAD reflog. (19认同)
  • 嗨雅各布.+1解释.你能详细说明HEAD @ {1}的"大致等同"部分吗?我在回答http://thread.gmane.org/gmane.comp.version-control.git/38379(你在2007年2月回来的时候)的帖子中提到了,我并没有完全理解你的讨论伙计们正在使用@ {...}语法. (2认同)
  • “HEAD 是一个提交,“git commit”将在其上创建一个新的提交。”——记住这一点,谢谢!同样来自@VonC,“它是在提交“git commit”之上构建的,并且“git diff --cached”和“git status”进行比较。” (2认同)
  • git help revisions 会显示 http://git-scm.com/docs/gitrevisions,它描述了引用提交的所有方法(包括“HEAD”和“ORIG_HEAD”)。 (2认同)

Von*_*onC 97

git重置

"pull"或"merge"总是留下当前分支的原始尖端ORIG_HEAD.

git reset --hard ORIG_HEAD
Run Code Online (Sandbox Code Playgroud)

难以重置它会将索引文件和工作树恢复到该状态,并将分支的提示重置为该提交.

git reset --merge ORIG_HEAD
Run Code Online (Sandbox Code Playgroud)

检查合并结果后,您可能会发现另一个分支的更改不能令人满意.运行" git reset --hard ORIG_HEAD"会让你回到原来的位置,但它会丢弃你不想要的本地更改." git reset --merge"保留您当地的变化.


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

此外,merge始终将' .git/ORIG_HEAD' 设置为HEAD的原始状态,因此可以使用' git reset ORIG_HEAD' 删除有问题的合并.


注意:从这里开始

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

因此HEAD 不是所有地方"当前分支"的同义词.

HEAD 在git中意味着"当前",但它并不一定意味着"当前分支"(即分离的HEAD).

但它几乎总是意味着"当前的提交".
它是提交" git commit"构建在顶部," git diff --cached"和" git status"比较.
它仅在非常有限的上下文中表示当前分支(当我们希望分支名称操作时 - 通过commit/rebase /等重置和增长分支提示).

Reflog是一种可以追溯到时间和机器与"当前"概念进行有趣互动的工具.

HEAD@{5.minutes.ago}可能意味着"取消引用HEAD symref来找出我们现在在哪个分支,然后找出该分支的尖端在5分钟前的位置".
或者它可能意味着"我在5分钟前称为HEAD的提交是什么,例如,如果我做了"git show HEAD",那么".


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

而不是键入四个大写字母" HEAD",你可以说" @"现在,
例如" git log @".

请参阅commit cdfd948

打字' HEAD'很乏味,特别是当我们可以使用' @'时.

选择' @' 的原因在于它自然地遵循ref@op语法(例如HEAD@{u}),除了我们没有ref,没有操作,当我们没有那些时,它会让人觉得' HEAD'.

所以现在我们可以使用' git show @~1',以及所有美好的善良.

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


一个在1.8.4-RC3期博客文章(14日,2013年8月)宣布,该功能被恢复和延迟(谢谢你的蛋糕抬头).
同样,它再次引入 提交9ba89f4(2013年9月).

请参阅commit 2c2b664:

还原"添加新的@快捷方式HEAD"

这会恢复提交cdfd948,因为它不仅适用于" @"(以及带有@{u}应用于它的修饰符的表单),还会影响例如" refs/heads/@/foo",它不应该.

给出一个简短的手的基本想法可能是好的,主题可以在以后重试,但让​​我们回过头来避免影响即将发布的现有用例.


Nat*_*ell 5

man 7 gitrevisions

HEAD 命名工作树中的更改所基于的提交。FETCH_HEAD 记录您使用上次 git fetch 调用从远程存储库获取的分支。ORIG_HEAD 是由剧烈移动 HEAD 的命令创建的,用于记录操作前 HEAD 的位置,以便您可以轻松地将分支的尖端更改回运行它们之前的状态。MERGE_HEAD 记录运行 git merge 时要合并到分支中的提交。CHERRY_PICK_HEAD 记录您在运行 gitcherry-pick 时选择的提交。