在git中列出2个提交哈希之间的提交

时间:2013-09-08 02:41:17

标签: git commit

我知道这里有非常相似的问题,但它们并没有解决我的问题。 也许有些东西我不太了解。

这是fitnesse(https://github.com/unclebob/fitnesse/)的提交历史的一部分:

* | | | | | | | | | | | | | | | fa86be8 Avoid possible issue when using CachingPage under heavy memory load.
|/ / / / / / / / / / / / / / /  
* | | | | | | | | | | | | | |   7b4a07a Merge pull request #256 from barredijkstra/fitnesse_issue_250
|\ \ \ \ \ \ \ \ \ \ \ \ \ \ \  
| * | | | | | | | | | | | | | | ecf5891 Fixed test checking for OS specific exception message.
| * | | | | | | | | | | | | | | 082236e Added rendering of cause exceptions. Fix for unclebob/fitnesse#250
* | | | | | | | | | | | | | | |   a92b37f Merge pull request #243 from amolenaar/fix/243-hash-table-rendering

我想要2个提交哈希之间的提交列表。在这种特殊情况下,我想要ecf58917b4a07a之间的提交,我希望结果是:

ecf5891
7b4a07a

我已经使用git rev-list commit_hash_from_here^..commit_hash_up_to_here了,它在线性历史上运行良好。但是,在这种情况下,我会收到更多提交。

我已经尝试了这个,它的工作方式与预期一致:

git log --since='<date ecf5891>' --until='<date 7b4a07a>'

(我手动搜索了这两个日期)。

一个可能的解决方案是获得2个日期并且就这样做,但我认为应该有更好的方法。

编辑: 7b4a07a个父母是ecf5891a92b37f。到目前为止,如果我想从ecf5891转到7b4a07a,解决方案可以正常工作,但如果我想从a92b37f转到7b4a07a我希望得到:

7b4a07a
ecf5891
082236e
a92b37f

但我没有得到a92b37f

4 个答案:

答案 0 :(得分:26)

“介于”之间是一个有点滑的概念,当谈到git提交时。

上面显示的文字(带有图表输出片段)显示了为什么 from^..to 产生的不仅仅是那两个提交: to part是合并提交。

符号 A..B 实际上只是 B ^A 的简写。也就是说,“一切都从 B 开始,向后工作,减去从 A 开始向后工作的所有内容”。但是 B 是一个合并提交,因此“从那里开始并向后工作的所有内容”都使用父母

此处7b4a07a的第一个父级是a92b37f(不在上面的[原始]代码段中,但我克隆了链接的repo并找到了它)。我们可以象征性地引用它,我将在下面。 7b4a07a的第二个父级是ecf5891,即您感兴趣的“来自”部分。

当你要求:

ecf5891^..7b4a07a

这意味着:

7b4a07a ^ecf5891^

与:

相同
7b4a07a ^082236e

它会让你成为合并的父母,然后从082236e返回所有内容。你需要修剪7b4a07a^ - 第一个父亲 - 以及后面的所有内容:

git rev-list 7b4a07a ^ecf5891^ ^7b4a07a^
git log --oneline 7b4a07a ^ecf5891^ ^7b4a07a^

但一般来说,你必须弄清楚要切断的后代线。

编辑:您可以坚持使用 A..B 表示法,但您需要添加额外的“排除”。所以jthill's answer也可以,一旦你把帽子移到前面。


重新编辑(“如果我想从a92b37f转到7b4a07a”):我们又回到了“介于”这个滑溜概念的问题上。哪些提交是“之间”?从a92b37f7b4a07a有一条直接线,因为a92b37f是合并提交7b4a07a的两个父项之一。因此,通过早期的逻辑(“直接在祖先线上提交”,也许是“包容性”),这两个提交中只有一个或两个提交。但是你说你想要两个在任何祖先意义上都没有与a92b37f相关的提交。 为什么你想要那两个特定的提交?是什么让082236e“有趣”和082236e^,它的父母,“无趣”?

答案 1 :(得分:23)

我认为你正在寻找--ancestry-path,在你的情况下:

$ pip install bunch

答案 2 :(得分:3)

添加^ 7b4a07a~也可以排除从合并的第一个父级可以访问的所有内容。您只排除其第二个父母可以访问的内容。

答案 3 :(得分:3)

首先使用

确定在它们之间获取提交哈希列表所需的相关2个提交哈希值
git log --oneline

然后,您可以选择相关的两个提交哈希,并使用

在它们之间找到提交哈希值
git log <commit hash 1> <commit hash 2> --oneline | cut -d " " -f 1