如何在从主分支创建分支后,使用git diff查看所有更改?

20

我在我的分支上进行了多次提交,现在我想查看从我分支出发时的更改情况。但不是当前master分支,因为自从我最初分支出去后已经将其他分支合并到了当前master分支中。

类似于 显示从master的原始分支点以来git分支中的所有提交,但那个问题是关于日志的。

我尝试过

git diff  --boundary master..

但是我仍然看到比我的变化要多得多。

编辑:我真的希望有一种不需要任何 SHA 知识或提交次数计算的方法。如果我不需要它们,我可以更轻松、自动化地教授和别名它们,而且没有麻烦。

git diff my_branch_name...master

看起来接近但不正确。


3
针对您的编辑,您应该从合并基础到您的分支尖端进行区别,这是master...my_branch_name,而不是my_branch_name...master - torek
你懂的 @torek,请发布那个答案。 - Michael Durrant
3个回答

35

正如Jonathan Brink已经指出的,您似乎希望将存储在合并基础提交下的版本与您自己分支的最新版本进行比较。

通常情况下使用git merge-base --fork-point是过度的(在早期版本的git之前的git 1.9之前不可用)。它处理其他分支本身已被rebase的情况,因此如果没有发生这种情况,您可以坚持来自gitrevisions的更简单的三点符号法则:

git diff master...my_branch_name

正如您在评论中指出的那样,它也可以使用HEAD或者简单地在结尾处使用空字符串来编写:

git diff master...

当您使用三个点时,git diff会找到左右两侧提交的SHA-1(从名称获取或默认为HEAD),并查找它们之间的合并基础,然后将其替换为左侧SHA-1。右侧SHA-1(从名称解析)保持不变。

请注意,这与双点语法不同,并且git diff控制两种语法(是syntaxes),因此两者都没有其更常见的git revisions含义。


1如果存在多个合并基础,则只选择其中一个。如果使用默认的“递归”策略,则实际的git merge会将两个“最佳”合并基础合并以获得“虚拟合并基础”,然后将其用于合并到当前的HEAD提交。但这种情况非常罕见。


这会显示my_branch_name上未提交的更改吗? - alper
1
@alper:未提交的更改不在Git中。因此,让Git比较两个已经在Git中的提交是无法显示它们的。您可以让Git比较一个已经在Git中的提交和一些其他不在Git中的文件集;这将显示提交文件和未提交、不在Git中的文件之间的任何差异。 - torek
1
我会重复一遍这个,因为这对于使用Git是非常关键的:未提交的文件不在Git中,因此它们也不在任何分支上。 - torek

9
使用 merge-base 命令确定分支创建的 sha,然后将其传递给 diff 命令。
git diff `git merge-base --fork-point master`

--fork-point
查找分支(或导致的任何历史记录)从另一个分支(或任何引用)分岔的点。这不仅寻找两个提交的共同祖先,还考虑了的reflog,以查看导致分岔的分支的早期版本(有关此模式的讨论,请参见下文)。
git config --global alias.sincemaster '!git diff `git merge-base --fork-point master`'

1
这没有产生任何输出。 - Michael Durrant
1
你确定本地主题分支的尖端可以被主分支到达吗?(没有变基) - Jonathan.Brink

1
如果您知道两个项目分歧的提交的sha值,您可以简单地运行以下命令:git diff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接