94

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

这是 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 个提交哈希之间的提交列表。在这种特殊情况下,我希望在 and 之间进行提交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。到目前为止,如果我想从 to 去,解决方案可以正常工作,但如果我想从 to 去ecf5891,我想得到:7b4a07aa92b37f7b4a07a

7b4a07a
ecf5891
082236e
a92b37f

但我不明白a92b37f

4

4 回答 4

67

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

git rev-list --ancestry-path 7b4a07a..ecf5891
于 2017-06-03T12:53:38.807 回答
41

当涉及到 git 提交时,“Between”是一个有点模糊的概念。

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

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

这里的第一个父级7b4a07aa92b37f(不在您上面的 [原始] 片段中,但我克隆了链接的存储库并找到了它)。不过,我们可以象征性地提及它,我将在下面提及。的第二个父级7b4a07aecf5891您感兴趣的“来自”部分。

当您要求:

ecf5891^..7b4a07a

这意味着:

7b4a07a ^ecf5891^

这与以下内容相同:

7b4a07a ^082236e

这让你成为合并的父母,然后从082236e后面修剪掉所有东西。您需要从7b4a07a^第一个父级和后面删除所有内容:

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

但是,一般来说,您必须弄清楚要切断哪些后代行。

编辑:您可以坚持使用该A..B符号,但您确实需要添加额外的“排除”。因此,一旦您将帽子移到前面,jthill 的答案也有效。


重新编辑您的编辑(“如果我想从a92b37f7b4a07a”):我们又回到了“介于”这个问题上,这是一个滑溜溜的概念。哪些提交是“之间”?a92b37f从to有一条直线7b4a07a,因为a92b37f它是合并提交的两个父级之一7b4a07a。因此,根据较早的逻辑(“直接在祖先线上提交”,也许是“包容性”),这将只是这两个提交中的一个,或者可能两者兼而有之。但是您说您想要两个根本不相关的提交a92b37f为什么你想要这两个特定的提交?是什么让082236e“有趣”和082236e^“无趣”?

于 2013-09-08T03:24:53.340 回答
12

首先确定相关的 2 个提交哈希,您需要使用这些哈希获取它们之间的提交哈希列表

git log --oneline

然后,您可以选择相关的两个提交哈希,并通过使用找到它们之间的提交哈希

git log <commit hash 1>..<commit hash 2> --oneline | cut -d " " -f 1
于 2016-11-30T05:29:53.690 回答
3

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

于 2013-09-08T03:19:59.983 回答