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


How to compare a local git branch with its remote branch?

我怎样才能看到本地分支和远程分支之间的diff


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

例如git diff master origin/mastergit diff featureA origin/next

当然,要设置远程跟踪分支,首先需要git fetch;并且需要它具有远程存储库中分支的最新信息。


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

1
git diff <masterbranch_path> <remotebranch_path>

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

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


第一类

1
git branch -a

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

1
2
3
4
5
6
7
* master
  remotes/main/master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
  remotes/origin/mt
  remotes/upstream/master
  remotes/upstream/mt

然后显示差异

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


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

1
git diff @{upstream}

根据此答案,用于指定修订的Git文档具有:

@{upstream}, e.g. master@{upstream}, @{u}
The suffix
@{upstream} to a branchname (short form @{u}) refers to
the branch that the branch specified by branchname is set to build on
top of (configured with branch..remote and branch..merge).
A missing branchname defaults to the current one.


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

git diff

这向我展示了如果我推动本地分支机构将要丢弃的内容和将要添加的内容。当然,它是相同的,只是相反的,但对我来说,它更易读,而且我更容易看到将要发生的事情。


简单的方法:

1
2
git fetch
git log -p HEAD..FETCH_HEAD

这将首先从默认远程(源站)获取更改。这将在克隆回购时自动创建。你也可以明确地说:git fetch origin master

然后使用git日志将当前分支与刚刚获取的分支进行比较。(-p选项(generate patch)显示了不同之处。)


我就是这样做的。

1
2
#To update your local.
git fetch --all

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

1
2
#to list all branches
git branch -a

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

1
2
3
4
5
6
#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

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

1
git diff origin/<branch_name>

这将比较本地分支和远程分支


让您的工作分支正在开发中,并想区分本地开发分支和远程开发分支,这种情况下,语法应该类似于git diff remotes/origin/development..development。或

git fetch origin
git diff origin/development


tl;dr:git diff

在外壳上使用Git时,我喜欢首先通过环顾四周来确定自己的方向。下面是显示所有分支的命令

1
2
3
4
5
6
7
8
$ 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旁边的星号表示我目前在该分支中(您也可以通过使用输出为On branch my-branch.的命令git status)。

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

如果只想显示远程分支:

1
2
3
4
5
6
$ 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

1
2
3
$ git branch
* my-branch
  master

为了完成对基本分支选项的审查,有一个--list,与您可能期望的相反,它允许过滤。使用它的模式如下:

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

您还可以将--list与选项-a-r结合起来,但请确保相应地调整您的模式(记住:远程分支以"远程"开头)。例子:

1
2
3
4
5
6
7
8
# 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,它们是同步的,所以我没有得到任何输出:

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

注意:您必须给出没有引号的分支机构的全名。

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

1
2
3
4
5
6
7
8
9
$ 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
[ . . . ]

如果您只想将差异视为更改的文件名,请使用:

<git diff --name-status

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

git diff


下面是一个简短的答案,如果您正在比较您当前的分支和您想要的东西git pull

1
2
git fetch
git diff FETCH_HEAD

第一个命令将确定哪个远程分支对应于您的当前分支。在FETCH_HEAD参考文献中计算的伪影。然后,第二个命令使用该引用与当前分支的引用进行比较。


我知道这个问题已经有好几个答案了,但是我在尝试其中大部分的时候遇到了一个奇怪的错误。

在我的例子中,我有一个名为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上的远程名称,在我的例子中:

1
2
$ git fetch heroku
$ git diff master heroku/master

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


1
git difftool <commit> .

这将比较您想要的提交和本地文件。不要忘记结尾的圆点(对于本地)。

例如,要将本地文件与某些提交进行比较,请执行以下操作:

git difftool 1db1ef2490733c1877ad0fb5e8536d2935566341 .

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


例子

1
git diff 'master' 'testlocalBranch'

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

enter image description here

enter image description here


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

其中my_topic_branch是你的主题分支。


安装程序

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

压头与压头之间的差异上游

1
2
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

一旦确定了适当的源分支,只需进行正常的差异:)

git diff [MY_LOCAL] MY_REMOTE_BRANCH


我想知道我的主科有没有变化…

  • 首先,你需要改变你的分支(如果你已经在这个分支下,你不需要这样做!)
  • git checkout master

  • 您可以通过此命令查看在主分支下修改了哪些文件
  • git status

  • 列出分支
  • git branch -a

    • master
      remotes/origin/master
  • 找出不同之处
  • git diff origin/master