diff分支相对于共同祖先的git变化

时间:2018-02-01 10:25:42

标签: git command-line-interface diff

我发现自己经常出现在某种情况下,我希望看到所有变化的差异,即从分支开始引入的分支。天真的

$ git diff ..branch

效果不佳,因为master中的更改也会被考虑在内。我正在寻找的基本上是一种更好的运行方式

$ git diff $(git merge-base master branch)..branch

或以图形表示:

---A---B---C---D---E  <== master
        \
         F---G---H    <== branch

如何优雅地找到BH之间的差异?

修改:如下面的答案中所述,master...branch是我的问题的解决方案。但是,我仍然不知道,为什么会这样,给出引用的手册页片段。

为什么diff master...branch仅显示与合并基础的差异,而man rev-parse说,它也应该包含master的提交?

为什么diff master..branch显示当前状态masterbranch之间的差异,而man rev-parse说,它应该忽略master - 仅提交?

4 个答案:

答案 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这样的图形工具,您可以:

  • 打开gitk
  • 点击H,右键单击并选择&#34;标记此提交&#34;
  • 点击B,右键单击并选择&#34; Diff this - &gt;标记提交&#34;

现在您可以看到右侧的所有更新文件以及左侧的所有修改后的行(每个文件)。

答案 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。在旧版本中,这可能会有所不同。