【问题标题】:git rev-list HEAD~n does not include first commit in rangegit rev-list HEAD~n 不包括范围内的第一次提交
【发布时间】:2013-07-11 17:32:55
【问题描述】:

我正在使用 git rev-list 以两种不同的方式从 repo 中获取提交的选择:

git rev-list --reverse HEAD~<n>..

和 git rev-list --reverse ..

阅读了 git rev-list 手册页后,我知道 .. 相当于 ^,并且这不会包含在所选提交范围内,但是手册页没有指定如果我想要一个该怎么做包含的提交范围(即包括)

我有同样的问题: git rev-list --reverse HEAD~..

这是我想要的规范:

假设我有四个提交:

A--B--C--D

我有一个脚本,我给出了两个提交:

myscript --from B --to D

我想要一个大小为 3 的提交列表:

B, C, D

或者如果我这样做了:

myscript --last 4

我会得到:

A, B, C, D

我建议的解决方案是:

git rev-list --reverse <tag1>~1..<tag2>

或 git rev-list --reverse HEAD~..

但是,如果 n == 提交次数,或者 tag1 是第一次提交,这将不起作用。

任何帮助将不胜感激。

【问题讨论】:

  • 所以对于 --last N 选项,我发现下面的工作非常好: git rev-list --reverse HEAD -n

标签: git version-control


【解决方案1】:

所以对于 --last N 选项,我发现以下的效果非常好:

git rev-list --reverse HEAD -n <n> 

不幸的是,选择包含范围的解决方案并不那么干净:

git rev-list --reverse <tag1>..<tag2> --boundary

这会给你你想要的,然而它会在第一次提交前放一个小破折号(“-”)。不过,这可以通过一些字符串处理来解决。

【讨论】:

    【解决方案2】:

    来自rev-list 手册页:

    列出可通过跟随给定提交的父链接访问的提交,但排除可从前面带有 ^ 的提交中访问的提交。

    要获得包含提交的列表,只需列出用空格分隔的两个引用。您的第一个引用应使用 tilda ~ 引用先前的提交,然后将其排除在外,用前导音圈符号 ^ 表示

    git rev-list --reverse ^<tag1>~ <tag2>
    

    例如:

    git log --oneline
    
    071f2c5 (HEAD -> master) D
    8b2c3ee C
    4f9aa7e B
    6296bbd A
    
    git rev-list --reverse ^4f9aa7e~ 071f2c5
    
    4f9aa7e4d421e7cad3113bf92967cb646484ea25
    8b2c3eeb38b21b5cf143e9a79c21bf23453eef85
    071f2c527712d8d16aede35e1881a07fb55b408f
    

    【讨论】:

      猜你喜欢
      • 2022-12-10
      • 2017-01-18
      • 1970-01-01
      • 1970-01-01
      • 2020-11-23
      • 2017-06-01
      • 2015-10-01
      • 2014-04-10
      • 2018-04-16
      相关资源
      最近更新 更多