2015-06-14 69 views
4

我在master提交,我需要去下一个提交origin/mastergit日志反向,然后将结果限制为一个

git log --ancestry-path --date-order --reverse HEAD..origin/master 

或类似git rev-list命令给了我正确的提交,适当扭转,所以我可以|head -n 1这一点,用它来完成。

但是,我不知道它可以通过使用一个进程(一个git invokation)来获得它。首先限制-1的限制,然后反转列表,这不是我所需要的。

如何做到这一点?

我知道DAG是什么,我也知道足够的图论来理解为什么-1的行为就像那样。我在这里问的不是理论问题,而是使用软件开发中使用的工具的问题。

+0

看到没有'--reverse',你可以做'| tail -n 1',但你的'只有一个进程'的规范排除了这一点。这似乎不必要的严格,但你的问题,你的规则。无论如何,你是否考虑过将'-1'和'--reverse'组合成一个bug来报告糟糕的行为? – Novelocrat

+0

@Novelocrat我已经考虑过了,但那是在我阅读邮件列表存档之前。 – Flavius

回答

4

我90%确信这不能在单个Git调用中完成,原因有两个。

  1. 这看起来并不像他们已经实现它。提交有指向他们的父母,而不是他们的孩子,这就是为什么--max-count-1)和--skip(我也试了一下)在--reverse之前运行。由于Git能够在--reverse中打印或者不打印,因此以后运行-1应该在技术上是可行的,但是也许有一个根本原因并非如此。或者,他们也许会考虑它,并决定任何人都可以像你这样做--reverse | head -n 1

  2. 更重要的是,即使使用--ancestry-path,您也不能保证是唯一的下一次提交,因此采摘--reverse -1不明确。以下是git-log docs中的--ancestry-path说明的示例,其中您的HEAD可能是承诺E。如果您对--date-order感到满意,那更像是一个学术问题,但Git的DAG本质使得整个“下一个提交”概念不完善。

作为一个例子使用的情况下,考虑下面的提交历史:

D---E-------F 
/ \  \ 
    B---C---G---H---I---J 
/     \ 
A-------K---------------L--M 

定期D..M计算集是M的祖先提交的,但不包括那些是D的祖先。这是有用的,可以看到从D开始到M为止的历史中发生了什么,也就是说“在D中不存在M是什么”。这个例子中的结果将是所有的提交,除了A和B(当然还有D本身)。

当我们想知道M中提交的内容是否受到D引入的bug影响并需要修复时,我们可能只想查看实际上是D后代的D..M的子集,即排除C和K.这正是--ancestry-path选项所做的。应用于D ..M编号范围,它会导致:

E-------F 
\  \ 
    G---H---I---J 
       \ 
       L--M 
+0

嗨,谢谢,不过(请参阅我的更新):“我知道DAG是什么,我也知道足够的图论来理解为什么'-1'表现得像这样,我在这里问的不是理论问题,这是使用软件开发中使用的工具的问题。“ +1然而努力。 – Flavius

+0

它仍然看起来没有实现。如果有人发现,我会很高兴。 –

0

这你想要做什么:

git rev-list --children HEAD...origin/master^ | tail -2 | head -1 | cut -d" " -f 2- 

这甚至会打印传单N孩子,如果在这一点上历史叉。

你可以把它封装到一个git别名中来创建一个命令。

其他的解决方案,也How do I find the next commit in git?

+0

这是4个过程。 – Flavius

+0

是@Flavius,它是。和一个git的调用。当变成别名时,这将是一个命令。 –

+0

@Flavius如果这不是解决方案,请解释原因? –