【问题标题】:How to compare a local Git branch with its remote branch如何比较本地 Git 分支与其远程分支
【发布时间】:2010-12-20 12:33:21
【问题描述】:

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

【问题讨论】:

  • 这个问题后来又被问到了。它有一个很好的答案:stackoverflow.com/questions/11935633/…
  • 例子:git diff master origin/master(master是本地master分支,origin/master是远程master分支)。
  • @klyngbaek,尤其是这个answer ;-)
  • 我最初尝试的是git diff HEAD origin/HEAD,它似乎指向了一个与我预期不同的远程分支。使用完整的分支名称可以按预期工作。

标签: git diff


【解决方案1】:
git diff <local branch> <remote>/<remote branch>

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

当然要remote-tracking branch你需要先git fetch;并且您需要它来获取有关远程存储库中分支的最新信息。

【讨论】:

  • 更准确地说: git diff /
  • 我通常使用git diff &lt;remote&gt;/&lt;remote branch&gt; &lt;local branch&gt; 来查看我的推送对远程仓库的作用。
  • 如果您仅与上游分支进行比较,则更短的git diff origin 就足够了。
  • 请在开头加git fetch,给我这样的新手带来麻烦
  • 嘿,不应该是git diff &lt;remote&gt;/&lt;remote branch&gt; &lt;local branch&gt;吗?否则,我会在我的计算机上打开添加和删除功能(git 版本 2.7.0.windows.2)
【解决方案2】:

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

git diff <mainbranch_path> <remotebranch_path>

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

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

【讨论】:

  • 他之前可能需要获取 (git fetch)
  • 这只是展示了 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 文件路径正确。
  • 在 VS Code 上有 Git Lens 扩展,这对这个和许多其他方式非常有帮助。在新的 GitLens 选项卡 > 存储库上:有一个由提前提交更改的所有文件的列表,单击时并排预览。
【解决方案3】:

第一种

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

【讨论】:

  • 不应该是...而不是..吗?
  • 我肯定会选择这个作为答案。按照您的指示,我能够查看本地分支和远程分支之间的差异。谢谢!
  • 我通常使用git log origin/my_branch..,它将HEAD 作为本地参考,这主要是您的意思。
  • +1 以我的拙见为最佳答案。如果您提到“获取”以同步克隆源的“远程”图像,那么值得 +2。统计/颜色概览步骤特别有用。
  • 感谢您从七八个“答案”中最终得出的一个答案,其结果仅是fatal: bad revisionfatal: ambiguous argument。我只想从另一个分支查看同一个文件的差异,这要求太多了吗?是的,是的。 :-) git diff remotes/origin/&lt;base branch&gt; &lt;current branch&gt; -- &lt;filename&gt; 在 git 1.8.3.1 上效果很好
【解决方案4】:

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

git diff @{upstream}

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

git diff @ @{upstream}

如果您的上游未设置,您可以使用 @{push} 获取您设置推送到的分支的差异(也来自 @Arijoon 的评论):

git diff @{push}

感谢this answerspecifying revisions 的 git 文档有:

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

【讨论】:

  • 非常好的答案,只是缺少了一小部分。将行更改为git diff @ @{upstream}。额外的@HEAD,这是您现在所在的位置,因此您将HEAD 与您的分支正在跟踪的上游进行比较。您可以使用@{push} 而不是上游来获取您设置推送到的分支之间的差异
  • 最佳答案,不需要获取遥控器。需要更多的支持!
  • 在鱼壳中我得到了结果:fatal: ambiguous argument '@upstream': unknown revision or path not in the working tree。不得不改用git diff @\{upstream\}。 ?
  • 你需要先git fetch,否则什么都不做,不显示输出;通过删除 repo 源中的文件进行测试并在本地运行此命令。 .. 仅在 fetch 后有效。
  • 另外,因为给出的答案包括任何本地更改。有时这是需要的,有时不是。
【解决方案5】:

我对以下输出的理解要好得多:

git diff &lt;remote-tracking branch&gt; &lt;local branch&gt;

这向我展示了如果我推送本地分支将要删除什么以及要添加什么。当然它是相同的,只是相反,但对我来说它更具可读性,而且我更愿意看到将要发生的事情。

【讨论】:

  • 我得到完全相同的结果: git diff 或 git diff
【解决方案6】:

简单的方法:

git fetch
git log -p HEAD..FETCH_HEAD

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

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

【讨论】:

    【解决方案7】:

    我就是这样做的。

    # 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>
    

    这会将您的本地分支与远程分支进行比较。

    【讨论】:

    • git fetch --all 将从所有遥控器中获取所有内容。如果您使用默认的原始远程, git fetch 应该就足够了。
    • 令人惊讶的是,8 年后,我们得到了正确解释步骤的完整答案。我们可以做一个 --help 来获取命令。 SO 是关于理解它们。
    【解决方案8】:

    TLDRgit diff &lt;local branch&gt; &lt;remote branch&gt;

    在 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
    

    这里有两个本地分支(my-branchmaster)和四个远程分支(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”开头)。 p>

    例子:

    # 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
    

    文档:git-branch

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

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

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

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

    我还可以将本地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
    [ . . . ]
    

    【讨论】:

      【解决方案9】:

      让你的工作分支是development,你想要区分本地开发分支和远程开发分支。在这种情况下,语法应该是这样的:

      git diff remotes/origin/development..development
      

      或者

      git fetch origin
      git diff origin/development
      

      【讨论】:

        【解决方案10】:

        如果您想看到只是文件名更改的区别,请使用:

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

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

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

        【讨论】:

        • 这是否需要 Git 提取?为什么或者为什么不?请通过editing your answer 回复,而不是在 cmets 中(without "Edit:"、"Update:" 或类似的 - 答案应该看起来像是今天写的)。
        【解决方案11】:

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

        git fetch
        git diff FETCH_HEAD
        

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

        【讨论】:

          【解决方案12】:

          在我的情况下,我有第二个遥控器,名为 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
          

          【讨论】:

            【解决方案13】:
            git difftool <commit> .
            

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

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

            git difftool 1db1ef2490733c1877ad0fb5e8536d2935566341 .

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

            【讨论】:

            • 我认为这很有趣,因为我可以在提交和推送之前进行比较。不幸的是,在 windows vimdiff 中显示很丑;有什么更好的方法,比如notepad++?
            【解决方案14】:

            试试:

            git diff origin HEAD
            

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

            【讨论】:

            • 我在 5 分钟前尝试过,但它仍在滚动浏览,因为我认为我项目中的每个文件都不同
            【解决方案15】:

            我想知道我的ma​​ster分支是否有任何变化......

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

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

              git status
              
            3. 列出分支

              git branch -a
              
              • 大师
                遥控器/来源/主人
            4. 找出差异

              git diff origin/master
              

            【讨论】:

              【解决方案16】:

              例子

              git diff 'master' 'testlocalBranch'
              

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

              【讨论】:

              • 这对 7.5 岁的已被接受的答案有 170 多个赞成票增加了什么?
              • 这是为 mrblah 用户或为接受的答案添加评论的类似用户。语法不同于示例,示例从初学者的角度来看更有帮助。
              • 在这种情况下,它应该在该答案的评论中。
              【解决方案17】:

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

              my_topic_branch 是您的主题分支。

              【讨论】:

                【解决方案18】:

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

                git diff &lt;local branch&gt; &lt;origin&gt;/&lt;remote branch name&gt;

                【讨论】:

                  【解决方案19】:

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

                  man git diff

                  输出扩展头信息的简明摘要,例如文件创建或删除(“new”或“gone”,如果是符号链接,则可选“+l”)和模式更改(“+x”或“-x” 在 diffstat 中分别添加或删除可执行位)。信息放在文件名部分和图形部分之间。隐含--stat。

                  例如

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

                  【讨论】:

                    【解决方案20】:

                    设置

                    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

                    【讨论】:

                      【解决方案21】:

                      Visual Studio 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
                      

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

                      【讨论】:

                      • 为什么-2票支持这个?嗯
                      猜你喜欢
                      • 2013-07-07
                      • 2015-10-19
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2016-04-12
                      • 2018-09-12
                      • 1970-01-01
                      相关资源
                      最近更新 更多