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

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

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

git diff remote/branch

从文档:

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

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

你试过这个吗?


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

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

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

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

$ git diff origin/master

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

$ git fetch; git diff ..origin/master 

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

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

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'(恰好有上面提到的别名)标识。

这并没有告诉我们多少; 远程仓库的状态如何? 查看远程主机的状态:

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

好的,这是一个SHA1散列; 可能是一个提交。 它如何被放入这个文件? 那么,无论什么时候进行拉取或抓取,都会使用最近从拉取或抓取的远程提交进行更新。 这就解释了为什么我们必须在执行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修订版选择中的出色文档:提交范围简而言之,对于上面的示例,双点语法显示所有可从源/掌握,但不是你的工作副本。 同样,三点语法显示可以从提交(隐式工作副本,远程/原点)访问的所有提交,但不能同时提交。

我一步步地经历这一步,因为我对git相当陌生,这正是让我感到困惑的事情类型......我敢肯定,git专家可以找到有关细节的缺陷......我只是希望这个答案为一些发现所有帖子都有点简单的人填补了空白。


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

git diff ...remote/branch

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

链接地址: http://www.djcxy.com/p/7561.html

上一篇: How to check real git diff before merging from remote branch?

下一篇: git diff between cloned and original remote repository