`git diff --no-merge work ^ ^ master ^ notinmaster`仍然显示来自notinmaster的更改

时间:2017-06-27 10:57:54

标签: git

我有时会有一个work分支,它是master和一个或多个尚未合并到master的功能分支的合并。我可以获得仅在我的work分支中而不是在主分区和“notinmaster”特征分支中的更改日志,例如。

        -B--               <-- notinmaster
       /    \
      /   w--*--d          <-- work
     /   /  /    ·
...-*---*--C------D-...    <-- master

执行git log --no-merges work ^master ^notinmaster,此处会显示提交wd

但是,D实际上是git cherry-pick d。如果我没有将notinmaster合并到work,我可以看到git diff master只有来自w的细微更改才会真正发生变化。但是,由于notinmaster合并到workgit diff master太乱了,无法使用。并且似乎我不能使用--not / ^语法来排除notinmaster(例如git diff --stat --no-merges work ^master ^notinmaster提供与git diff --stat --no-merges work ^master相同的输出,至少在git 2.11.0)。

有没有一种简单的方法来获得这种差异,而不首先恢复所有notinmaster提交?

1 个答案:

答案 0 :(得分:1)

否定提交语法不会以diff的方式工作。

使用log,您可以为要遍历的提交图表制定规则,因此说出“#34;图表中此点无法访问”是完全合理的#34 ;;但是使用diff,您只需识别两个TREE(通常通过识别两个提交)并进行比较。没有图表遍历是有限的,没有办法说&#34;我想要改变,如果它们仅由这条路径引入&#34;。 TREE中的路径是相同的,或者它不相同,并且所有diff都看到了。

所以问题是你愿意做出什么样的假设。在此示例中,git show W应该提供您想要的补丁。如果W可能真的 n 提交,但您知道没有任何干预,那么您可以git diff W1^ Wn。您可以执行交互式rebase,只选择w提交到新的ref,并从中生成一个补丁。 (您已经表明,如果需要更低级别的脚本命令,可以使用log - 或rev-list来查找w提交。

当然,所有这些都假设您的图表中的d^是纯合并,并且没有其他任何地方可以隐藏有意义的更改。如果是我,我想考虑如何简化我的工作流程,而不是必须对变化可能会或可能不会发生变化进行过多的推理。