我发现自己经常出现在某种情况下,我希望看到所有变化的差异,即从分支开始引入的分支。天真的
$ 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
- 仅提交?
答案 0 :(得分:5)
在广泛查看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
的差异。
答案 1 :(得分:1)
我知道这不是你在这里寻找的答案,但它可能有助于其他人。使用像gitk这样的图形工具,您可以:
现在您可以看到右侧的所有更新文件以及左侧的所有修改后的行(每个文件)。
答案 2 :(得分:1)
我正在寻找的基本上是一种更好的运行方式
$ 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
。
答案 3 :(得分:1)
如果要根据分支位置检查当前分支,只需添加...
。所以命令看起来像
git diff master...
与git diff master...HEAD
相同。我正在运行git版本2.17.1。在旧版本中,这可能会有所不同。