代码之家  ›  专栏  ›  技术社区  ›  JCollier

通过相对引用[duplicate]转到子提交的能力

git
  •  0
  • JCollier  · 技术社区  · 5 年前

    ref^ ref ,那得到承诺呢 之后 裁判 ?

    例如,如果我 git checkout 12345

    是的,git是一个DAG节点指针结构树。 在这一次之后我如何找到提交?

    0 回复  |  直到 6 年前
        1
  •  192
  •   Tim Hunt    13 年前

    要列出所有提交,从当前提交开始,然后是其子提交,以此类推—基本上是标准的git日志,但时间上是相反的,请使用

    git log --reverse --ancestry-path 894e8b4e93d8f3^..master
    

        2
  •  38
  •   VonC    11 年前

    哈德逊的创造者(现为詹金斯) Kohsuke Kawaguchi 刚刚出版(2013年11月):
    kohsuke / git-children-of :

    #!/bin/bash -e
    # given a commit, find immediate children of that commit.
    for arg in "$@"; do
      for commit in $(git rev-parse $arg^0); do
        for child in $(git log --format='%H %P' --all | grep -F " $commit" | cut -f1 -d' '); do
          git describe $child
        done
      done
    done
    

    如图所示 this thread ,在基于 DAG (Directed Acyclic Graph) ,不存在“单亲”或“单子”。

            C1 -> C2 -> C3
          /               \
    A -> B                  E -> F
          \               /
            D1 -> D2 ----/
    

    GitPro book )

    但是自从 Git1.6.0

    git rev-list --children
    git log --children
    

    注:用于 parent commits ^ 修改参数,表示 提交对象的父对象。 ^<n> 是指 <n> 父母(即。 rev^ rev^1 ).

    foo git merge bar “那么 将是第一个家长。
    一、 e:第一个父级是合并时所在的分支,第二个父级是合并时所在分支的提交。

        3
  •  20
  •   white_gecko    12 年前

    我发现的是

    git rev-list --ancestry-path commit1..commit2
    

    我要去哪里 commit1 commit2 委员会2 .

    输出的最后一行是commit1的子级(在commit2的路径上)。

        4
  •  10
  •   vontrapp    13 年前

    然而,真正的问题是子提交没有被引用,它只是一个向后链接的列表。找到子commit需要一个搜索,这也不算太糟,但可能不是git想要放到refspec逻辑中的东西。

    然后是“git checkout branch~7”等等。

        5
  •  9
  •   bdesham    6 年前

    两个实用的答案:

    基于 @Michael's answer child 我的别名 .gitconfig .

    # Get the child commit of the current commit.
    # Use $1 instead of 'HEAD' if given. Use $2 instead of curent branch if given.
    child = "!bash -c 'git log --format=%H --reverse --ancestry-path ${1:-HEAD}..${2:\"$(git rev-parse --abbrev-ref HEAD)\"} | head -1' -"
    

    它默认为通过跟随祖先向当前分支的尖端前进一步(除非另一个commit ish作为第二个参数给出),来给HEAD的子级(除非给出另一个commit ish参数)。

    使用 %h 而不是 %H 如果你想要简短的哈希表。

    多子女

    使用分离的头(没有分支)或获取所有子级(不考虑分支):

    # For the current (or specified) commit-ish, get the all children, print the first child 
    children = "!bash -c 'c=${1:-HEAD}; set -- $(git rev-list --all --not \"$c\"^@ --children | grep $(git rev-parse \"$c\") ); shift; echo $1' -"
    

    $1 $* 打印所有的孩子。

    你也可以改变 --all 对于提交,只显示作为该提交的祖先的子级换句话说,只显示给定提交方向上的子级。这可能有助于将输出从多个孩子缩小到只有一个孩子。

        6
  •  7
  •   Matt McHenry    6 年前

    在这种情况下,您没有考虑到特定的“目的地”提交,而是希望看到子提交可能在 分支,可以使用以下命令:

    git rev-list --children --all | grep ^${COMMIT}
    

    如果你想看到所有的孩子 还有孙子孙女 ,你必须使用 rev-list --children

    git rev-list --children --all | \
    egrep ^\($(git rev-list --children --all | \
               grep ^${COMMIT} | \
               sed 's/ /|/g')\)
    

    (给出 只有 孙子会用更复杂的 sed 和/或 cut .)

    最后,你可以把它输入 log --graph 命令查看树结构,如下所示:

    git log --graph --oneline --decorate \
    \^${COMMIT}^@ \
    $(git rev-list --children --all | \
      egrep ^\($(git rev-list --children --all | \
                 grep ^${COMMIT} | \
                 sed 's/ /|/g')\))
    

    :以上命令都假定您已经设置了shell变量 ${COMMIT}

        7
  •  6
  •   M K    9 年前

    我尝试过许多不同的解决方案,但没有一个对我有效。我得自己想办法。

    查找下一个提交

    function n() {
        git log --reverse --pretty=%H master | grep -A 1 $(git rev-parse HEAD) | tail -n1 | xargs git checkout
    }
    

    function p() {
        git checkout HEAD^1
    }
    
        8
  •  5
  •   torek    5 年前

    (这是从回答一个重复的问题开始的。我已经做了一些光编辑来清理它。)

    Git的所有内部箭头都是单向的,指向后方。因此,没有简单方便的语法来向前推进:这是不可能的。

    可以“逆着箭头移动”,但是如果你以前没有见过它,那么它的方法是令人惊讶的,然后是显而易见的。假设我们有:

    A <-B <-C <-D <-E   <-- last
            ^
            |
             \--------- middle
    

    使用 middle~2 C 回到 A . 那么我们如何从 C级 D ? 答案是:我们从 E last ,然后向后工作直到 middle , 记录我们沿途参观的地点 . 然后我们就朝着 :移动一步到 D级 电子 .

    当我们有分支机构时,这一点尤为重要:

              D--E   <-- feature1
             /
    ...--B--C   <-- master
             \
              F--G   <-- feature2
    

    下一步是什么 在特征方向___ (填空)。

    枚举 (不包括 )比如说, G ,我们使用:

    git rev-list --topo-order --ancestry-path master..feature2
    

    这个 --topo-order 确保即使在存在复杂的分支和合并的情况下,提交也是按拓扑排序的。这仅在链不是线性的情况下才需要。这个 --ancestry-path feature2 ,我们只列出已提交的提交 C级

    A--B--C   <-- master
     \     \
      \     F--G--J   <-- feature2
       \         /
        H-------I   <-- feature3
    

    一个简单的申请表 feature2..master J , I ,和 F H 以某种顺序。与 --祖传路径 我们击倒 :他们不是 C级 --拓扑顺序 我们确保实际的枚举顺序是 日本 ,那么 F级 .

    这个 git rev-list 功能2 最后的 线路。

    --reverse

    git rev-list --topo-order --ancestry-path --reverse <id1>...<id2> | head -1
    

    为了得到“id2方向的下一个提交”,并且有一个很长的提交列表 git版本列表 命令尝试写入时可能会导致管道损坏 head 已停止读取其输入并退出。由于断开的管道错误通常会被shell忽略,因此这种方法基本上是有效的。一定要让他们被忽略 用法。

    这也很吸引人 -n 1 命令,以及 --反转 . 别这样!这使 git版本列表 走一步就停下来 ,然后反转所访问的提交的(一个条目)列表。所以这就产生了 <id2>

    重要的旁注

    注意,对于“钻石”或“苯环”图形碎片:

           I--J
          /    \
    ...--H      M--...  <-- last
          \    /
           K--L
    

    将一个提交从 朝着 任何一个 K

    解决这一问题的方法是避免一次只移动一步,并避免陷入路径依赖链。相反,如果你计划访问整个祖先路径链, 在做其他事情之前 ,做一个

    git rev-list --topo-order --reverse --ancestry-path A..B > /tmp/list-of-commits
    

    --拓扑顺序 -以及- 日本 按顺序,然后 K公司 -以及- L 按照这个顺序(虽然没有简单的方法来预测你是在K-L对之前还是之后做I-J对)。

        9
  •  4
  •   weakish    10 年前

    我有这个化名 ~/.gitconfig

    first-child = "!f() { git log  --reverse --ancestry-path --pretty=%H $1..${2:-HEAD} | head -1; }; f"
    
        10
  •  2
  •   Perception    12 年前

    git log --reverse --children -n1 HEAD (where 'n' is the number of children to show)
    
        11
  •  2
  •   Michael come lately PhiLho    7 年前

    如果子提交都在某个分支上,则可以使用 gitk --all commit^.. ,其中“commit”是标识提交的内容。例如,如果提交的缩写SHA-1是c6661c5,则键入 gitk --all c6661c5^..

    您可能需要在gitk的“sha1id:”单元格中输入完整的SHA-1。您将需要完整的SHA-1,对于本例,可以通过 git rev-parse c6661c5

    git rev-list --all --children | grep '^c6661c5883bb53d400ce160a5897610ecedbdc9d' 将生成一行,其中包含此提交的所有子级,推测是否涉及分支。

        12
  •  0
  •   lprsd    15 年前

    因此,无法指向来自父级的子提交(如果有的话)。

        13
  •  0
  •   Alex Dresko    10 年前

    这篇文章( http://www.jayway.com/2015/03/30/using-git-commits-to-drive-a-live-coding-session/#comment-282667 git config --global alias.next '!git checkout `git rev-list HEAD..demo-end | tail -1`' 其中“demo end”是最后一个标记。

        14
  •  0
  •   snipsnipsnip    5 年前

    git rev-list --all 因为没有分支包含这个。

    最后我看了一遍 gitk --reflog

    如果即使在reflog中也找不到提交,请尝试: