如何比较本地 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个回答

11

如果您希望仅通过文件名的更改来查看差异,则可以使用以下命令:

git diff --name-status <remote-branch> <local-branch>

否则,这将显示两个分支之间的所有差异:

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

需要进行Git fetch操作吗?为什么?请在 编辑你的答案 中回答,不要在评论区回答(不要包含"Edit:"、"Update:"或类似内容——回答应当看上去像是今天写的)。 - Peter Mortensen

9
在我的情况下,我有第二个名为heroku的远程主机,它不是origin,由于它没有同步,当我尝试运行git diff master heroku/master时,就会出现以下错误:

fatal: ambiguous argument 'heroku/master': unknown revision or path not in the working tree.

当尝试另一种方法git diff master..heroku/master时,则会出现以下错误:

fatal: bad revision 'master..heroku/master'

解决办法是在运行git diff之前,在git fetch中明确提到远程名称。在我的情况下,命令如下:
$ git fetch heroku
$ git diff master heroku/master

5
git difftool <commit> .

这将比较您想要的提交与您的本地文件。不要忘记在末尾加上“点”(表示本地文件)。

例如,要将您的本地文件与某个提交进行比较:

git difftool 1db1ef2490733c1877ad0fb5e8536d2935566341 .

(除非需要与新提交进行比较,否则不需要 git fetch)


我认为这很有趣,因为在提交和推送之前可以进行比较。不幸的是,在Windows中,vimdiff的显示效果很丑陋;有没有更好的方式,比如使用notepad++? - Stefano Scarpanti

4

尝试:

git diff origin HEAD

假设您希望将当前的“本地”分支的HEAD与原始版本进行差异比较。并假设您在本地分支上。:)

我5分钟前尝试过这个,它仍然在滚动中,已经决定我的项目中每个文件都不同。 - Healyhatman
我尝试了,但它没有起作用。 - QMaster

4

首先需要做的是在本地分支上运行:

git fetch

如果您在控制台结果中看到更改,例如:

'diff --git a/versions.txt b/versions.txt
 index 82d6379..794e6c7 100644
 --- a/versions.txt
 +++ b/versions.txt
 @@ -9,3 +9,4 @@ version8
 version 9 let it fetch yes
 let see changes ok ?
 another line
 +second line^M'

如果你看到了这个标签 <p>,那就意味着远程仓库中有一些变更还没有同步到本地仓库。你可以使用以下命令检查远程仓库是否领先于本地仓库:

git log origin/master

git log remoteRepo/localRepo

现在运行以下命令:
git diff master origin/master

git diff localRepo remoteRepo/localRepo 这样你就可以看到它们之间的差异了。

请注意,首先运行 git log origin/master 命令并不能显示是否有变更,你必须先进行获取操作。

然后你可以使用以下命令将这些变更拉取到本地仓库中:

git pull origin master

git pull remoteRepo localRepo


2

我想知道我的主分支(master)有没有任何更改...

  1. Firstly, you need to change your branch (If you are already under this branch, you do not need to do this!):

    git checkout master
    
  2. You can see which file has been modified under your master branch by this command:

    git status
    
  3. List the branches

    git branch -a
    
    • master
      remotes/origin/master
  4. Find the differences

    git diff origin/master
    

1
例子
git diff 'master' 'testlocalBranch'

如果您正在使用像WebStorm这样的编辑器,您可以右键单击文件,选择与分支进行比较,并键入/选择您的分支。

Enter image description here

Enter image description here


2
这个有什么优势,相比于7.5年前被接受的回答,它获得了170多个赞? - Mark Rotteveel
这是针对mrblah用户或类似添加评论的用户的。语法与示例不同,从初学者的角度来看,示例更有帮助。 - Kurkula
2
在这种情况下,应该在那个答案的评论中提到。 - rachit

1
我一直看到这个错误。
git diff main origin/master
fatal: ambiguous argument 'main': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

解决方案:我必须先进行 git push (因为远程和本地都需要更新),然后这个方法才有效:
git diff master origin/master

1
但是如果本地和远程都是最新的,没有增量差异?这不是有悖于差异的意义吗? - Owl
@Owl 我认为你是对的。当时我不知道自己在做什么,但是看着我运行出错的代码,我怀疑可能是我尝试在一个旧的 repo 上使用了 main,而这个 repo 没有一个叫做 main 的分支(只有 master)。但这只是我的猜测。老实说,我会忽略我在这里的回答。我会考虑删除它,因为我觉得它并没有真正帮助到你。 - stevec
我完全不怪你,很明显你在第一条命令中的意思,不知道为什么 Git 没有理解。 - Owl

1
一个方便的单行命令,用于将当前分支与其远程状态进行比较(即如何回答“我推送时会发生什么变化?”的问题)如下所示:

git diff origin/$(git rev-parse --abbrev-ref HEAD)


0
这很简单。您可以使用:git diff remote/my_topic_branch my_topic_branch 其中my_topic_branch是您的主题分支。

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