微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

考虑以下历史:

      #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 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。这样做的好处是它甚至可以找到源自功能分支的子分支的提交。

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

输入样本:

./script.sh FIB-13 FIB-34

输出示例:

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。