关于git rev-list的困惑

时间:2017-07-06 13:50:20

标签: git git-rev-list

我想知道在分支dev中使用100提交的相关commit-id。 (例如:git rev-list --reverse --branches=dev --date-order --count <commit-id> == 100):

获得100次提交是1f345e80fba518c72dec7f2e02da5da12be5810f

$ git rev-list --reverse --branches=dev --date-order HEAD | head -100 | tail -1
1f345e80fba518c72dec7f2e02da5da12be5810f

$ git rev-list --reverse --branches=dev --date-order HEAD | nl | grep 100
   100  1f345e80fba518c72dec7f2e02da5da12be5810f

$ git rev-list --reverse --branches=dev --date-order HEAD | awk '{print NR"\t"$0}' | grep -E ^100
100     1f345e80fba518c72dec7f2e02da5da12be5810f

但是,当我尝试验证有关此commit-id(1f345e80fba518c72dec7f2e02da5da12be5810f)的rev-number时,结果显示:rev number 98 !!!

$ git rev-list --reverse --branches=dev --date-order --count 1f345e80fba518c72dec7f2e02da5da12be5810f
98

$ git rev-list --reverse --branches=dev --date-order 1f345e80fba518c72dec7f2e02da5da12be5810f | nl | tail -1
    98  1f345e80fba518c72dec7f2e02da5da12be5810f

所以我试着找出缺少哪两个提交:

$ git rev-list --reverse --branches=dev --date-order HEAD | head -100 | nl > commit-100.log
$ git rev-list --reverse --branches=dev --date-order 1f345e80fba518c72dec7f2e02da5da12be5810f | head -100 | nl > commit-98.log
$ diff -y commit-100.log commit-98.log
 90  63546ce0207cdd6ade353ea05c466d0210af1d29              |     90  75a8fd85043908049e11595aaa2c988282fa1a0c
 91  75a8fd85043908049e11595aaa2c988282fa1a0c              |     91  c1bbb33cd0241c16dde2579696c08ed2eb146cdf
 92  c1bbb33cd0241c16dde2579696c08ed2eb146cdf              |     92  28e9bbc06cb3036bce4cce71f5acf4b27835e9a0
 93  28e9bbc06cb3036bce4cce71f5acf4b27835e9a0              |     93  7b1d0caddc6218eb982d27c1df27c885bc84204c
 94  7b1d0caddc6218eb982d27c1df27c885bc84204c              |     94  945fd63a256391e72e55e8ac98c449c1473c1e5e
 95  945fd63a256391e72e55e8ac98c449c1473c1e5e              |     95  0ff3f47eb8dc40815ac7effdb2172e5d69dd0e10
 96  0ff3f47eb8dc40815ac7effdb2172e5d69dd0e10              |     96  ac90a7b2a371ff7a0fad0475d94691663aceaa1b
 97  ac90a7b2a371ff7a0fad0475d94691663aceaa1b              |     97  1a0e26b517f88870fed0cf5f346495b67c29463a
 98  937807239dd706f3bf124dd4d3266c71fd8071f4              |     98  1f345e80fba518c72dec7f2e02da5da12be5810f
 99  1a0e26b517f88870fed0cf5f346495b67c29463a              <
100  1f345e80fba518c72dec7f2e02da5da12be5810f              <

显然,2 缺少 commit-id是:

90  63546ce0207cdd6ade353ea05c466d0210af1d29
98  937807239dd706f3bf124dd4d3266c71fd8071f4

根据git show <commit-id>,并没有什么奇怪的。这两个提交是由同一个人提交的。但是这个人在前100次提交中犯了10次。

这是git rev-list问题吗?

1 个答案:

答案 0 :(得分:3)

我不太清楚你想要做什么,但git rev-list不会这样做,无论它是什么。

git rev-list做的是列出可到达的提交,通过遍历提交图,从特定的起始点开始,同时应用一些约束集。 walk本身可以按特定顺序完成,一些提交可以选择性地简化,你可以使用--max-count提前停止步行或者使用--skip跳过一些初始提交,并在提交后提交发现它可以被撤销和/或计算。

你没有对图形本身设置任何约束(没有路径参数),并且没有启用任何简化模式或跳过或最大计数,但你确实要求最后反转该设置。

在一个案例中,您的起点为--branches=dev(表示--branches=dev/* HEAD--branches=dev 在另一个中提交1f345e80fba518c72dec7f2e02da5da12be5810f

你要求在--date-order中完成漫游,这意味着每当Git有两个提交它可以立即行走时,它应该选择具有更晚提交时间戳的那个,只要它不是选择尚未选择的子提交的父级。

HEAD可到达的提交集可能包括从refs/heads/dev/*(所有dev分支)选择的提交集中无法访问的提交。如果1f345e80fba518c72dec7f2e02da5da12be5810f本身无法从1f345e80fba518c72dec7f2e02da5da12be5810f个分支到达dev,那么从sss.appendRow(createSupersteps(userIds));可到达的提交集也可能会有所不同。第100次这样的提交(在颠倒列表之后)不同,这并不奇怪。