关于 git rev-list 的混淆

4

我想知道在分支 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

然而,当我尝试验证此提交ID (1f345e80fba518c72dec7f2e02da5da12be5810f) 的版本号时,结果显示:版本号为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个缺失的提交ID是:

90  63546ce0207cdd6ade353ea05c466d0210af1d29
98  937807239dd706f3bf124dd4d3266c71fd8071f4

根据git show <commit-id>的结果,没有发现任何异常。这两个提交都是由同一个人提交的。但是这个人在前100次提交中提交了10次。
这是否是一个git rev-list的问题?
1个回答

5
我不太清楚你想做什么,但是无论你想做什么,git rev-list 都不能做到。 git rev-list 的作用是通过遍历提交图来列出可达的提交记录,在从特定的起点开始时应用一些限制条件。遍历本身可以按特定顺序完成,有些提交可以选择简化掉,你可以使用 --max-count 提前停止遍历或使用 --skip 跳过一些初始提交,而且在找到一组提交后,它们可以被反转和/或计数。
你没有设置图形本身的任何限制(没有路径参数),也没有启用任何简化模式、跳过或最大计数,但是你确实要求最终反转这个集合。
你的起始点是 --branches=dev(这意味着 --branches=dev/*)和 HEAD 以及 --branches=dev 和另一个提交 1f345e80fba518c72dec7f2e02da5da12be5810f
你要求使用 --date-order 进行遍历,这意味着每当 Git 有两个提交可以立即遍历时,它应该选择时间戳较晚的那个,只要它没有选择尚未选择的子提交的父提交。
HEAD 可达的提交可能包括从 refs/heads/dev/*(所有 dev 分支)选择的提交中不可达的提交。如果 1f345e80fba518c72dec7f2e02da5da12be5810f 本身不可从一个 dev 分支到达,则可以从 1f345e80fba518c72dec7f2e02da5da12be5810f 可达的提交也可能不同。在反转列表后,第100个这样的提交不同并不奇怪。

好的,我正在做的是...实际上,设置软件包构建版本。例如,产品版本为1.0.0;我想在版本中添加代码信息;这意味着:1.0.0 -> 1.0.0.<code_info>。因此,如果某个软件包出现问题,我可以追溯到相关的源代码。我使用rev-number作为<code_info>,因为rev-number是连续且易于理解的。例如,1.0.0.100表示该软件包是从第100次提交构建的... - Marslo
不要那样做。使用 git tag -a 创建带注释的版本标签,然后使用 git describe 基于这些标签创建易读的名称。 - torek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接