首页 > 解决方案 > 通过提交消息搜索拉取请求/合并并挑选所有相应的提交

问题描述

考虑以下历史:

      #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

有没有一种好的方法来编写脚本和/或可以通过 IntelliJ 的 Git 客户端或 Sourcetree 来实现?

标签: gitintellij-ideaatlassian-sourcetree

解决方案


从我在评论中读到的内容来看,您遇到的第一个障碍是找到您想要的所有提交git cherry-pick。正如@torek 所提议的,它可以很容易地用git logor来完成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

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

要获得相反的时间顺序,您只需--reverse向两者添加选项git loggit rev-list

输入样本:

./script.sh FIB-13 FIB-34

输出样本:

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

一旦你到达这里,樱桃采摘应该很简单。


推荐阅读