问题描述
考虑以下历史:
#1 #2 #3 PR no.
-O-----A-----B-----C master
\ / \ / \ /
1-2 3-4 5-6 branches
可以看出,有 3 个 PR,通过提交 A、B、C 合并。这些合并的提交消息包含问题键:
- A:“合并 FIB-13 ...”
- B:“合并 FIB-21 ...”
- C:“合并 FIB-34 ...”
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
是否有一种很好的方法来编写脚本和/或可以通过 IntelliJ 的 Git 客户端或 Sourcetree 来实现?
解决方法
从我在评论中读到的内容来看,您遇到的第一个障碍是找到您想要 git cherry-pick
的所有提交。正如@torek 所提议的,使用 git log
或 git 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
。这样做的好处是它甚至可以找到源自功能分支的子分支的提交。
要获得相反的时间顺序,您只需将 --reverse
选项添加到 git log
和 git rev-list
。
输入样本:
./script.sh FIB-13 FIB-34
输出示例:
429ab60: 1
c458a31: 2
1c0d098: 5
3bd087c: 6
到达这里后,挑选樱桃应该很简单。