Git `name~n`和`name@{n}`是否总是指同一个提交?
给定对提交的引用,例如Git `name~n`和`name@{n}`是否总是指同一个提交?,git,Git,给定对提交的引用,例如name,那么name~n和name@{n}是否始终引用同一个提交?我可以互换使用它们吗 @{},例如master@{1} ref后跟后缀@,带有括号对中包含的顺序规范(例如{1},{15}),指定该ref的n-第个先验值。例如master@{1}是master的直接先验值,master@{5}是master 5的第五个先验值。此后缀只能紧跟在ref名称之后使用,并且ref必须具有现有日志($GIT\u DIR/logs/) ~,例如master~3 修订参数的后缀~表示提
name
,那么name~n
和name@{n}
是否始终引用同一个提交?我可以互换使用它们吗
@{}
,例如master@{1}
ref后跟后缀@
,带有括号对中包含的顺序规范(例如{1}
,{15}
),指定该ref的n
-第个先验值。例如master@{1}
是master的直接先验值,master@{5}
是master 5的第五个先验值。此后缀只能紧跟在ref名称之后使用,并且ref必须具有现有日志($GIT\u DIR/logs/
)
~
,例如master~3
修订参数的后缀~
表示提交对象,它是命名提交对象的第
代祖先,仅位于第一个父对象之后。也就是说,~3
相当于^^
,后者相当于^1^1
。有关此表单的用法说明,请参见下文
虽然这两种描述听起来很相似,但实际上它们的意思不同<代码>~n从历史记录中的指定修订向上移动父级。如果您查看Git日志,那么这将向上移动到第一个父级n
次
@{n}
然而,它谈论的是一个ref的日志。因此这是一个在ref的reflog之上移动的东西。要查看ref的reflog,只需运行git reflog
,例如git reflog master
。@{n}
将引用顶部的第n项(零索引)
因此,虽然
~n
是关于Git历史的,但对于所有克隆的存储库来说都是全局有效的,并且对于基本修订总是会产生相同的结果,@{n}
将取决于本地存储库的引用历史。如果您正在提交或获取,那么您就是在有效地修改reflog。所以这并不是普遍有用的东西。不,它们可以不同
通过遵循父指针,为您提供该提交的第n代祖先name~n
为您提供reflog中该名称的第n个条目name@{n}
A <-- B <-- C
^ ^ ^
| | | master@{1}
| |
| | master
| | master@{0}
| | master~0
|
| master~1
A n.b.(至少在本例中)b
既是master{0}
又是master{2}
,A
是master{3}
。