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

问题描述 投票:0回答:5

我知道这里有非常类似的问题,但他们没有解决我的问题。 也许有些地方我不太理解。

这是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 个提交哈希之间的提交列表。在这种特殊情况下,我希望在

ecf5891
7b4a07a
之间进行提交,并且我希望结果是:

ecf5891
7b4a07a

到目前为止我一直在使用

git rev-list commit_hash_from_here^..commit_hash_up_to_here
并且它在线性历史方面效果很好。然而,在这种情况下,我得到了更多的提交。

我已经尝试过了,它的效果正如预期的那样:

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

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

一个可能的解决方案是获取 2 个日期并执行此操作,但我认为应该有更好的方法。

编辑:

7b4a07a
父母是
ecf5891
a92b37f
。到目前为止,如果我想从
ecf5891
7b4a07a
,解决方案工作正常,但如果我想从
a92b37f
7b4a07a
,我想得到:

7b4a07a
ecf5891
082236e
a92b37f

但我不明白

a92b37f

git commit
5个回答
103
投票

我认为您正在寻找--ancestry-path,就您而言:

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

43
投票

当涉及到 git 提交时,“之间”是一个有点难以捉摸的概念。

上面显示的文本以及图形输出片段,显示了为什么

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 的答案也有效。


重新编辑(“如果我想从

a92b37f
7b4a07a
”):我们又回到了“之间”是一个难以捉摸的概念的问题。哪些提交是“之间”?从
a92b37f
7b4a07a
有一条直线,因为
a92b37f
是合并提交
7b4a07a
的两个父级之一。因此,根据早期的逻辑(“直接在祖先线路上提交”,也许是“包容性”),这将只是这两个提交中的一个,也可能是两者。但你说你想要两个提交,从任何祖先的意义上来说,这两个提交根本与
a92b37f
无关。 为什么你想要这两个特定的提交?是什么让
082236e
“有趣”,而其父级
082236e^
“无趣”?


28
投票

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

git log --oneline

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

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

3
投票

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


0
投票

您也可以针对用例创建如下所示的 powershell 脚本...(bash 脚本应该非常相似)

param(
    [Parameter(Mandatory = $true)]
    [string] $From,
    [Parameter(Mandatory = $false)]
    [string] $To
)

if (! $To) {
  $To = "HEAD"
}

$FromDate=git show --no-patch --format=%ci $From
$ToDate=git show --no-patch --format=%ci $To

git log --since="$FromDate" --until="$ToDate" --pretty="%Cblue%h%Creset (%ch by %Cgreen%an%Creset) %s"
© www.soinside.com 2019 - 2024. All rights reserved.