git cherry:如何通过提交信息标识等价提交

3
在我的项目中,有一个“stable”分支和一个“dev”分支。从“dev”分支到“stable”分支会挑选一些提交记录。
为了筛选出在“dev”分支上未合并到“stable”分支上的所有提交记录,适用于“git cherry -v stable dev”的命令似乎是一个不错的选择。然而,它使用差异检查来确定等价性,在cherry-pick期间解决合并冲突后通常会发生更改:
引用: “等价性测试基于差异,去除空格和行号。因此,git-cherry可以检测到提交记录通过git-cherry-pick(1)、git-am(1)或git-rebase(1)进行"复制"。”
我想知道是否有任何类似于git cherry的命令,但是通过提交消息来确定等价提交记录?

如果你只是想清理dev分支,以避免在多个提交中重复更改,你可以执行git rebase stable。当然,这样做之后你必须清理所有的冲突。 - Code-Apprentice
你有没有强制推送dev分支? - max630
@max630 不行。dev 分支受 Gerrit 保护。 - lz96
2
提交信息不可靠。 - ElpieKay
@ElpieKay 是的。Gerrit的Change-Id是一个更好的解决方案。不幸的是,在我们的情况下,许多旧的提交没有正确标记Change-Id,所以提交消息成为我们唯一的选择。 - lz96
3个回答

2

看起来没有直接的方法来做到这一点,所以我写了一个简短的脚本:

#!/bin/bash
git cherry -v stable dev | grep + | cut -d ' ' -f 3- > /tmp/unmerged
xargs -a /tmp/unmerged  -I{} git --no-pager log stable --pretty=oneline --grep {} | cut -d ' ' -f 2- > /tmp/cherry-picked
diff /tmp/unmerged /tmp/cherry-picked

解释:

git cherry -v stable dev | grep + | cut -d ' ' -f 3- > /tmp/unmerged输出只存在于dev分支上的提交信息。这些提交包括那些已经被提取并更改到stable分支的提交,我们需要在下一步中过滤掉这些提交。

xargs -a /tmp/unmerged -I{} git --no-pager log stable --pretty=oneline --grep {} | cut -d ' ' -f 2- > /tmp/cherry-picked输出(1)中与stable相同信息的所有提交。换句话说,/tmp/cherry-picked存储了所有从devstable进行提取并更改的提交。

最后,diff /tmp/unmerged /tmp/cherry-picked返回在dev分支上找不到具有相同提交信息的提交。


依赖提交信息是脆弱的,如果想要像git cherry一样匹配提交,使用patch-id才是正确的方法。 - Jakub Bochenski

1
如果在dev中的提交没有被rebase,那么你可以使用git cherry-pick -x,明确标记源。虽然没有自动使用这些信息的方式,但是通过一些bash技巧可以实现使用。

0

您想使用 patch-id。这是由 git cherry 使用的机制。

要查找提交 3642151 的等效项,请运行:

git show 3642151 | git patch-id

您应该得到一行具有两个哈希值的行;第一个是 patchid(称其为 PATCHID_FROM_ABOVE

git log -p | git patch-id | grep PATCHID_FROM_ABOVE

这将为您提供与该 patchid 相对应的所有提交的列表。

摘自:http://git.661346.n2.nabble.com/git-cherry-to-find-equivalent-commit-IDs-td3440883.html


在“cherry-pick”期间解决冲突后,提交的差异可能会发生变化,这就是为什么在这种情况下“git cherry”或“git patch-id”无法工作的原因。 - lz96
你为什么问“有没有像git cherry这样的命令?” - Jakub Bochenski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接