我有时会有一个work
分支,它是master和一个或多个尚未合并到master的功能分支的合并。我可以获得仅在我的work
分支中而不是在主分区和“notinmaster”特征分支中的更改日志,例如。
-B-- <-- notinmaster
/ \
/ w--*--d <-- work
/ / / ·
...-*---*--C------D-... <-- master
执行git log --no-merges work ^master ^notinmaster
,此处会显示提交w
和d
。
但是,D
实际上是git cherry-pick d
。如果我没有将notinmaster
合并到work
,我可以看到git diff master
只有来自w
的细微更改才会真正发生变化。但是,由于notinmaster
合并到work
,git diff master
太乱了,无法使用。并且似乎我不能使用--not
/ ^
语法来排除notinmaster
(例如git diff --stat --no-merges work ^master ^notinmaster
提供与git diff --stat --no-merges work ^master
相同的输出,至少在git 2.11.0)。
有没有一种简单的方法来获得这种差异,而不首先恢复所有notinmaster
提交?
答案 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^
是纯合并,并且没有其他任何地方可以隐藏有意义的更改。如果是我,我想考虑如何简化我的工作流程,而不是必须对变化可能会或可能不会发生变化进行过多的推理。