如何将本地git分支与其远程分支进行比较?


1049

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


5
稍后再次问了这个问题。它有一个很好的答案: stackoverflow.com/questions/11935633/…–
rustybeanstalk

3
例如:git diff master origin / master(其中master是本地master分支,origin / master是远程master分支)。

@klyngbaek,这个答案特别;-)

我最初尝试的git diff HEAD origin/HEAD是指向与我想要的远程分支不同的远程分支。使用完整的分支名称按预期方式工作。
Deanna '18

Answers:


590

要更新远程跟踪分支,您需要先输入git fetch,然后输入:

git diff <masterbranch_path> <remotebranch_path>

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

示例:(git diff master origin/master其中“ master”是本地master分支,而“ origin / master”是远程即Origin和master分支。)


23
他可能需要之前(取回git fetch
Houssem巴德里

这只是显示了bash更改的潜行,是否有任何方法可以像VS代码一样在IDE中打开所有更改?
严厉的普杰

@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文件路径正确。
阿曼

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

例如git diff master origin/master,或git diff featureA origin/next

当然,到说,远程追踪分支,你需要git fetch先; 并且您需要它具有有关远程存储库中分支的最新信息。


98
更确切地说:git diff <本地分支> <远程> / <远程分支>
nalply 2011年

38
我通常会git diff <remote>/<remote branch> <local branch>查看推送对远程回购的影响。
2013年

76
git diff origin如果仅与上游分支进行比较,则更短就足够了。
Ludder 2014年

12
git fetch在开始时添加内容,这会给像我这样的新手带来麻烦
Saif 2015年

1
嘿,不是git diff <remote>/<remote branch> <local branch>吗?否则,我得到的添加和删除我的电脑(GIT版本2.7.0.windows.2)接通
马丁科尔

183

第一类

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

1
它不应该是...不是..
Eliran Malka

9
我一定会选择这个作为答案。按照您的指示,我能够查看本地分支和远程分支之间的差异。谢谢!
塔斯(Tass),

1
我通常git log origin/my_branch..会把它HEAD作为本地引用,这主要是您的意思。
鲁迪

4
以我的拙见,+ 1是最佳答案。如果您提到“获取”以同步克隆源的“远程”映像,那将是+2。统计/颜色概述步骤特别有用。
bvj 2014年

3
感谢您从七个或八个“答案”中最终得出的一个答案,得出的结果多于fatal: bad revisionfatal: ambiguous argument。我只想从另一个分支查看同一文件上的差异,问得太多了吗?是的,是的。:-) git diff remotes/origin/<base branch> <current branch> -- <filename>在git 1.8.3.1上工作出色
Steve Bonds

143

如果您在给定的分支上,并且想要将其与要跟踪的上游分支进行比较,请使用

git diff @{upstream}

如果上游没有设置(通常是这种情况,谢谢Arijoon的评论)

git diff @{push}

通过此答案,用于指定修订的git文档具有:

<branchname>@{upstream},例如master@{upstream},分支名称@{u}
的后缀 @{upstream}(简称<branchname>@{u})是指由指定的分支branchname设置为建立在(基于branch.<name>.remote和配置branch.<name>.merge)之上的分支。缺项branchname默认为当前项。


10
很好的答案,只是缺少一小部分。将行更改为git diff @ @{upstream}。多余的@HEAD,这是您现在的位置,因此您正在HEAD与分支跟踪的上游进行比较。您可以使用@{push}上游而不是上游来获取要设置为推入的分支之间的差异
Arijoon

3
最佳答案,不需要获取遥控器。需要更多的投票!
jcomeau_ictx

3
在鱼壳中,我得到了结果:fatal: ambiguous argument '@upstream': unknown revision or path not in the working tree。不得不使用git diff @\{upstream\}代替。😥
兰登库恩

您需要git fetch首先,否则它什么都不做,不显示任何输出。通过删除回购源中的文件进行测试,并在本地运行此命令。..仅在获取后有效。

同样,给出的答案包括任何本地更改。有时这是需要的,而其他时候则不是。
迪安娜

44

我对以下内容的输出了解得更好:

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

如果我按本地分支,那会告诉我要删除的内容和要添加的内容。当然是一样的,只是反过来,但对我来说更具可读性,并且我更乐意观察即将发生的事情。


我得到的结果完全相同:git diff <本地分支> <远程跟踪分支>或git diff <远程跟踪分支> <本地分支>
user2928048

32

简单的方法:

git fetch
git log -p HEAD..FETCH_HEAD

首先,将从默认的远程(来源)获取更改。克隆存储库时,将自动创建该文件。您也可以明确:git fetch origin master

然后使用git log将您当前的分支与刚刚获取的分支进行比较。(-p(generate patch)选项显示了差异。)


14

这就是我的方法。

#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将从所有遥控器获取所有内容。如果使用默认源远程,则git fetch应该足够了。
Christophe Keller

令人惊讶的是,在8年后,我们得到了完整的答案,正确地解释了步骤。我们可以执行--help来获取命令。SO是关于了解它们的。
gdbj

11

让您的工作分支是开发部门,并想区分本地开发分支机构和远程开发分支机构,这种情况下,语法应类似于git diff remotes/origin/development..development

git fetch origin git diff origin/development


11

tl; drgit diff <local branch> <remote branch>

在外壳上使用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)和4个远程(some-branchsome-other-branchmastermy-branch)。

另外,旁边的星号my-branch表示我当前在该分支中(您也可以通过使用git status将输出:的命令来知道这一事实On branch my-branch.)。

注意:git bash shell中的远程分支以红色显示,而本地分支以绿色显示。

如果您只想显示远程分支

$ 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

文件:https//git-scm.com/docs/git-branch

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

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

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

注意:您必须提供分支机构的全名,且不要带引号。

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

$ 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
[ . . . ]


9

如果您正在将当前分支与您想要的分支进行比较,这是一个简便的答案git pull

git fetch
git diff FETCH_HEAD

第一条命令将找出与您当前分支相对应的远程分支。FETCH_HEAD参考中该计算的工件。然后,第二个命令使用该引用比较当前分支的内容。


6

我知道这个问题已经有几个答案,但是尝试大多数时却遇到了一个奇怪的错误。

在我来说,我有第二个远程称为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 fetch在运行之前明确提到远程名称git diff,在我的情况下:

$ git fetch heroku
$ git diff master heroku/master

希望对其他人有帮助。


4
git difftool <commit> .

这会将您想要的提交与本地文件进行比较。不要忘了最后的点(对于本地)。

例如,将本地文件与某些提交进行比较:

git difftool 1db1ef2490733c1877ad0fb5e8536d2935566341。

(并且您不需要git fetch,除非需要与新提交进行比较)


我认为tis很有趣,因为这是我可以在提交和推送之前进行的比较。不幸的是,在Windows中,vimdiff的显示很难看。有什么办法可以使用更好的东西,例如记事本++?
Stefano Scarpanti '17

3

git diff 'master' 'testlocalBranch'

如果您使用的是Webstorm之类的编辑器,则可以右键单击文件,然后选择与分支比较,然后键入/选择分支。

在此处输入图片说明

在此处输入图片说明


2
在7.5年的历史中接受170多个投票的答案中,这算什么?
Mark Rotteveel

这是给mrblah用户或为已接受答案添加评论的类似用户的。语法与示例不同,从初学者的角度来看,示例可以提供更多帮助。
Kurkula

2
在这种情况下,应该对该答案发表评论。
rachit

1

在VS 2019中,只需执行FETCH即可不提取代码。

这就是我所做的。在.gitconfig文件中添加以下内容,以便我可以使用Beyond Compare

File location: C:\Users\[username]\.gitconfig

在下面添加

[diff]
    tool = bc
[difftool "bc"]
    path = c:/Program Files/Beyond Compare 4/bcomp.exe

打开命令提示符,然后转到工作目录。我在下面给出了将本地DEV分支与远程DEV分支进行比较的信息

git difftool dev origin/dev --dir-diff

这将打开“超越比较”并打开包含不同文件的目录。如果没有任何更改,将无法启动“超越比较”。


0

我不知道我的分支是否有任何变化...

  1. 首先,您需要更改分支(如果您已经在该分支下,则无需执行此操作!)

git checkout主

  1. 您可以看到此命令在您的master分支下修改了哪个文件

git状态

  1. 列出分支

git分支-a


  • 遥控器/原点/主
  1. 发现差异

git diff起源/主


0

设定

git config alias.udiff 'diff @{u}'

与HEAD @ {upstream}来区分HEAD

git fetch  # Do this if you want to compare with the network state of upstream; if the current local state is enough, you can skip this
git udiff

与任意远程分支进行比较

这将回答您标题中的问题(“它的遥控器”);如果要与“远程”(未配置为分支的上游)进行比较,则需要直接将其定位。您可以看到所有具有以下内容的远程分支:

git branch -r

您可以使用以下命令查看所有已配置的遥控器:

git remote show

您可以看到单个遥控器(例如来源)的分支/跟踪配置,如下所示:

git remote show origin

一旦确定了适当的原点分支,就执行常规的diff :)

git diff [MY_LOCAL] MY_REMOTE_BRANCH



0

假设您已经将自己设置origin为远程存储库。然后,

git diff <local branch> <origin>/<remote branch name>



-3

如果使用TortoiseGit(它为Git提供GUI),则可以右键单击Git repo文件夹,然后单击Git Sync

如果未选择,则可以选择要比较的分支。比您可以查看差异提交。您还可以右键单击任何提交,然后Compare with previous revision并排查看差异。乌龟git sync比较远程和本地分支

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.