如何比较本地 Git 分支和远程分支

1442

如何查看本地分支和远程分支之间的diff?


13
这个问题后来又被问到了。它有一个不错的答案: https://dev59.com/wWct5IYBdhLWcg3wpO7H - rustybeanstalk
5
示例:git diff master origin/master(其中master是本地主分支,origin/master是远程主分支)。 - Dung
@klyngbaek,特别是这个答案 ;-) - user8554766
我最初尝试使用 git diff HEAD origin/HEAD,但它似乎指向了一个与我预期不同的远程分支。使用完整的分支名称可以按预期工作。 - Deanna
24个回答

1570
git diff <local branch> <remote>/<remote branch>

例如,git diff main origin/main,或者git diff featureA origin/next

当然,要说“远程跟踪分支”,你需要先执行git fetch命令;并且你需要它具有关于远程存储库中分支的最新信息。


107
更加准确地说:git diff <本地分支> <远程>/<远程分支> - nalply
59
通常我会使用 git diff <remote>/<远程分支> <本地分支> 命令来查看我要推送的更改对远程仓库会产生哪些影响。 - Michał Tatarynowicz
113
如果你只想与上游分支进行比较,那么甚至更短的 git diff origin 就足够了。 - Ludder
24
请在开头添加 git fetch,这会给像我这样的新手带来麻烦。 - Saif
6
@Ludder,我想你的意思是 git diff @{upstream},对吗?不论我当前在哪个分支,git diff origin 总是显示 origin/master - carej
显示剩余7条评论

813
要更新远程跟踪分支,你需要首先输入git fetch,然后执行以下操作:
git diff <mainbranch_path> <remotebranch_path>

您可以使用git branch -a来列出所有分支(本地和远程),然后从列表中选择分支名称(只需从远程分支名称中删除remotes/即可)。

例如:git diff main origin/main(其中“main”是本地主分支,“origin/main”是一个远程分支,即原始分支和主分支。)


51
他可能需要在执行命令前进行获取 (git fetch)。 - Houssam Badri
2
这只是展示了bash中的一些变化,有没有办法像VS Code这样的IDE中打开所有的更改? - Harsh Phoujdar
@Harsh Phoujdar 将以下代码添加到您的 .git/.gitconfig 文件中 [diff] tool = vscode [difftool] prompt = false [difftool "vscode"] cmd = \"C:\\Program Files (x86)\\Microsoft VS Code\\Code.exe\" \"$LOCAL\" \"$REMOTE\" --diff --wait trustExitCode = false 确保您的 code.exe 文件路径正确。 - Aman
在VS Code中,有一个名为Git Lens的扩展程序,它在许多方面都非常有用。在新的GitLens选项卡>存储库中,列出了所有由提交更改的文件列表,并且可以通过单击进行并排预览。 - Traxidus Wolf

261

如果你在特定分支上,并且想要将你的工作副本与你正在跟踪的上游分支进行比较,请使用:

git diff @{upstream}

如果您想将当前的 HEAD与上游分支进行比较(感谢@Arijoon):

git diff @ @{upstream}

如果您的上游未设置,您可以使用@{push}来获取与您设置为推送到的分支的差异(也来自@Arijoon的评论):

git diff @{push}
此答案提供的,用于指定版本的Git文档有以下内容:

<branchname>@{upstream},例如master@{upstream}@{u}
将后缀@{upstream}添加到分支名(短格式:<branchname>@{u})是指该分支构建在另一个分支之上(由branch.<name>.remotebranch.<name>.merge配置)。如果未指定branchname,则默认为当前分支。


19
非常好的回答,只是缺少一小部分。将该行更改为 git diff @ @{upstream}。额外的@是指HEAD,也就是您现在所在的位置,因此您正在比较HEAD与上游分支跟踪的分支。您可以使用@{push}代替upstream来获取要推送到的分支之间的差异。 - Arijoon
9
最佳答案,不需要获取远程内容。需要更多的赞! - jcomeau_ictx
4
在 Fish Shell 中我得到了这个结果:“fatal: ambiguous argument '@upstream': unknown revision or path not in the working tree”。必须使用“git diff @{upstream}”代替。 - Landon Kuhn
致命错误:模糊的参数'@{origin}':未知的修订版本或路径不在工作树中。根据上面关于fish的评论(尽管我使用的是zsh),我将其修改为git diff @\\{origin\\}以使其部分工作。然而,即使我更改了一个提交,差异仍为空白,我知道这不应该是这样的。所以,不,这个答案根本不起作用。 - Hi-Angel
其他答案都不错,但我发现这个最容易使用git hooks进行工作,因为它不需要为分支名称添加一堆额外的步骤。特别是@{push}是我正在使用的部分。 - Arthur Weborg
显示剩余5条评论

209

第一种类型

git branch -a

获取可用分支列表。在输出中,您可能会看到类似以下内容:

* master
  remotes/main/master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
  remotes/origin/mt
  remotes/upstream/master
  remotes/upstream/mt

然后显示差异

git diff --stat --color remotes/main/master..origin/master
git diff remotes/main/master..origin/master

2
应该是 ... 而不是 .. 吧? - Eliran Malka
10
我一定会选择这个答案。按照您的指示,我能够查看本地分支和远程分支之间的差异。谢谢! - Tass
1
我通常会执行 git log origin/my_branch..,这将以本地引用的 HEAD 作为参考,这通常是你想要的。 - Rudie
5
在我看来,最佳答案加一分。如果您提到“fetch”以同步克隆源的“远程”图像,则值得再加二分。状态/颜色概述步骤特别有帮助。 - bvj
5
感谢您提供的唯一一个可行解答,在七八个“答案”中,其他都只是显示“fatal: bad revision”或“fatal: ambiguous argument”。我只想查看另一个分支上相同文件的差异,这太难了吗?是的,确实很难。 :-) 在git 1.8.3.1版本中,使用git diff remotes/origin/<base branch> <current branch> -- <filename>非常好用。 - Steve Bonds
显示剩余7条评论

48

我更好地理解了以下命令的输出:

git diff <remote-tracking branch> <local branch>

这会显示出如果我推送本地分支会被删除和添加的内容。当然,它是相同的,只是相反的,但对我来说更易读,我更舒适地查看将要发生的事情。


我使用以下命令可以得到完全相同的结果:git diff <本地分支> <远程跟踪分支> 或者 git diff <远程跟踪分支> <本地分支> - user2928048

35

简单的方法:

git fetch
git log -p HEAD..FETCH_HEAD

首先, Git 会从你默认的远程仓库(origin)获取更改。当你克隆一个仓库时,这个远程仓库会自动创建。你也可以显式地指定: git fetch origin master

然后使用 git log 命令来将你当前分支和刚刚获取的分支进行比较。(-p 选项用于显示差异)。


无法检测到您本地的新提交。 - Matthieu Brucher

26

简述:: git diff <本地分支> <远程分支>

在使用Git时,我喜欢先浏览一下环境。

以下是一个命令来显示所有分支

$ git branch -a  # (or git branch --all)
* my-branch
  master
  remotes/origin/some-branch
  remotes/origin/HEAD -> origin/master
  remotes/origin/my-branch
  remotes/origin/some-other-branch
  remotes/origin/master

这里有两个本地分支(my-branchmaster),以及四个远程分支(some-branchsome-other-branchmastermy-branch)。

此外,星号表示我当前在my-branch分支上(您也可以通过使用命令git status来了解这一点,它会输出:On branch my-branch。

注意:在Git Bash中,远程分支以红色显示,而本地分支以绿色显示。

如果只想显示远程分支

$ git branch -r # (or git branch --remotes)
  origin/some-branch
  origin/HEAD -> origin/master
  origin/my-branch
  origin/some-other-branch
  origin/master

为了仅显示本地分支,您可能会尝试使用git branch -l命令,但那是一个完全不同的命令。显示本地分支,请使用没有选项的git branch命令。

$ git branch
* my-branch
  master

为了完成对基本分支选项的审查,这里有一个--list,与您可能期望的相反,它是允许过滤的选项。将其与此类模式一起使用:

$ git branch --list 'my*'
* my-branch
你还可以将 --list 与选项 -a-r 结合使用,但一定要相应地调整模式(记住:远程分支以 "remotes" 开头)。

例如:

# This will show all branches (local & remote) that start with my
$ git branch --list 'my*' -a
* my-branch

# Better: the pattern includes the remote
$ git branch --list '*my*' -a
* my-branch
  remotes/origin/my-branch

文档: git-branch

现在您可以比较所有可用分支中的任意两个分支(也可以比较两个本地分支或两个远程分支)。

这里我正在比较本地分支和远程的my-branch。它们已同步,所以我没有得到任何输出:

$ git diff my-branch remotes/origin/my-branch

注意:您必须提供分支的完整名称,不要使用引号。

我还可以将本地 my-branch 与远程 master 进行比较。这里我会得到一些输出,因为远程的 my-branch 尚未合并到主分支中。

$ git diff my-branch remotes/origin/master
diff --git a/src/controllers/call.controller.js b/src/controllers/call.controller.js
index fd79b98..df3d798 100644
--- a/src/controllers/call.controller.js
+++ b/src/controllers/call.controller.js
@@ -261,7 +261,7 @@ function callController() {
   /*
    *  Function: doCall
[ . . . ]

19

这是我做事的方式。

# To update your local.
git fetch --all

这将从远程获取所有内容,因此当您检查差异时,它将与远程分支进行比较。

# To list all branches
git branch -a

上述命令将显示所有分支。

# To go to the branch you want to check difference
git checkout <branch_name>
# To check on which branch you are in, use
git branch
    (or)
git status
现在,您可以按照以下方式检查差异。
git diff origin/<branch_name>

这将比较您的本地分支与远程分支。


2
git fetch --all 会从所有远程仓库获取所有内容。如果您使用默认的 origin 远程仓库,则 git fetch 应该足够了。 - Christophe Keller
令人惊奇的是,经过8年后,我们得到了一个完整的答案,它清楚地解释了步骤。我们可以执行 "--help" 命令来获取命令。SO 是关于理解它们的。 - gdbj

17

如果您要比较当前分支和您想要git pull的某个内容,这里是一个简短的答案。

git fetch
git diff FETCH_HEAD
第一个命令将确定与您当前分支对应的远程分支。这个计算的产物是FETCH_HEAD参考。然后第二个命令使用该参考值来比较与您当前分支的情况。

太好了,FETCH_HEAD 正是我所缺少的。只有一个小细节:如果你想以最后一个本地提交作为基线,并查看在远程仓库中发生了什么变化,请运行 git diff HEAD FETCH_HEAD - bgusach

13

让你的工作分支为development,并且你想区分本地开发分支和远程开发分支。在这种情况下,语法应该是这样的:

git diff remotes/origin/development..development

或者

git fetch origin
git diff origin/development

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