通过提交消息搜索拉取请求/合并并挑选所有相应的提交

Search pull requests / merges by commit message and cherry-pick all corresponding commits

考虑以下历史:

      #1    #2    #3   PR no.

-O-----A-----B-----C   commits on master (merges)
  \   / \   / \   /
   1-2   3-4   5-6     commits on branches

可以看出,有 3 个 PR,通过提交 A、B、C 合并。这些合并的提交消息包含问题键:

现在我想搜索某些问题并获取他们引入的提交列表:

Input: List of issue keys
Output: List of commits from PRs

Example
-------

Input: FIB-13, FIB-34
Output: 1, 2, 5, 6

之后,我想将这些提交挑选到另一个分支中,逐个提交:

-1-2-5-6   another branch

是否有编写此脚本的好方法and/or可以通过 IntelliJ 的 Git 客户端或 Sourcetree 实现吗?

根据我在评论中看到的内容,您遇到的第一个障碍是找到您想要的所有提交 git cherry-pick。正如@torek 所建议的那样,可以使用 git loggit rev-list 轻松完成。基本上是这样的:

#!/bin/bash
first_log="git rev-list --reverse --merges"
for feature in $@ 
do
    first_log+=" --grep=\"^Merge ${feature}\"" 
done

for cmt in $(eval "$first_log master")
do
    git log --format="%h: %s" --reverse ${cmt}^2 ^${cmt}^1
done

对其作用的简要说明: 它遍历输入参数 $@,并添加与您传递的特征 ID 一样多的 --grep。然后它评估 git rev-list 命令并为找到的每个合并提交检索属于合并提交的第二个父级的所有提交,这是功能分支提示,但无法从合并提交的第一个父级访问,这是主分支中的先前提交:${cmt}^2 ^${cmt}^1。这样做的好处是,它甚至可以找到来自功能分支的子分支的提交。

要获得相反的时间顺序,您只需要在 git loggit rev-list 中添加 --reverse 选项即可。

输入样本:

./script.sh FIB-13 FIB-34

输出样本:

429ab60: 1
c458a31: 2
1c0d098: 5
3bd087c: 6

到达这里后,挑选樱桃应该非常简单。