给出对诸如name
之类的提交的引用,name~n
和name@{n}
始终引用同一提交吗?我可以互换使用吗?
答案 0 :(得分:2)
不,它们可以不同。
name~n
通过遵循父指针为您提供了该提交的第n代祖先。name@{n}
在引用日志中为您提供该名称的第n个条目。例如,如果我在master上进行了3次提交(A,B和C),然后将master重置为B:
A <-- B <-- C
^ ^ ^
| | | master@{1}
| |
| | master
| | master@{0}
| | master~0
|
| master~1
答案 1 :(得分:1)
<refname>@{<n>}
,例如master@{1}
引用后跟后缀@
,并在大括号对中包含序号规范(例如{1}
,{15}
),指定该引用的第n
个优先值。例如,master@{1}
是master的紧前值,而master@{5}
是master的第5个优先值。此后缀只能在引用名称之后立即使用,并且引用必须具有现有的日志($GIT_DIR/logs/<refname>
)。
<rev>~<n>
,例如master~3
修订版参数的后缀
~<n>
表示提交对象,它是指定提交对象的第<n>
代祖先,仅跟随第一个父对象。即<rev>~3
等效于<rev>^^^
,等效于<rev>^1^1^1
。请参见下面有关此表格用法的说明。
虽然这两个描述声音相似,但实际上它们的含义不同。 ~n
在历史记录中从指定的修订版上移n
个父母。如果您查看自己的Git日志,那么它将向上移动n
到第一个父级。
@{n}
但是讨论了引用的日志。因此,这是在引用的引用日志之上移动的内容。要查看裁判的裁判日志,只需运行git reflog <ref>
,例如git reflog master
。 @{n}
将从顶部开始引用第n个项目(索引为零)。
因此,尽管~n
是关于Git历史记录的,但对于所有克隆的存储库而言,这是全局有效的,并且对于基本修订版始终会产生相同的结果,而@{n}
将取决于的引用历史记录。本地存储库。如果要提交或获取,则可以有效地修改reflog。因此,这并不是普遍有用的。