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

我想检查远程分支和本地分支之间的真正差异。 我怎样才能做到这一点?

发出下面的命令部分工作,但它也显示了我的本地分支的新变化的差异。

git diff remote/branch 

从文档 :

 git diff [--options] <commit>...<commit> [--] [<path>…] 

这种forms是查看包含第二个<commit>的分支上的变化,从两个<commit>的共同祖先开始。 “git diff A … B”相当于“git diff $(git-merge-base AB)B”。 您可以省略<commit>任何一个,它与使用HEAD具有相同的效果。

你试过这个吗?

由于这个话题经常出现,而且可能会混淆了git的工作原理,所以我想尽可能地解释一下最简单的情况,但是要有足够的深度,新手才能掌握足够的把握额外的研究。

如果你通过一个普通的“克隆”来设置你的git仓库,并且有默认的refspecs,这意味着你的远程被命名为“origin”,并且你从分支“master”中获取/获取,你有时可能需要看看远程储存库,然后拉下来。

由于“git pull”会自动合并(除非有冲突),可以很高兴看到接下来的“传入”。 如果你不熟悉git是如何工作的,以及如何pipe理refspecs,这可能有点不直观。

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

 $ git diff origin/master 

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

 $ git fetch; git diff ..origin/master 

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

好的,为什么我们要这样做? origin / master是一个refspec (参见手册页)。 总之,这就是我们所说的比较,拉,取,推。 以下所有内容在function上是等同的:

 origin/master remotes/origin/master refs/remotes/origin/master 

要开始解决这个问题,只需要查看你的仓库的.git目录结构。 典型的布局如下所示:

 .git/refs .git/refs/heads .git/refs/heads/master .git/refs/remotes .git/refs/remotes/origin .git/refs/remotes/origin/HEAD .git/refs/remotes/origin/master .git/refs/tags 

看看.git / refs / remotes / origin / HEAD; 在默认情况下,它将指向您用来从和推到的分支。 在我的情况下,因为我是主人,这个文本文件的内容是这样的:

 ref: refs/remotes/origin/master 

这告诉我,我的遥控器的HEAD是由refspec'refs / remotes / origin / master'(碰巧有上面提到的别名)标识的。

这并没有告诉我们多less; 远程仓库的状态是什么? 看看远程主服务器的状态:

 $ cat .git/refs/heads/master 6d0fb0adfdfa5af861931bb06d34100b349f1d63 

好吧,这是一个SHA1哈希; 可能是一个提交。 它如何得到这个文件? 那么,无论什么时候你做了一个pull或者一个fetch,这个文件都会被最近一次提交或者提取的远程提交所更新。 这就解释了为什么我们必须在执行diff之前进行git fetch 。 请记住, git fetch只是更新远程分支的本地副本,但不会将其与工作副本合并。 这是完全安全的。 git fetch; git merge git fetch; git merge相当于一个git pull

一旦你做了提取,git将能够在提取的时候看到远程仓库中最新的提交。

您可以使用不同的说明符组合来按照您的需要查看您的差异(以下示例使用本地工作副本作为隐式第一次提交):

 $ git diff remote/origin This shows the incoming remote additions as deletions; any additions in your local repository are shown as additions. $ git diff ...remote/origin Shows incoming remote additions as additions; the triple-dot excludes changes committed to your local repository. $ git diff ..remote/origin Shows incoming remote additions as additions; the double-dot includes changes committed to your local repository as deletions (since they are not yet pushed). 

有关“..”和“…”的信息,请参阅git help diff以及git-scm修订版本select中的出色文档:提交范围简而言之,对于上面的示例,双点语法显示所有可从原点/掌握,但不是你的工作副本。 同样,三点语法显示了可以从提交(隐式工作副本,远程/原始)可访问的所有提交,但不能同时提交。

我正在经历这一步一步,因为我是相当新的混帐,这正是困惑的事情types…我敢肯定,混帐专家可以find细节的缺陷…我只是希望这个答案弥补了一些发现所有各个职位都有点简单的人的空白。

按照Evgen Bodunov的build议,你想要做的是:

 git diff ...remote/branch 

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