【问题标题】:Find all merge events between two branches查找两个分支之间的所有合并事件
【发布时间】:2022-01-23 15:41:17
【问题描述】:

我正在尝试确定将 master 合并到特定发布分支的频率。所以,我想知道所有合并基地的历史。有没有办法列出两个分支之间发生的所有合并?

【问题讨论】:

  • 这很接近,但是在分支 A 上执行 git log --merges 并不会显示哪些合并提交是在分支 B 中合并的结果。我想看到类似“B 中 A 中的所有合并提交”之类的内容。
  • 这几乎不可能——Git 并不记得过去提交属于哪个分支。分支只是 current 指向提交的指针。您可以尝试通过提交消息改进列表过滤它;这只是一个猜测,而不是解决方案。试试git log --merges --grep="Merge branch 'B'"
  • 我同意。分支只是一个提交的临时名称。你不合并分支;你合并提交。问题预设的概念毫无意义。
  • 关键是,如果您计划稍后进行此类搜索,那么以可搜索的方式标记合并提交是您的工作。您可以使用提交消息、标签等。但只有人类知道您在这里寻找什么; Git 没有。

标签: git merge merge-base


【解决方案1】:

你可以告诉 git log 为每个显示的提交输出父提交的提交哈希:

git log --format="%p" --first-parent --merges release

# to get only second parents, just use awk or cut :
git log --format="%p" --first-parent --merges release | awk '{ print $2 }'

您现在可以一一检查每个提交是否是分支master 的一部分,可能使用:

git rev-list --first-parent master | grep $sha

(“一个分支的第一个父母”是最接近该分支历史的东西)


使用单线:

git rev-list --format="%P" --first-parent --merges release | awk '{ print $2 }' |\
    grep -F -f <(git rev-list --first-parent master)

或调整您在 cmets 中对“uniq”的使用:

(git rev-list --format="%P" --first-parent --merges release | awk '{ print $2 }';\
  git rev-list --first-parent master) | sort | uniq -d

【讨论】:

  • 您对以下内容有何看法? git checkout &lt;release-branch&gt; &amp;&amp; echo "$(git --no-pager rev-list --merges HEAD)" "$(git --no-pager rev-list --merges master)" | uniq
  • 您要查找的合并是release 历史的一部分,但不是master 历史的一部分,git rev-list --merges master 不会列出您感兴趣的提交。
  • 更新了我的答案:意识到你只会在release中寻找合并在第一个父历史中
  • 你可以通过结合我的第一个命令的输出和git log --first-parent --format="%h" master(当你指定--formatgit rev-listgit log基本上是同义词)来完成你的uniq技巧跨度>
  • 我将选项固定为grep:我忘记了-f(从文件中读取模式)。 -F(将所有模式解释为固定字符串)只是为了加快速度。
猜你喜欢
  • 2018-11-15
  • 1970-01-01
  • 2012-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多