【问题标题】:What does HEAD~n^k does on git? [duplicate]HEAD~n^k 在 git 上做了什么? [复制]
【发布时间】:2020-12-06 02:51:46
【问题描述】:
我注意到可以通过使用^ 或~ 字符来指定实际提交的祖先。例如,如果我有以下提交日志
* 1990f31 Somme third commit message
* k135145 Somme second commit message
* 2c13521 Somme first commit message
然后我可以知道1990f31 和HEAD^1(或等效于HEAD~1)的父提交是k135145。
现在,我还 read 可以在合并提交时组合 ^ 或 ~ 。因此,有人可以提供一个示例来说明在键入 git show HEAD~n^k 时提交引用,或者通过转换此运算符,如 git show HEAD^k~n?,我正在考虑将 n 和 k 作为表示正整数的抽象。
【问题讨论】:
标签:
git
version-control
git-show
【解决方案1】:
HEAD 始终在您所在的位置。 HEAD~n 表示第 n 次修订(始终采用第一个父级)。 HEAD~n^k 表示,从HEAD 返回的第 n 个修订版,采用第 k 个父级(HEAD~n 是具有至少 k 个父级的合并修订版)。
【解决方案2】:
~ 和 ^ 是运算符,您可以使用它们来指定提交历史中的任何祖先。
让我们从图表开始:
* aa (HEAD, master) commit
* bb merged branch `some/feature` into master
|\
| * cc (some/feature) feature: completed
| * dd feature: wip
| * ff feature: start
* | gg some fix on master
|/
* hh some commit on master
在某些情况下,您可以进行 octopus 合并提交,其中可能有 xx^3、xx^4 ... 父母。
通过组合运算符,您可以“导航”到任何祖先提交。
例如,从aa 开始,到达ff 的一种方式是:
aa~^2~2
# some other ways to describe a path to reach `ff` :
aa^^2~2 # to reach the first parent, ~ or ^ are equivalent
aa~^2~~ # ~2 is the same as ~~
aa^^2^^
...
一般来说,您不能切换 ~ 和 ^ 序列,因为它们不会指向同一个提交。
例如:
aa~^2 # points at cc
aa^2~ # does not exist
任何指向提交的东西都可以代替上面的aa、bb 或cc:
-
HEAD、sha1、some/branch、some/tag ...
- git 已知的其他一些引用:
stash@{0}(存储中的项目),HEAD@{3}(HEAD 的引用日志中的元素),master@{2}(master 分支的引用日志中的元素)
- ...