一尘不染

Git 中的 HEAD 和 ORIG_HEAD

git

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


阅读 219

收藏
2022-04-24

共1个答案

一尘不染

git 重置

“pull” or “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在错误的分支上运行 ‘ ‘ 或通过更改邮箱更容易修复的提交中的错误(例如,“发件人:”行中的 +错误),这很有用。

此外,merge 总是将 ‘ .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:通过提交 9ba89f4重新引入),作者Felipe Contreras

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

请参阅提交 cdfd948

输入 ‘ HEAD‘ 很乏味,尤其是当我们可以使用 ‘ @‘ 代替时。

选择 ‘ @‘ 的原因是它自然地遵循ref@op语法(例如HEAD@{u}),除了我们没有 ref 和操作,当我们没有这些时,假设 ‘ HEAD‘ 是有意义的。

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

到目前为止,’ @‘ 是一个有效的名称,但它与这个想法相冲突,所以让我们让它无效。可能很少有人(如果有的话)使用这个名字。

2022-04-24