这些符号是指什么,它们是什么意思?
(我在官方文档中找不到任何解释)
答案 0 :(得分:285)
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
。
有关详细信息,请参阅git(1) manpage,Git User's Manual,Git Community Book和Git Glossary
答案 1 :(得分:94)
“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
”。
键入“
@
”非常繁琐,尤其是当我们可以使用“@
”时。选择“
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时,请选择樱桃。