“ name〜n”和“ name @ {n}”是否始终引用同一提交?

时间:2019-01-17 22:42:51

标签: git

给出对诸如name之类的提交的引用,name~nname@{n}始终引用同一提交吗?我可以互换使用吗?

2 个答案:

答案 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)

引用the documentation

  

<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。因此,这并不是普遍有用的。