查看 git master 和 live 分支之间的提交日志

see git log of commits between master and live branch

我一直在 Whosebug 和其他论坛上寻找答案,但无济于事 - 似乎没有什么能完全符合我的要求。

所以问题如下: 我有一个 master-branch 和一个 live-branch。在 master-branch 上继续开发,当提交被认为合适时,它们会被挑选到 live-branch.

但是,我发现 live-branch 有一个错误,它在 master-branch 中修复了,我正在尝试找到 master-branch 中的哪个提交引入了修复。

我试图通过首先查看 master 和 live 之间的提交区别来做到这一点。 master 中的一些提交没有生效,哪些提交?

我尝试了以下方法:

git log --cherry-pick --oneline --no-merges --right-only live-branch..master

但我真的不明白这个命令,这告诉我提交的区别,但这给了我 live 和 master 中相同的提交,只是哈希值不同。

我需要一种类似于补丁的方式来执行此操作。 git diff commit_from_master,v3.8 如果为空则忽略。

我该怎么做?

如果需要更多说明,我会更新。

(展开评论回答)

我想你可能想要 --cherry,它是 --right-only --cherry-mark --no-merges 的同义词(请参阅 git loggit rev-list 文档),或者与 [=15 相同=](如您所试)而不是 --cherry-mark。这些需要使用对称差分或三点符号,即 live-branch...master.

当使用带有三点表示法的 --left-right 时,如果它们在 "left side" 上,您将获得带有 < 注释的提交哈希,如果它们在 > 上,则带有 > 注释在 "right side" 上。请记住,两个集合的对称差异意味着 元素属于任一集合,但不属于两个集合的并集 。当应用于 Git 个分支时,我们得到:

    (left side)    (right-side)
    live-branch       master

            *         *
            |         |
            *         X'
            |         |
            :         :
            |         |
            X         *
             \       /
              \     /
               \   /
                \ /
                 *
                 |
                 :

其中每个 * 或大写字母代表一些提交。这两个分支在某个时候汇集在一起​​,因此 left...right 查看所有提交 "above" 连接,并立即排除所有低于它的提交。 (连接点也被排除在外,因为它在两个集合中,尽管 --boundary 重新包含它。)

没关系,但我们想知道哪些提交是左侧提交,当然右侧提交也是如此。然后,使用 --cherry--cherry-pick--cherry-mark,我们得到 Git 来分析左侧每个提交的 补丁等效性 和右侧。如果两个不同的提交哈希具有相同的计算 git patch-id,这意味着一个可能是从另一个中挑选出来的,它们会链接在一起。例如在上图中,X 和 X' 是 "the same",因此它们是链接的。

各种 --cherry 选项的行为是以各种方式使用这些标记。您正在寻找 master 中存在但 live-branch 中不存在的提交,因此在标记对之后,您只需要右侧 (master) 没有相应左侧 ( live-branch) 提交。使用 --cherry-mark,您会看到带有标记的它们;使用 --cherry-pick、Git 将完全删除 marked/paired。