git rev-list HEAD~n不包括范围内的第一次提交

时间:2013-07-11 17:32:56

标签: git version-control

我正在使用git rev-list以两种不同的方式从回购中提取一系列提交:

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

和     git rev-list --reverse ..

阅读了git rev-list联机帮助页,我知道..等同于^,并且这不包括在所选的提交范围内,但是如果我想要的话,手册页没有指定要做什么包含范围的提交(包括)

我遇到同样的问题:      git rev-list - 反向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 - 反向HEAD〜..

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

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:2)

因此对于--last N选项,我发现以下工作非常好:

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

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

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

这将为您提供所需的内容,然而它会在第一次提交前放置一个小破折号(“ - ”)。这可以通过一些字符串处理来解决。

答案 1 :(得分:0)

来自rev-list手册页:

  

通过跟踪来自给定提交的父链接可以访问的列表提交,但是排除可以从在它们前面的^给出的提交中提交的提交。 < / p>

要获取包含的提交列表,只需列出由空格分隔的两个引用。您的第一个引用应该使用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