单个缺失提交的 git-cherry 等价物是什么?

What is the git-cherry equivalent for a single missing commit?

如何检查单个提交是否已应用于特定分支?

git-cherry的文档为例:

       $ git log --graph --oneline --decorate --boundary origin/master...topic
       * 7654321 (origin/master) upstream tip commit
       [... snip some other commits ...]
       * cccc111 cherry-pick of C
       * aaaa111 cherry-pick of A
       [... snip a lot more that has happened ...]
       | * cccc000 (topic) commit C
       | * bbbb000 commit B
       | * aaaa000 commit A
       |/
       o 1234567 branch point

       $ git cherry origin/master topic
       - cccc000... commit C
       + bbbb000... commit B
       - aaaa000... commit A

我怎么知道 cccc000- cccc111 具有相同的内容,而不必处理整棵树?这可能吗?

请注意 git-cherry 依赖于 补丁内容(差异),这是问题的关键。

git log 有一个 --cherry-mark 选项,它添加了关于对称差异的信息(a.k.a“3 点运算符”A...B

尝试 运行 :

git log --oneline --graph --boundary --cherry-mark master...topic

您应该看到唯一的提交以 + 为前缀(或 *--graph 选项打开时),并且提交出现在两侧以 = 为前缀。


如果您想知道如何匹配提交:git patch-id 计算 cherry-pick / rebase 使用的结果。

git patch-id 期望在 STDIN 上有一个补丁(由 git showgit diff 生成):

$ git show <commit-ish> | git patch-id
<hash for patch> <hash of input revision, if it can determine a revision>

例如:您可以在 A...B 中查看所有单个提交的 patch-ids :

git rev-list origin/master...forkpoint | while read sha1; do
    git show $sha1 | git patch-id
done

您可以在脚本中使用此结果,以更明确地打印提交的链接方式。