【问题标题】:git cherry: How to identify equivalent commit by commit messagegit cherry:如何通过提交消息识别等效提交
【发布时间】:2018-01-05 20:56:12
【问题描述】:

在我的项目中有一个stable 分支和一个dev 分支。提交是从dev 分支到stable 分支中挑选出来的。

为了过滤 dev 上尚未合并到 stable 的所有提交,git cherry -v stable dev 看起来是一个不错的选择。但是它通过 diff 来识别等价,通常在 cherry-pick 期间解决合并冲突后会发生变化:

等价测试基于差异,去除空格后 和行号。因此,git-cherry 会检测何时提交 通过 git-cherry-pick(1)、git-am(1) 或 git-rebase(1) “复制”。

我想知道有没有类似git cherry 的命令,但通过提交消息识别等效提交?

【问题讨论】:

  • 如果您只是想清理dev 分支以避免在多次提交中重复更改,您可以使用git rebase stable。当然,那你必须清理所有的冲突。
  • 你有没有强制推送dev
  • @max630 不。 dev 分支受 gerrit 保护。
  • 提交消息不可靠。
  • @ElpieKay 是的。 Gerrit 的Change-Id 是一个更好的解决方案。不幸的是,在我们的案例中,许多旧的提交都没有用正确的Change-Id 标记,所以提交消息成为我们唯一的选择。

标签: git version-control git-cherry


【解决方案1】:

好像没有直接的办法,所以写了一个小脚本:

#!/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 存储所有经过精心挑选并从 dev 更改为 stable 的提交。

最后,diff /tmp/unmerged /tmp/cherry-picked 给出了dev 上的所有提交,其中在stable 上找不到具有相同提交消息的提交。

【讨论】:

  • 依赖提交消息是脆弱的,如果想像git cherry 那样匹配提交,使用patch-id 是正确的方法
【解决方案2】:

如果dev 中的提交没有被重新定位,那么您可以使用git cherry-pick -x,明确标记源。不会自动使用这些信息,但是通过一些 bash fu 就可以使用它。

【讨论】:

    【解决方案3】:

    您想使用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 cherrygit patch-id 在这种情况下不起作用。
    • 你为什么要问“我想知道有没有像 git cherry 一样工作的命令”?
    猜你喜欢
    • 2012-05-21
    • 1970-01-01
    • 2012-06-05
    • 2013-03-26
    • 2017-01-21
    • 2011-09-07
    • 2020-10-13
    • 2018-04-17
    • 2011-10-30
    相关资源
    最近更新 更多