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

mrb*_*lah 959 git

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

Jak*_*ski 1280

git diff <local branch> <remote>/<remote branch>
Run Code Online (Sandbox Code Playgroud)

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

当然,对已经表示远程追踪分支,你需要git fetch先; 并且您需要它以获得有关远程存储库中分支的最新信息.

  • 更确切地说:git diff <local branch> <remote>/<remote branch> (97认同)
  • 为了让这个工作,我必须首先"git fetch". (93认同)
  • 如果只是与上游分支进行比较,那么更短的`git diff origin`就足够了. (71认同)
  • 我经常做`git diff <remote>/<remote branch> <local branch>`来查看我的推送对远程仓库的影响. (36认同)
  • 请在开头添加`git fetch`,这对我这样的新手造成麻烦 (12认同)
  • @Ludder,我想你的意思是“git diff @{upstream}”?无论我签出了哪个分支,“git diff origin”总是向我显示“origin/master”。 (7认同)
  • 咦,不应该是`git diff &lt;remote&gt;/&lt;remote branch&gt; &lt;local branch&gt;`吗?否则,我会在我的计算机上打开添加和删除功能(git 版本 2.7.0.windows.2) (3认同)
  • 顺序很重要。例如,`git diff master origin/master`将显示远程文件中存在什么差异(与本地_commited_文件相比),而`git diff master origin/master master`将显示文件与本地文件中存在什么差异存储库(即已提交)与远程文件相比。并且 `git diff origin` 与 `git diff origin/master master` 相同 **++** 未提交的更改。 (2认同)

med*_*iev 524

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

git diff <masterbranch_path> <remotebranch_path>
Run Code Online (Sandbox Code Playgroud)

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

示例:( git diff master origin/master其中"master"是本地主分支,"origin/master"是远程,即origin和master分支.)

  • 他之前可能需要一个fetch(`git fetch`) (17认同)
  • 这只是展示了 bash 中的更改,有什么方法可以在像 VS code 这样的 IDE 中打开所有更改吗? (2认同)

YSN*_*YSN 177

第一种

git branch -a
Run Code Online (Sandbox Code Playgroud)

获取可用分支列表.在输出上你可能会看到类似的东西

* master
  remotes/main/master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
  remotes/origin/mt
  remotes/upstream/master
  remotes/upstream/mt
Run Code Online (Sandbox Code Playgroud)

然后显示差异

git diff --stat --color remotes/main/master..origin/master
git diff remotes/main/master..origin/master
Run Code Online (Sandbox Code Playgroud)

  • 我肯定会选择这个作为答案.按照您的指示,我能够查看本地分支和远程分支之间的差异.谢谢! (9认同)
  • 在我的拙见中+1获得最佳答案.如果你提到"fetch"同步克隆源的"远程"图像,那么值得+2.统计/颜色概述步骤特别有用. (3认同)
  • 感谢最终解决了七个或八个"答案"的答案,这些答案只会导致"致命:糟糕的修改"或"致命:含糊不清的争论".我想要的只是看到来自另一个分支的同一文件上的差异,是不是要问太多了?是的,是的.:-)`git diff remotes/origin/<base branch> <current branch> - <filename>`在git 1.8.3.1上运行得很好 (3认同)
  • 不应该是`...`而不是`..`吗? (2认同)

And*_*imm 120

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

git diff @{upstream}
Run Code Online (Sandbox Code Playgroud)

由于这个答案,用于指定修订的git文档具有:

<branchname>@{upstream}例如master@{upstream},branchname @{u}
的后缀 @{upstream}(简短形式<branchname>@{u})是指指定的分支branchname设置为在(使用branch.<name>.remote和配置branch.<name>.merge)之上构建的分支.缺少branchname当前的默认值.

  • 非常好的答案只是错过了一小部分.将行更改为`git diff @@ {upstream}`.额外的`@`是`HEAD`,这就是你现在所处的位置,因此你将`HEAD`与你的分支跟踪的上游进行比较.您可以使用`@ {push }`代替上游来获取要设置为推送的分支之间的差异 (9认同)
  • 最佳答案,不需要取遥控器.需要更多的赞成! (3认同)
  • 在fish shell中我得到了结果:`fatal:ambiguous argument' @ upload':未知的修订或路径不在工作树中.不得不使用`git diff @\{upstream \}`代替. (3认同)

小智 44

我更了解输出:

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

这告诉我什么将被删除,如果我推动本地分支将会添加什么.当然它是相同的,只是反过来,但对我来说更具可读性,我更容易看到将要发生的事情.


Bre*_*ust 30

简单的方法:

git fetch
git log -p HEAD..FETCH_HEAD
Run Code Online (Sandbox Code Playgroud)

这将首先从默认远程(原点)获取更改.克隆repo时会自动创建.你也可以明确:git fetch origin master.

然后git log用于比较当前分支与刚刚获取的分支.(-p(生成补丁)选项显示了差异.)


Sah*_*dhi 13

我就是这样做的.

#To update your local.
git fetch --all
Run Code Online (Sandbox Code Playgroud)

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

#to list all branches
git branch -a
Run Code Online (Sandbox Code Playgroud)

上面的命令将显示所有分支.

#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
Run Code Online (Sandbox Code Playgroud)

现在,您可以按如下方式检查差异.

git diff origin/<branch_name>
Run Code Online (Sandbox Code Playgroud)

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

  • git fetch --all 将从所有遥控器中获取所有内容。如果您使用默认的 origin 远程, git fetch 应该就足够了。 (2认同)

Rat*_*der 11

让你的工作分支是开发,并希望区分本地开发分支和远程开发分支,那种情况下,语法应该是git diff remotes/origin/development..development
或者

git fetch origin git diff origin/development


use*_*737 10

tl;博士:git diff <local branch> <remote branch>

在shell上使用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
Run Code Online (Sandbox Code Playgroud)

在这里,我有两个地方分支机构(my-branchmaster)和4个远程(some-branch,some-other-branch,mastermy-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
Run Code Online (Sandbox Code Playgroud)

要显示本地分支,您可能会想要使用,git branch -l但这是一个完全不同的命令.为了显示当地分支机构使用git branch不带任何选项

$ git branch
* my-branch 
  master
Run Code Online (Sandbox Code Playgroud)

要完成对基本分支选项的审核--list,与您可能期望的允许过滤相反.使用这样的模式:

$ git branch --list 'my*'
* my-branch
Run Code Online (Sandbox Code Playgroud)

您还可以--list与选项结合使用-a,-r但请确保相应地调整您的模式(请记住:远程分支以"遥控器"开头).例:

# 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
Run Code Online (Sandbox Code Playgroud)

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

现在你可以比较所有可用的两个分支(你也可以比较两个本地或两个遥控器).

在这里我将本地与遥控器进行比较my-branch,它们是同步的,所以我没有得到任何输出:

$ git diff my-branch remotes/origin/my-branch
Run Code Online (Sandbox Code Playgroud)

注意:您必须提供没有引号的分支的全名.

我也可以比较本地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
[ . . . ]
Run Code Online (Sandbox Code Playgroud)


Sar*_*ani 9

如果你想看到区别只是更改文件的名称,那么使用:

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

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

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


Wil*_*ken 9

如果您要将当前分支与您想要的分支进行比较,这是一个速记答案git pull.

git fetch
git diff FETCH_HEAD
Run Code Online (Sandbox Code Playgroud)

第一个命令将确定哪个远程分支对应于当前分支.FETCH_HEAD参考中该计算的工件.然后第二个命令使用该引用比较与当前分支的比较.


fag*_*ani 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
Run Code Online (Sandbox Code Playgroud)

希望能帮助其他人解决同样的问题.


Izi*_*zik 5

git difftool <commit> .
Run Code Online (Sandbox Code Playgroud)

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

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

git difftool 1db1ef2490733c1877ad0fb5e8536d2935566341。

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