我经常发现自己想看到所有变化的差异,即分支机构自分支机构开始引入的情况。天真
$ git diff ..branch
效果不好,因为还考虑了master
中的更改。我正在寻找的基本上是一种更好的运行方式
$ git diff $(git merge-base master branch)..branch
或以图形表示:
---A---B---C---D---E <== master
\
F---G---H <== branch
如何优雅地找到B
和H
之间的差异?
编辑:如下面我的回答所述,master...branch
是解决我的问题的方法。但是,鉴于引用的手册页摘要,我仍然不知道为什么会这样。
为什么diff master...branch
只显示与合并基础的差异,而man rev-parse
说,它也应该包括master
的提交?
为什么diff master..branch
显示master
和branch
当前状态之间的差异,而man rev-parse
说,它应该忽略master
-only提交?
[广泛查看git help rev-parse
并进行了试验之后,我发现了以下信息:
<rev1>..<rev2>
Include commits that are reachable from <rev2> but exclude those
that are reachable from <rev1>. When either <rev1> or <rev2> is
omitted, it defaults to HEAD.
<rev1>...<rev2>
Include commits that are reachable from either <rev1> or <rev2>
but exclude those that are reachable from both. When either <rev1>
or <rev2> is omitted, it defaults to HEAD.
以某种方式,我总是感到master..branch
是我所需要的,却忘记了master...branch
(带有三个点)。
但是通过实验表明,三点符号正是我要寻找的:
$ git diff master...branch
仅显示branch
相对于其取自master
的位置的差异。
我知道这不是您要在这里找到的答案,但这可能会对其他人有所帮助。使用gitk等图形工具,您可以:
现在,您将在右侧看到所有更新的文件,并在左侧看到所有修改的行(每个文件)。
我正在寻找的基本上是一种更好的运行方式
$ git diff $(git merge-base master branch)..branch
如何创建别名?
git config alias.diffbr '!f() { git diff $(git merge-base master $1)..$1; }; f'
然后您可以简单地执行git diffbr branch
。
如果您希望别名可用于计算机上的所有存储库,请添加--global
argument to git config
。
如果要根据分支位置检查当前分支,只需添加--global
。所以命令看起来像
git config
与...
相同。我正在运行git版本2.17.1。在较旧的版本中,此行为可能会有所不同。