如何在从远程分支合并之前检查真正的git diff?

How to check real git diff before merging from remote branch?

我想检查远程分支和本地分支之间的实际差异。我该怎么做?

发出下面的命令部分有效,但它也显示了我的本地分支的新更改的差异。

1
git diff remote/branch


由于这个话题经常出现,如果没有一点关于Git工作原理的背景,可能会令人困惑,我想我会尽量解释最简单的情况,但有足够的深度,新来者将有足够的处理能力来做更多的研究。

如果您通过普通的"克隆"设置了Git存储库,并且具有默认的refspec,这意味着您的远程设备名为"origin",并且您从分支"master"中提取/提取,则有时可能需要先查看远程存储库中的内容,然后再将其取下。

因为"git pull"会自动合并(除非有冲突),所以很高兴看到下一个"incoming"是什么。如果您不熟悉git的工作方式,特别是refspec如何重新管理,这可能有点不直观。

假设有人在远程存储库中进行了更改(为了便于说明,通过提交更改并将其推送,向远程存储库添加一行),然后键入:

ZZU1

您可能看不到任何更改;但是,如果您执行以下操作:

ZZU1

您将看到提交到本地Git存储库的内容与远程存储库中的内容之间的区别。您将看不到任何在本地文件系统中或在索引中进行的更改。

好吧,我们为什么要这样做?源站/主站是一个参考规范(参见手册页)。简言之,这就是我们所指的,以便与之进行比较、从中提取或推送。以下各项功能相同:

ZZU1

要开始解决这个问题,只需浏览一下您的存储库的.git目录结构。典型布局如下:

ZZU1-4型

请看.git/refs/remotes/origin/head;在默认情况下,它将指向您用于拉取和推送的分支。在我的例子中,因为我是master,所以这个文本文件的内容如下:

ZZU1

这告诉我,我的遥控器的头由refspec"refs/remotes/origin/master"(恰好具有上述别名)标识。

这并没有告诉我们太多;远程存储库的状态是什么?查看远程主机的状态:

ZZU1

好吧,这是一个sha1哈希;可能是一个提交。它是如何放入这个文件的?好吧,无论何时执行拉取或提取,这个文件都会用从远程提取或提取的最新提交进行更新。这就解释了为什么在执行diff之前必须先使用EDOCX1。记住,EDOCX1只是更新远程分支的本地副本,但不会将其与工作副本合并。它是完全安全的。一个EDOCX1-2相当于一个EDOCX1-3。

一旦您进行了获取,Git将能够在远程中看到最新的提交从获取时起存储库。

您可以使用各种说明符到git的组合来查看您想要的差异(以下示例使用本地工作副本作为隐式第一次提交):

ZZU1

有关".."vs"…"的信息,请参阅EDOCX1",以及git-scm revision selection:commit ranges上的优秀文档。简单地说,对于上面的示例,双点语法显示所有可从源站/主站访问的提交,但不显示您的工作副本。同样地,三点语法显示了可以从提交(隐式工作副本,远程/源站)中获得的所有提交,但不能同时从两者中获得。

我一步一步地经历这个过程,因为我对Git还比较陌生,而这正是让我困惑的事情…我相信Git的专家们会发现细节上的缺陷…我只是希望这个答案能弥补一些人对所有不同帖子的理解有点简短。


从文档中:

BLCK1

你试过这个吗?


正如Evgen Bodunov所建议的那样,您要做的是:

ZZU1

这将区分来自远程/分支的更改,并忽略来自当前头部的更改。