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



我知道这里有非常相似的问题,但它们并没有解决我的问题。也许有些地方我不太明白。

这是健身 (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.到目前为止,如果我想从ecf58917b4a07a,解决方案工作正常,但如果我想从a92b37f7b4a07a我想得到:

7b4a07a
ecf5891
082236e
a92b37f

但我不明白a92b37f

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

git rev-list --ancestry-path 7b4a07a..ecf5891

涉及到git提交时,"Between"是一个有点滑溜的概念。

上面显示的文本以及图形输出片段显示了为什么from^..to产生的不仅仅是这两个提交:to部分是合并提交。

符号A..B实际上只是B ^A的简写。 也就是说,"一切从B开始,向后工作,减去一切从A开始,向后工作"。 但是B是一个合并提交,所以"一切都从那里开始并向后工作"使用父项。

在这里,7b4a07a的第一个父级是a92b37f(不在上面的[原始]片段中,但我克隆了链接的存储库并找到了它)。 不过,我们可以象征性地提及它,我将在下面提及它。 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的答案也有效,一旦你把帽子移到前面。


重新编辑您的编辑("如果我想从a92b37f7b4a07a"):我们又回到了"之间"是一个滑溜溜的概念的问题。 哪些提交是"介于"之间的? 从 a92b37f7b4a07a 有一条直线,因为a92b37f是合并提交7b4a07a的两个父级之一。 因此,按照前面的逻辑("直接在祖先行上提交",也许是"包容性"),那只是这两个提交中的一个,或者两个。 但是你说你想要两个在任何祖先意义上都与a92b37f完全无关的提交。 为什么需要这两个特定的提交? 是什么让082236e"有趣",而082236e^,它的父母,"无趣"?

首先确定相关的 2 个提交哈希

,您需要使用
git log --oneline

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

git log <commit hash 1>..<commit hash 2> --oneline | cut -d " " -f 1

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

最新更新