Git中的HEAD和ORIG_HEAD

piztneat  于 2023-01-28  发布在  Git
关注(0)|答案(4)|浏览(250)

这些符号指的是什么,它们的意思是什么?
(官方文件中找不到任何解释)

bxgwgixi

bxgwgixi1#

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) manpage/ [gitrevision(7)手册页][git-revision]、Git User's ManualGit Community BookGit Glossary

4c8rllxm

4c8rllxm2#

一个月一个月

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:"行中的+错误),这将非常有用。
此外,merge总是将'.git/ORIG_HEAD'设置为HEAD的原始状态,因此可以使用'git reset ORIG_HEAD'删除有问题的合并。
Git 2.40(2023年第一季度)对ORIG_HEAD的描述更多:
参见commit f1c9243commit c6eec9ccommit 0c514d5commit d03c773commit e29678b(2023年1月10日),作者为Philippe Blain ( phil-blain )
(由Junio C Hamano -- gitster --合并至commit 9c2003a,2023年1月21日)

git-rebase.txt:添加关于"ORIG_HEAD"被覆盖的注解

报告人:埃里克·塞尔文·埃丁
签署人:菲利普·布莱恩
确认人:菲利普·伍德
"ORIG_HEAD"在变基开始时写入,但不保证在变基结束时仍指向原始分支尖端。
事实上,在重定基过程中使用其他写入'ORIG_HEAD'的命令,比如使用'git reset'(man)HEAD ^'拆分提交,将导致' ORIG_HEAD '被覆盖。
这会给一些用户带来困惑。
在"描述"部分添加一个注解,并提到使用分支的reflog的更健壮的替代方案。
git rebase现在在其手册页中包括:
[NOTE]
如果在变基期间使用写入该伪引用的其它命令(例如,git reset),则不保证ORIG_HEAD在变基结束时仍然指向先前的分支尖端。
但是,使用当前分支的reflog(即@{1})可以访问前一个分支的尖端。
以及:

revisions.txt:明确有关写入"ORIG_HEAD"的命令

签署人:菲利普·布莱恩
确认人:菲利普·伍德
提到"ORIG_HEAD"时,请明确说明是哪个命令写入了该伪引用,即"git am"(man)、"git merge"(man)、"git rebase"(man)和"git reset"(man)。
revisions现在在其手册页中包括:
ORIG_HEAD是由大幅移动HEAD的命令(git amgit mergegit rebasegit reset)创建的,用于记录HEAD在其操作之前的位置,以便您可以轻松地将分支的尖端更改回运行它们之前的状态。

注:从here开始
HEAD是一个移动指针。有时候它表示当前分支,有时候不表示。
所以HEAD是 * NOT ,它已经是"当前分支"的同义词了。
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月)引入了引入了一个新的符号!
(实际上,将在2013年第4季度的1.8.5中提供:用commit 9ba89f4重新引入)、由Felipe Contreras引入。
现在您可以说"@",而不是键入四个大写字母"HEAD",
例如"git log @"。
参见commit cdfd948
键入'HEAD'是乏味的,尤其是当我们可以使用'@'代替时。
选择'@'的原因是它自然地遵循ref@op语法(例如HEAD@{u}),除了我们没有引用和操作,当我们没有这些时,假设'HEAD'是有意义的。
所以现在我们可以使用'git show @~1',以及所有这些goody goody。
到目前为止,"@"是一个有效的名称,但它与这个概念冲突,所以让我们将其无效。可能很少有人使用这个名称。

wgx48brx

wgx48brx3#

man 7 gitrevisions开始:
HEAD命名了工作树中你所做的修改所基于的提交。FETCH_HEAD记录了你上次调用git fetch时从远程仓库中获取的分支。ORIG_HEAD是由那些剧烈移动HEAD的命令创建的,用来记录HEAD在操作之前的位置。以便您可以轻松地将分支的尖端更改回运行它们之前的状态。MERGE_HEAD记录提交(s)当你运行git merge时,你要合并到分支中的提交。CHERRY_PICK_HEAD记录了当你运行git cherry-pick时,你要选择的提交。

7hiiyaii

7hiiyaii4#

我的理解是HEAD指向当前分支,而ORIG_HEAD用于在执行“危险”操作之前存储以前的HEAD。
例如git-rebase和git-am会在应用任何更改之前记录分支的原始tip。

相关问题