gpt4 book ai didi

git cherry-pick 在提交消息包含字符串/匹配正则表达式的范围内提交?

转载 作者:行者123 更新时间:2023-12-05 08:41:53 24 4
gpt4 key购买 nike

背景/场景

我有一个本地工作流

  • 我总是在“本地”分支(“master”的祖先)上提交,使用以问题编号开头的提交消息,例如“#123: Some message”。
  • 我创建功能分支,它们也是“master”的祖先。
  • 然后我使用 rebase 和/或 cherry-pick 将提交从本地复制到相应的功能分支。

例如一种方法:

git checkout local
git checkout -b 123-my-feature
git rebase -i master

在交互式 rebase 编辑器中,删除消息不以 #123 开头的所有提交。这留下了一个功能分支 123-my-feature,它只包含问题 #123 的提交。

稍后,在分支 123-my-feature 已经存在之后,如果消息以 #123 开头,则本地的后续提交也需要被挑选/复制到 123-my-feature 分支。这也可以通过交互式 rebase 或单独的 cherry-picks 来实现。但过程繁琐。

问题

有没有办法用 cherry-pick 来做到这一点,并自动按提交消息过滤?

例如

git checkout master
git checkout -b 123-my-feature
git cherry-pick master..local --commit-message-begins-with="#123"

或者甚至是一个交互式的 cherry-pick,我可以在其中手动删除不以“#123”开头的提交。

如果有另一个命令可以实现这一点,为什么不呢。不必是精心挑选的。

最佳答案

不是直接的,不——但是很容易编写一个脚本来完成它。

大多数其他 Git 命令背后的通用命令是 git rev-list, which has a huge option list .不过,关于 git rev-list,首先要了解的是,它实际上与 git log 几乎是同一个命令。它们都采用相同的选项,并做大部分相同的事情,除了 git rev-list 旨在为其他 Git 程序生成哈希 ID——主要是那些提交的哈希 ID,而 git log 旨在向您或其他人展示提交的内容。

因为 git log--grep 可以让你根据消息选择要显示的提交,git rev-list 也有 --grep 让您选择提交。例如,使用模式 '^#123: ' 将选择其日志消息的行以 123: 开头的提交(包括尾随空格 - 选择您的模式在这里并使用 git log 来测试它)。

git log 一样,git rev-list 会从你给它的任何开始(或结束?)点向后工作,并一直持续下去,除非你告诉它在哪里也停止搜索。你需要选择一个停止点;通常这将是一个分支名称,或标签,甚至可能是一个原始哈希 ID,以选择 Git 应该终止其向后搜索提交的提交。在这种情况下,该停止点可能是 master。这的一般语法就是您所写的:master..local(或等效地,local ^master)。因此,您想要的提交列表是由以下人员生成的:

git rev-list --grep=... master..local

(尝试运行它,或者——甚至更好——先运行 git log,然后运行 ​​git rev-list 并观察差异)。

现在,还剩下一两个问题。第一个是像 git log 和几乎大多数 Git 一样,git rev-list 向后工作,从最新的提交开始并及时返回。但是当你 cherry-pick 时,你往往必须从最早的时间点开始并向前推进。幸运的是 git log--reverse,所以 git rev-list 也有 --reverse

最后一个明显的问题是 git rev-list 可能找不到任何提交。这种情况下,可以让git cherry-pick自己投诉,也可以自己检查投诉。让 git cherry-pick 提示:

git checkout -b 123-my-feature master
git cherry-pick $(git rev-list --reverse --grep '^#123' master..local)

(我将 123-my-feature 的分支创建与其初始值的设置结合起来,指向与 master 相同的提交,所以整个事情只是两行 shell 脚本。要以更奇特的方式做到这一点,您可以先捕获 git rev-list 输出,然后只创建分支并运行 cherry-pick 如果该列表不为空。)

关于git cherry-pick 在提交消息包含字符串/匹配正则表达式的范围内提交?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46671979/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com