如何在两个标记之间直接列出提交

时间:2016-02-09 07:46:20

标签: git

为了创建自动发行说明工具,我创建了一个脚本,列出了两个标记之间的所有提交。但在某些情况下,这些工具列出了比我想要的更多提交。

例如,使用以下图表:

* abc123 [v42] Merge branch foo on branch bar
|\
* | def465 ...
* | fba602 ...
| * da07b4 ...
* | 98dc92 [v41] ...

在这种情况下,我想直接在v41和v42之间列出提交。我尝试使用git log v41..v42git log v41...v42(由codeWizard建议),但是git还包含了不是v41子代的提交da07b4

2 个答案:

答案 0 :(得分:2)

this answer中所述,

  

"之间"当谈到git提交时,这是一个有点滑的概念。

在我的情况下,我想确保忽略第一个标签不是子代的提交。这是我使用的脚本,在git merge-base命令的帮助下找到最近的合并基本祖先。

#!/bin/bash

base_hash=`git log --format=%H -1 $1`

# list all commits between start and end of a version
git log --format="%H" $1^..$2 | while read commit_hash; do
    # check if this commit is reeaaaaally part of the release note
    merge_base=`git merge-base $1 ${commit_hash}`

    if [ "${merge_base}" = "${base_hash}" ]; then 
        # profit
    fi
done

答案 1 :(得分:2)

您始终可以使用..(称为range)。

git log [first commit]..[second commit ] --pretty=oneline

这将显示给定范围内的所有提交。

.....

之间有何区别?

enter image description here

enter image description here

git log a..b

表示向我提供自a以来所做的所有提交,直到并包括b (或者,就像手册页所说的那样“包含可从b访问的提交但排除那些可以从“),三点变体

到达的那些

git log a...b

表示“包含可从a或b访问的提交但排除可从两者访问的提交”,这是完全不同的事情。