Git区分当前分支和主分支,但不包括未合并的主提交

我想在尚未合并到主分支的所有更改的差异。

我试着:

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

但是,在每一种情况下,差异在master中包含的内容还没有合并到我的分支中。

是否有一种方法可以在我的分支和master之间做一个区别,排除master中还没有合并到我的分支中的更改?

346358 次浏览
git diff `git merge-base master branch`..branch

合并基础branchmaster分离的点。

Git diff支持一种特殊的语法:

git diff master...branch

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

你可能想要用HEAD替换这个语法中的branch,甚至完全删除它——以下两种方法都显示当前分支的内容,因为它与master分离了:

git diff master...HEAD
git diff master...

松散相关:


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

引用man git-diff:

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

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

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

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

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

    此表单用于查看包含和直到第二个<commit>的分支上的更改,从两个<commit>的共同祖先开始。“git diff A...B"相当于“__abc3”。你可以省略<commit>中的任何一个,这与使用HEAD具有相同的效果。

以防你正在做一些奇异的事情,应该注意的是,上面描述中的所有<commit>,除了最后两种使用".."符号,可以是任意<tree>

有关<commit>更完整的拼写方法列表,请参见&;gitrevisions[7]中的section。然而,“diff"是关于比较两个端点,而不是范围,范围符号("<commit>..<commit>"和“<commit>...<commit>"”)并不意味着“指定范围”中定义的范围;gitrevisions[7]中的section。

以下是对我有效的方法:

git diff origin/master...

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

正如John Szakmeister和VasiliNovikov所指出的,从master的角度获得你的分支的全部差异的最短命令是:

git diff master...

这将使用本地的master副本。

要比较特定文件的使用情况:

git diff master... filepath

输出的例子:

Example usage .

根据文档

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

.磁盘上两个文件之间的变化

git diff - 两点__ABC1和三点...在库中比较分支或拉取请求的方式上有显著差异。我给你们举个简单的例子。

让我们假设我们正在从master中签出新的分支并将一些代码推入。

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

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

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

将分支/commitIDs之间的git差异置为一个补丁文件(只有在没有删除或创建文件的情况下才可以),然后在新的分支中应用它。

git checkout -b new-branch-name
git diff abcde123..branch-name > branch-name.patch
git apply branch-name.patch
rm branch-name.patch
git add .
git commit -m '#123 commit msg’
git push

其中abcde123是master中的提交ID,其中还没有不必要的更改。

基本上,你不需要master。 你可以将当前提交与当前分支中的任何提交进行比较,例如,在你开始更改之前的最后一次提交
git diff a4488d20406a1f26888d80eb7d57aa3b0054e307
or
git diff 553e4c7dcdcf366917d36ad8f28a273c88d92a1b..a4488d20406a1f26888d80eb7d57aa3b0054e307