HEAD~n^k在git上做什么



我注意到,可以使用^~字符指定实际提交的祖先。例如,如果我有以下提交的日志

* 1990f31 Somme third commit message 
* k135145 Somme second commit message 
* 2c13521 Somme first commit message 

那么我可以知道哪个是1990f31HEAD^1(或等同于HEAD~1(的父提交,哪个是k135145

现在,我还读到,当它是合并提交时,可以组合^~。因此,有人能提供一个例子来说明在键入git show HEAD~n^k时的提交引用吗?或者通过转换像git show HEAD^k~n这样的运算符来说明提交引用?,其中,我将nk视为表示正整数的抽象。

HEAD始终在您所在的位置。HEAD~n表示回溯的第n次修订(总是取第一个父项(。HEAD~n^k意味着,从HEAD返回的第n个修订,取第k个父项(HEAD~n是具有至少k个父级的合并修订(。

~^是运算符,可以用来指定提交历史中的任何祖先。

让我们从一个图表开始:

* 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
  • ~将进入第一个父母的链:

    • aa~bbaa~2ggaa~3hh
    • cc~ddcc~2ffcc~3也是hh
    • 但是单独使用~,从aa开始,您将无法探索some/feature分支:在合并点(bb(,ccbb第二个父级
    • 注意,~n是重复n次的~~...~的快捷方式,例如:aa~3aa~~~相同
  • ^将只上升一个级别,但允许您检查n-th父级是否有多个父级的提交

    • 调用xx^xx~相同:在这两种情况下,它都是xx的第一个父级
    • aa是一个常规提交,有一个单亲:所以aa^bb(与aa~相同(,aa^2不存在
    • bb是合并提交,有两个父级:bb^gg(与bb~相同(,bb^2ccbb^3不存在
    • 请注意,^n而不是^^...^的快捷方式,例如:
      bb^2bb的第二个父级(它是cc(
      bb^^bb的第一个父级的第一个母级(它就是hh(

在某些情况下,您可以有octopus合并提交,它可能有xx^3xx^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

任何指向提交的东西都可以与上面的aabbcc相提并论:

  • HEADsha1some/branchsome/tag
  • git已知的其他一些引用:stash@{0}(存储中的项(、HEAD@{3}(HEAD的reflog中的元素(、master@{2}(master分支的reflog(

相关内容

  • 没有找到相关文章

最新更新