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

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

1131199 次浏览

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

git diff <mainbranch_path> <remotebranch_path>

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

示例:git diff main origin/main(其中“main”是本地主分支,“起源/主要”是远程分支,即起源和主分支。)

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

例如,git diff main origin/maingit diff featureA origin/next

当然,表示遥测分支,您需要先git fetch;并且您需要它具有有关远程存储库中分支的最新信息。

我更了解以下输出:

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

这向我展示了如果我按下本地分支,会丢弃什么,会添加什么。当然是一样的,只是相反,但对我来说,它更具可读性,我更愿意看到会发生什么。

第一类

git branch -a

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

* masterremotes/main/masterremotes/origin/HEAD -> origin/masterremotes/origin/masterremotes/origin/mtremotes/upstream/masterremotes/upstream/mt

然后显示差异

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

简单的方法:

git fetchgit log -p HEAD..FETCH_HEAD

这将首先从您的默认远程(源)获取更改。这将在您克隆存储库时自动创建。您也可以显式:git fetch origin master

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

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

git diff remotes/origin/development..development

git fetch origingit diff origin/development

如果您在给定的分支上,并且您想将工作拷贝与您正在跟踪的上游分支进行比较,请使用:

git diff @{upstream}

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

git diff @ @{upstream}

如果你的上游没有设置,您可以使用@{push}来获取要推送到的分支的差异(也来自@陈志强的注释):

git diff @{push}

这个答案提供,指定修订的git留档有:

<branchname>@{upstream},例如master@{upstream}@{u}
的后缀@{upstream}到分支名称(短形式<branchname>@{u})是指branchname指定的分支设置为构建的分支顶部(配置为branch.<name>.remotebranch.<name>.merge)。缺少branchname默认为当前。

如果您想查看仅更改文件名称的差异,请使用:

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

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

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

我就是这么做的。

# To update your local.git fetch --all

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

# To list all branchesgit branch -a

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

# To go to the branch you want to check differencegit checkout <branch_name># To check on which branch you are in, usegit branch(or)git status

现在,您可以检查差异如下。

git diff origin/<branch_name>

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

在我的情况下,我有一个名为heroku的第二个远程没有origin,因为它不同步,我在尝试运行git diff master heroku/master时遇到了这个错误:

致命:模棱两可的参数'heroku/master':未知的修订或路径不在工作树中。

或者当尝试另一种方法git diff master..heroku/master时:

致命:错误的修订'master… heroku/master'

解决方案在运行git diff之前在git fetch中明确提及远程名称,在我的情况下:

$ git fetch heroku$ git diff master heroku/master

示例

git diff 'master' 'testlocalBranch'

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

在此输入图片描述

在此输入图片描述

如果您正在比较当前分支和您想要的git pull,这里有一个速记答案。

git fetchgit diff FETCH_HEAD

第一个命令将找出哪个远程分支对应于您当前的分支。FETCH_HEAD引用中该计算的人工制品。然后第二个命令使用该引用与您当前的分支进行比较。

git difftool <commit> .

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

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

git扩散工具1db1ef2490733c1877ad0fb5e8536d2935566341。

(你不需要git get,除非需要与新提交进行比较)

TLDRgit diff <local branch> <remote branch>

在shell中使用Git时,我喜欢首先通过环顾四周来定位自己。

这是显示所有分支的命令

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

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

此外,my-branch旁边的星号表示我目前在该分支中(您还可以通过使用命令git status知道输出:On branch my-branch.)。

注意:Git Bashshell中的远程分支显示为红色,而本地分支显示为绿色。

如果你只是想显示远程分支

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

要仅显示本地分支,您可能会尝试使用#0,但这是一个完全不同的命令。显示本地分支使用git branch没有选项

$ git branch* my-branchmaster

为了完成对基本分支选项的回顾,有--list,与您可能期望的相反,它允许过滤。将它与这样的模式一起使用:

$ git branch --list 'my*'* my-branch

您也可以将--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-branchremotes/origin/my-branch

文档:git分支

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

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

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

注意:你必须给出分支的全名,没有引号。

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

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

设置

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

与HEAD@{上游}不同的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 thisgit udiff

与任意远程分支的差异

这回答了您标题中的问题(“其远程”);如果您想与“远程”(未配置为分支的上游)进行差异,您需要直接将其定位。你可以看到所有远程分支,如下所示:

git branch -r

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

git remote show

您可以看到单个远程(例如源)的分支/跟踪配置如下:

git remote show origin

一旦你确定了适当的起源分支,只需做一个普通的diff:)

git diff [MY_LOCAL] MY_REMOTE_BRANCH

我想知道我的大师分支是否有任何变化…

  1. 首先,你需要更改你的分支(如果你已经在这个分支下,你不需要这样做!):

    git checkout master
  2. 您可以通过以下命令查看主分支下的哪个文件已被修改:

    git status
  3. 列出分支

    git branch -a
    • master
      远程/源/主
  4. 找出差异

    git diff origin/master

这很简单。您可以使用:git diff remote/my_topic_branch my_topic_branch

其中my_topic_branch是您的主题分支。

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

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

尝试:

git diff origin HEAD

假设您想将当前当地分支的HEAD与原点进行比较。假设您在本地分支上:)

Visual Studio 2019中,只需执行获取。不要代码。

这就是我所做的。我在. gitconfig文件中添加了以下内容,以便我可以使用超越比较

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

下面添加

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

打开命令提示符并转到工作目录。我给出了下面的代码来比较本地开发分支和远程开发分支:

git difftool dev origin/dev --dir-diff

这将打开Beyond Compare并打开具有不同文件的目录。如果没有任何更改,Beyond Compare将不会启动。

FWIW您可以使用--compact-summary选项。

man git diff

输出扩展标头信息的压缩摘要,例如文件创建或删除(“新”或“消失”,如果是符号链接,可以选择“+l”)和模式更改(“+x”或“-x”)分别添加或删除可执行位)。信息放在文件名部分和图形部分之间。暗示--stat。

e. g.

git diff $(current_branch) origin/$(current_branch)

我一直看到这个错误

git diff main origin/masterfatal: 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