为了创建自动发行说明工具,我创建了一个脚本,列出了两个标记之间的所有提交。但在某些情况下,这些工具列出了比我想要的更多提交。
例如,使用以下图表:
* abc123 [v42] Merge branch foo on branch bar
|\
* | def465 ...
* | fba602 ...
| * da07b4 ...
* | 98dc92 [v41] ...
在这种情况下,我想直接在v41和v42之间列出提交。我尝试使用git log v41..v42
和git log v41...v42
(由codeWizard建议),但是git还包含了不是v41子代的提交da07b4
。
答案 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)