【问题标题】:Git diff between current branch and master but not including unmerged master commits当前分支和主分支之间的 Git 差异,但不包括未合并的主提交
【发布时间】:2014-01-15 12:42:37
【问题描述】:

我想要一个尚未合并到 master 的分支中所有更改的差异。

我试过了:

git diff master
git diff branch..master
git diff branch...master

但是,在每种情况下,差异都包含 master 中尚未合并到我的分支中的内容。

有没有办法在我的分支和 master 之间进行差异,排除 master 中尚未合并到我的分支中的更改?

【问题讨论】:

  • 如果你翻阅第二个版本,你会得到你想要的:git diff master..branch。如果您在分支上,可以将其缩短为 git diff master..r1..r2 语法是 ^r1 r2 的缩写,意思是“向我展示所有来自 r2 并且无法从 r1 访问的东西”。 git help gitrevisions 提供有关您可以使用的各种语法的信息。
  • 在阅读了有关git diff... 语法的更多信息后,我扩展了我的答案。 @jszakmeister,您的评论是错误的,因为gitrevisions 中描述的修订范围与git diff 无关。 Diff 比较历史上的两个点,不能使用范围。
  • 你是对的。我总是忘记git diff 与其他命令的工作方式不同......我觉得令人沮丧的事实。 :-(
  • 确保在比较之前更新 master 的本地副本

标签: git version-control merge diff git-diff


【解决方案1】:

根据Documentation

git diff 显示工作树和索引之间的变化或 树,索引和树之间的变化,两棵树之间的变化, 合并导致的更改、两个 blob 对象之间的更改,或 磁盘上两个文件之间的变化。

git diff - 两个点.. 和三个点... 在我们比较存储库中的分支或拉取请求的方式上存在显着差异。我会给你一个简单的例子,它很容易演示。

示例:假设我们正在从 master 签出新分支并推送一些代码。

  G---H---I feature (Branch)
 /
A---B---C---D master (Branch)
  • 两个点 - 如果我们想显示双方当前时间发生的所有变化之间的差异,我们将使用git diff origin/master..feature 或仅使用git diff origin/master
    ,输出:H, I反对 A, B, C, D

  • 三个点 - 如果我们想显示最后一个共同祖先 (A) 之间的差异,也就是我们开始新分支的检查点,我们使用 git diff origin/master...feature,输出:H, I反对 A)。

  • 在大多数情况下,我宁愿使用 3 个点。

【讨论】:

    【解决方案2】:
    git diff `git merge-base master branch`..branch
    

    Merge basebranchmaster 的分歧点。

    Git diff 为此支持特殊语法:

    git diff master...branch
    

    你不能交换边,因为那样你会得到另一个分支。您想知道branch 发生了什么变化,因为它与master 不同,而不是相反。

    松散相关:


    请注意,..... 语法与其他 Git 工具中的语义不同。与man gitrevisions中指定的含义不同。

    引用man git-diff:

    • git diff [--options] <commit> <commit> [--] [<path>…]

      这是查看任意两个<commit>之间的变化。

    • git diff [--options] <commit>..<commit> [--] [<path>…]

      这与以前的形式同义。如果省略一侧的<commit>,则与使用HEAD 的效果相同。

    • git diff [--options] <commit>...<commit> [--] [<path>…]

      此表单用于查看包含直到第二个<commit> 的分支上的更改,从<commit> 的共同祖先开始。 “git diff A...B”等价于“git diff $(git-merge-base A B) B”。可以省略<commit> 中的任何一个,其效果与使用HEAD 相同。

    以防万一您正在做一些奇特的事情,应该注意,上述描述中的所有<commit>,除了最后两种使用“..”符号的形式之外,都可以是任何<tree>

    如需更完整的<commit> 拼写方法列表,请参阅gitrevisions[7] 中的“指定修订”部分。但是,“差异”是关于比较两个端点,而不是范围,范围符号(“<commit>..<commit>”和“<commit>...<commit>”)并不表示gitrevisions[7] 中“指定范围”部分中定义的范围。

    【讨论】:

    • 对我来说$ git diff master...branch 产生了fatal: ambiguous argument 'master...branch': unknown revision or path not in the working tree.- 这是一个版本相关的命令吗?
    • 其实我才意识到“branch”一定是你的分支的名字,我还以为是对当前分支的引用
    • 你说得对,我的答案依赖于名为branch 的分支。我选择坚持使用 OP 在问题中选择的名称。如果要使用当前分支,请将branch 替换为HEAD
    • 请注意,您可以使用git diff master... 来避免指定分支(将采用当前分支)。
    • 签出devel、@ChrisGuest 后,原始命令是否有效?可能,Git 在结帐时为您创建了分支,作为远程​​分支的本地副本(通常是 origin/devel)。如果是这样的话,git diff origin/devel...bugfix/API-353-api-allows-database-access-when 甚至可以在结帐之前工作。
    【解决方案3】:

    正如 John Szakmeister 和 VasiliNovikov 所指出的,从 master 的角度获取分支的完整差异的最短命令是:

    git diff master...
    

    这使用您的本地主副本。

    要比较特定文件,请使用:

    git diff master... filepath
    

    输出示例:

    【讨论】:

      【解决方案4】:

      这对我有用:

      git diff origin/master...
      

      这仅显示我当前选择的本地分支和远程主分支之间的更改,并忽略我本地分支中来自合并提交的所有更改。

      【讨论】:

      • 作为参考,如果您需要包含这些更改的提交的提交引用,请使用git cherry origin/master
      • 如果这显示了一堆你没想到的垃圾,master 可能已经从你下面重新设置了一组提交。
      猜你喜欢
      • 2011-11-21
      • 1970-01-01
      • 1970-01-01
      • 2015-12-22
      • 2013-12-24
      • 1970-01-01
      • 2021-03-22
      • 2019-07-15
      • 1970-01-01
      相关资源
      最近更新 更多