2017-06-13 104 views
1

我一直在淘金的stackoverflow和其他论坛找到答案无济于事 - 似乎没有什么适合我正在寻找什么。看到主人和现场分支之间的提交git日志

所以,问题如下: 我有一个主分支现场分支。发展仍在主分支,并且当提交被认为是适当的时,它们被挑选到直播分支

然而,我发现,活分支有一个错误,这是固定在主分支,我试图寻找引进修复主分支其呈交。

我想通过首先看到master和live之间的提交差异来做到这一点。主人的一些承诺没有实现,哪些?

我试过如下:

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

,但我真的不明白这个命令,这告诉我犯的区别,但是这给了我这是在现场和掌握相同的提交,只是哈希是不同的。

我需要一种类似补丁的方式来做到这一点。 git diff commit_from_master,v3.8如果为空忽略。

我该怎么做?

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

+0

考虑使用'git bisect' –

+0

这将花费太长时间,这是一个耗时数小时编译的大项目,需要提交diff ... – janjust

+2

'--right-only'需要使用三点符号, '活分支...主'或'主...活分支'。 '--cherry-pick'和'--cherry-mark'也是一样。但是,如果有特定的提交修复了特定的错误,@TimBiegeleisen是正确的,'git bisect'是找到它的方法。 – torek

回答

3

(扩大评论回答)

我想你可能要--cherry,这是--right-only --cherry-mark --no-merges的同义词(见git loggit rev-list文档),或--cherry-pick相同的(你尝试过),而不是--cherry-mark。这些要求使用对称差或三点符号,即,live-branch...master

当使用带有三点符号的--left-right时,如果它们位于“左侧”,则提交散列注释为<;如果位于“右侧”,则提交>。这里请记住,两个集合的对称差异意味着元素是任一集合的成员,但不是两个集合的集合。当应用到的Git分支,我们得到这样的:

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

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

每个*或大写字母代表的一些承诺。这两个分支在某一时刻聚集在一起,因此left...right会查看联接“上方”的所有提交,并立即排除所有位于其之下的提交。 (连接点也被排除在外,因为它是在这两套,但--boundary再包括它。)

这很好,但我们想知道其提交的左侧提交,当然同为右侧提交。然后,使用--cherry--cherry-pick--cherry-mark,我们得到Git分析左侧和右侧每个提交的补丁等价物。如果两个不同的提交哈希具有相同的计算git patch-id,这意味着一个可能从另一个挑选出来,它们被链接在一起。例如,在上图中,X和X'是“相同的”,因此它们被链接。

各种--cherry选项的行为是以各种方式使用这些标记。您正在查找master中存在的提交,但不存在于live-branch中,因此在标记成对之后,您只需要右侧(master)提交,该提交没有对应的左侧提交(live-branch)。使用--cherry-mark,你可以用标记看到它们;与--cherry-pick,Git将完全放弃标记/配对的。