【问题标题】:How can I check that a branch doesn't have any merges?如何检查分支是否没有任何合并?
【发布时间】:2017-07-18 16:02:31
【问题描述】:

如何检查分支是否没有任何合并?具体来说,我想我想检查给定的基本提交和给定的目标提交之间没有合并提交。例如,我想检测其中任何一种情况何时发生:

target     o
          /|
         o |
          \|
           o
           |
base       o


target     o
           |
           |
           o
          /|
         / |
base     | o
         \ |
          \|
           o

【问题讨论】:

    标签: git merge branch


    【解决方案1】:

    最后的答案出奇地简单。您可能也想也可能不想在这里--ancestry-path

    git rev-list base..target --merges --count
    

    (或base^@..target 来检查base 本身,但可能你不想检查base,这可能是一个合并本身)。

    说明

    作为一般规则,我们几乎总是希望git rev-list 枚举提交。这个命令或多或少相当于git log。我们想要的范围是“所有可从目标到达的提交,不包括所有可从基础到达的提交”,即base..target

    接下来,您只想枚举此列表中的合并。所以我们添加了--merges,它不会影响修订行走,但确实避免列出除了合并提交(与两个或更多父级提交)之外的任何内容。

    我们并不真正关心 哪些 提交是合并。我们只想知道有没有。因此,如果我们得到合并计数,而不是合并列表,就足够了。添加--count 告诉git rev-list 生成计数而不是列表。

    如果结果不为零,则进行合并。

    祖先路径

    是否使用--ancestry-path这个问题只有你自己能回答。考虑:

    o  (target) commit blah
    |\
    o |  commit bar
    | o  commit foo
    o |  (base) commit quux
    | o  commit baz
    : |
    : :
    

    base..target 列表将包括提交 foobaz 以及更早的提交。但是这些提交不是基础和目标之间,因为它们不是基础提交quux的后代。

    如果您确实想考虑它们,请忽略--ancestry-path。如果他们不应该计算,包括--ancestry-path

    【讨论】:

    • 对于这个问题--ancestry-path 是无关紧要的,不是吗?如果祖先路径中有任何额外内容,则意味着一定有合并。它可能会影响计数,但不会影响是否有合并。你能确认一下吗?
    • 是的,进一步考虑,我认为--ancestry-path 在这里无关紧要。正如您所说,它可能会更改计数,但要这样做,计数至少需要为 1。添加 --ancestry-path 可能会加快步行速度,也许......或者可能会因为需要标记而减慢步行速度遍历期间图中的更多节点。没有测试很难确定。 (另外,很抱歉 --no-merges--merges :-) 当我在实时思考/谈论其他内容时输入答案时会发生这种情况)
    【解决方案2】:

    以下命令返回basetarget 之间的所有合并提交。

    git rev-list --merges base..target
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-06
      • 1970-01-01
      • 2013-03-11
      • 2015-02-08
      • 2019-09-03
      • 2017-08-26
      • 1970-01-01
      相关资源
      最近更新 更多