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。所以这并不是普遍有用的东西。

不,它们可以不同

  • name~n
    通过遵循父指针,为您提供该提交的第n代祖先
  • name@{n}
    为您提供reflog中该名称的第n个条目
例如,如果我在主机上执行了3次提交(A、B和C),然后将主机重置为B:

A <-- B <-- C
^     ^     ^
|     |     | master@{1}
|     |
|     | master
|     | master@{0}
|     | master~0
|
| master~1
A n.b.(至少在本例中)
b
既是
master{0}
又是
master{2}
A
master{3}