当前分支和主分支之间的Git差异,但不包括未合并的主提交

f3temu5u  于 2023-09-29  发布在  Git
关注(0)|答案(5)|浏览(124)

我想在一个分支的所有变化,是不是合并到主还不同。
我试过:

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

然而,在每一种情况下,diff都包含master中尚未合并到我的分支中的内容。
有没有一种方法可以在我的分支和master之间做一个diff,排除master中尚未合并到我的分支中的更改?

but5z9lq

but5z9lq1#

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

合并基准是branchmaster的分叉点。
Git diff支持特殊语法

git diff master...branch

从Git 2.30.0开始,特殊语法甚至有一个特殊开关作为简写:

git diff --merge-base master branch

你不能交换两边,因为那样你会得到另一根分支。你想知道自从branchmaster分叉以来,branch发生了什么变化,而不是相反。
您可能希望将此语法中的branch替换为HEAD,甚至完全删除它-以下所有内容都显示当前分支的内容,因为它与master分支不同:

git diff master...HEAD
git diff master...
git diff --merge-base 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]中的“指定修订”部分。然而,“diff”是关于比较两个端点,而不是范围,并且范围符号(“<commit>..<commit>”和“<commit>...<commit>”)并不意味着gitrevisions[7]中“指定范围”部分定义的范围。

3okqufwl

3okqufwl2#

以下是对我有效的方法:

git diff origin/master...

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

mhd8tkvw

mhd8tkvw3#

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

git diff master...

这将使用master的本地副本。
要比较特定文件用途:

git diff master... filepath

输出示例:

e0bqpujr

e0bqpujr4#

根据**Documentation**

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

git diff中-两个点..和三个点...在我们的仓库中比较分支或拉取请求的方式上有很大的不同。我会给予你一个简单的例子来说明它。

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

G---H---I feature (Branch)
 /
A---B---C---D master (Branch)

*两个点-如果我们想显示所有变化之间的差异在当前时间发生在双方,我们将使用git diff origin/master..feature或只是git diff origin/master

输出:H, IA, B, C, D

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

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

20jt8wwn5#

将git diff between branches/commitIDs放到一个patch file(只有在没有删除或创建文件的情况下才可以),然后在新分支中应用它。

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

其中abcde 123是主设备中的提交ID,其中尚未出现不需要的更改。
基本上,你不需要大师。你可以将当前提交与当前分支中的任何提交进行比较,例如:开始更改之前的最后一次提交。

git diff a4488d20406a1f26888d80eb7d57aa3b0054e307
or
git diff 553e4c7dcdcf366917d36ad8f28a273c88d92a1b..a4488d20406a1f26888d80eb7d57aa3b0054e307

相关问题