Answers:
HEAD
是(直接或间接,即符号)对当前提交的引用。这是您已在工作目录中签入的提交(除非您进行了一些更改或等效更改),并且它是一个提交,在此提交之前,“ git commit”将做出一个新的提交。通常HEAD
是对其他命名分支的符号引用;该分支当前是检出分支,即当前分支。HEAD
也可以直接指向提交;此状态称为“分离的HEAD”,可以理解为处于未命名的匿名分支上。
而@
单是一个捷径HEAD
,因为Git的1.8.5
ORIG_HEAD
是的先前状态HEAD
,由可能具有危险行为的命令设置,以便于将其还原。现在,Git具有reflog不再有用:HEAD@{1}
大致等于ORIG_HEAD
(HEAD@{1}
始终是的最后一个值HEAD
,ORIG_HEAD
是的最后一个值HEAD
危险操作之前的。
“ 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:”行中的+ errors),则。此外,合并总是将'
.git/ORIG_HEAD
' 设置为HEAD的原始状态,因此可以使用'git reset ORIG_HEAD
' 删除有问题的合并。
注意:从这里
HEAD是移动的指针。有时它表示当前分支,有时则不是。
因此,HEAD 到处都不是“当前分支”的同义词。
HEAD 处处表示“当前”在git的,但不一定表示“当前分支”(即,分离的HEAD)。
但这几乎总是意味着“当前提交”。
这是提交“git commit
”基础上的顶部,“git diff --cached
”和“git status
”比较反对。
这意味着当前分支仅在非常有限的上下文中(恰好在我们希望分支名称可以通过--commit / rebase / etc重置和增长分支提示的情况下使用)。Reflog是一种时光倒流的工具,时间机器与“当前”的概念有着有趣的互动。
HEAD@{5.minutes.ago}
可能意味着“取消HEAD symref来找出我们现在在哪个分支上,然后找出该分支的尖端在5分钟前所在的位置”。
或者,它的意思可能是“ 5分钟前我将其称为HEAD的提交是什么,例如,如果我当时做了“ git show HEAD”。
git1.8.4(2013年7月) 介绍 引入了新的符号!
(实际上,它适用于2013年第4季度1.8.5或1.9:通过commit 9ba89f4重新引入)
不用输入四个大写字母“
HEAD
”,您@
现在可以说“ ”,
例如“git log @
”。
键入“
HEAD
”很繁琐,尤其是当我们可以使用“@
”代替时。选择'
@
' 的原因是它自然地遵循了ref@op
语法(例如HEAD@{u}
),除了我们没有ref和没有操作,而且当我们没有ref和操作时,假设'HEAD
'。因此,现在我们可以使用“
git show @~1
”以及所有其他优点。到目前为止,“
@
”是一个有效名称,但是与该想法冲突,因此让我们使其无效。使用此名称的人可能很少(如果有的话)。
1.8.4-rc3期间(2013年8月14日)的博客文章宣布,此功能已还原和延迟(感谢Cupcake for heads-up)。
再次,它在提交9ba89f4中再次引入 (2013年9月)。
@
快捷方式HEAD
”这将还原提交cdfd948,因为它不仅适用于“
@
”(以及带有类似修饰符的形式@{u}
),而且还会影响“refs/heads/@/foo
”,但不应这样做。简写的基本想法可能很好,可以稍后重试该主题,但是让我们恢复以避免对即将发布的版本暂时影响现有用例。
HEAD
现在(即将到来的git1.8.4)'@
'!请参阅下面我编辑的答案