这些符号指的是什么,它们的意思是什么?(官方文件中找不到任何解释)
bxgwgixi1#
HEAD是对当前提交的(直接或间接,即符号)引用。它是一个你在工作目录中签入的提交(除非你做了一些修改或等效的操作),并且是一个“git commit”会在其上创建一个新提交的提交。通常HEAD是对其他已命名分支的符号引用;该分支是当前检出分支或当前分支。HEAD还可以直接指向提交;这种状态被称为“分离的HEAD”,并且可以被理解为处于未命名的匿名分支上。而**@**本身就是HEAD的快捷方式,因为Git 1.8.5ORIG_HEAD是HEAD的前一个状态,由可能有危险行为的命令设置,以便于恢复。现在Git有了reflog,它就不那么有用了:HEAD@{1}大致等于ORIG_HEAD(HEAD@{1}始终是HEAD的最后一个值,ORIG_HEAD是危险操作之前HEAD的最后一个值)。有关详细信息,请阅读git(1) manpage/ [gitrevision(7)手册页][git-revision]、Git User's Manual、Git Community Book和Git Glossary
HEAD
@
ORIG_HEAD
HEAD@{1}
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 f1c9243、commit c6eec9c、commit 0c514d5、commit d03c773、commit e29678b(2023年1月10日),作者为Philippe Blain ( phil-blain )。(由Junio C Hamano -- gitster --合并至commit 9c2003a,2023年1月21日)
git reset --merge
git am
.git/ORIG_HEAD
git reset ORIG_HEAD
phil-blain
gitster
git-rebase.txt
报告人:埃里克·塞尔文·埃丁签署人:菲利普·布莱恩确认人:菲利普·伍德"ORIG_HEAD"在变基开始时写入,但不保证在变基结束时仍指向原始分支尖端。事实上,在重定基过程中使用其他写入'ORIG_HEAD'的命令,比如使用'git reset'(man)HEAD ^'拆分提交,将导致' ORIG_HEAD '被覆盖。这会给一些用户带来困惑。在"描述"部分添加一个注解,并提到使用分支的reflog的更健壮的替代方案。git rebase现在在其手册页中包括:[NOTE]:如果在变基期间使用写入该伪引用的其它命令(例如,git reset),则不保证ORIG_HEAD在变基结束时仍然指向先前的分支尖端。但是,使用当前分支的reflog(即@{1})可以访问前一个分支的尖端。以及:
git reset
git rebase
[NOTE]
@{1}
revisions.txt
签署人:菲利普·布莱恩确认人:菲利普·伍德提到"ORIG_HEAD"时,请明确说明是哪个命令写入了该伪引用,即"git am"(man)、"git merge"(man)、"git rebase"(man)和"git reset"(man)。revisions现在在其手册页中包括:ORIG_HEAD是由大幅移动HEAD的命令(git am、git merge、git rebase、git reset)创建的,用于记录HEAD在其操作之前的位置,以便您可以轻松地将分支的尖端更改回运行它们之前的状态。
git merge
revisions
注:从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。到目前为止,"@"是一个有效的名称,但它与这个概念冲突,所以让我们将其无效。可能很少有人使用这个名称。
git commit
git diff --cached
git status
HEAD@{5.minutes.ago}
git log @
ref@op
HEAD@{u}
git show @~1
wgx48brx3#
从man 7 gitrevisions开始:HEAD命名了工作树中你所做的修改所基于的提交。FETCH_HEAD记录了你上次调用git fetch时从远程仓库中获取的分支。ORIG_HEAD是由那些剧烈移动HEAD的命令创建的,用来记录HEAD在操作之前的位置。以便您可以轻松地将分支的尖端更改回运行它们之前的状态。MERGE_HEAD记录提交(s)当你运行git merge时,你要合并到分支中的提交。CHERRY_PICK_HEAD记录了当你运行git cherry-pick时,你要选择的提交。
man 7 gitrevisions
7hiiyaii4#
我的理解是HEAD指向当前分支,而ORIG_HEAD用于在执行“危险”操作之前存储以前的HEAD。例如git-rebase和git-am会在应用任何更改之前记录分支的原始tip。
4条答案
按热度按时间bxgwgixi1#
HEAD
是对当前提交的(直接或间接,即符号)引用。它是一个你在工作目录中签入的提交(除非你做了一些修改或等效的操作),并且是一个“git commit”会在其上创建一个新提交的提交。通常HEAD
是对其他已命名分支的符号引用;该分支是当前检出分支或当前分支。HEAD
还可以直接指向提交;这种状态被称为“分离的HEAD”,并且可以被理解为处于未命名的匿名分支上。而**
@
**本身就是HEAD
的快捷方式,因为Git 1.8.5ORIG_HEAD
是HEAD
的前一个状态,由可能有危险行为的命令设置,以便于恢复。现在Git有了reflog,它就不那么有用了:HEAD@{1}
大致等于ORIG_HEAD
(HEAD@{1}
始终是HEAD
的最后一个值,ORIG_HEAD
是危险操作之前HEAD
的最后一个值)。有关详细信息,请阅读git(1) manpage/ [gitrevision(7)手册页][git-revision]、Git User's Manual、Git Community Book和Git Glossary
4c8rllxm2#
一个月一个月
从git reset开始
"pull"或"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 f1c9243、commit c6eec9c、commit 0c514d5、commit d03c773、commit 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 am
、git merge
、git rebase
、git reset
)创建的,用于记录HEAD
在其操作之前的位置,以便您可以轻松地将分支的尖端更改回运行它们之前的状态。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。到目前为止,"
@
"是一个有效的名称,但它与这个概念冲突,所以让我们将其无效。可能很少有人使用这个名称。wgx48brx3#
从
man 7 gitrevisions
开始:HEAD命名了工作树中你所做的修改所基于的提交。FETCH_HEAD记录了你上次调用git fetch时从远程仓库中获取的分支。ORIG_HEAD是由那些剧烈移动HEAD的命令创建的,用来记录HEAD在操作之前的位置。以便您可以轻松地将分支的尖端更改回运行它们之前的状态。MERGE_HEAD记录提交(s)当你运行git merge时,你要合并到分支中的提交。CHERRY_PICK_HEAD记录了当你运行git cherry-pick时,你要选择的提交。
7hiiyaii4#
我的理解是HEAD指向当前分支,而ORIG_HEAD用于在执行“危险”操作之前存储以前的HEAD。
例如git-rebase和git-am会在应用任何更改之前记录分支的原始tip。