gpt4 book ai didi

git - 如何在从远程分支 merge 之前检查真实的 git diff?

转载 作者:IT王子 更新时间:2023-10-29 00:43:18 25 4
gpt4 key购买 nike

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

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

git diff remote/branch

最佳答案

由于这个话题经常出现,而且如果不了解 git 的工作原理可能会让人感到困惑,我想我会尝试解释最简单的情况,但要有足够的深度让新手有足够的把握它可以做更多的研究。

如果您通过普通的“克隆”设置您的 git 存储库并具有默认的 refspecs,这意味着您的远程名为“origin”并且您从分支“master”中 pull/获取,您有时可能需要查看是什么在将其 pull 下之前在远程存储库中。

因为“git pull”会自动 merge (除非有冲突),所以很高兴看到接下来“传入”的是什么。如果您不熟悉 git 的工作原理,尤其是 refspecs 的管理方式,这可能有点不直观。

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

$ git diff origin/master

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

$ git fetch; git diff ..origin/master 

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

好的,我们为什么要这样做? origin/master 是一个refspec(参见手册页)。简而言之,这就是我们为了比较、 pull 或获取以及推送而引用的内容。以下所有内容在功能上都是等效的:

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;在默认情况下,它将指向您用来 pull 和推送的分支。就我而言,因为我是 master,所以这个文本文件的内容如下所示:

ref: refs/remotes/origin/master

这告诉我,我的 Remote 的 HEAD 由 refspec“refs/remotes/origin/master”(恰好具有上述别名)标识。

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

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

好的,这是一个 SHA1 哈希;可能是一个 promise 。它是如何放入这个文件中的?好吧,无论何时进行 pull 或获取,此文件都会使用来自 pull 或获取的远程的最新提交进行更新。这解释了为什么我们必须在执行差异之前 git fetch。请记住,git fetch 只是更新远程分支的本地副本,但不会将它与您的工作副本 merge 。这是完全安全的。一个 git fetch; git merge 等同于 git pull

一旦你执行了获取,git 将能够在远程中看到最近的提交获取时的存储库。

您可以根据需要使用 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 revision selection: commit ranges 上的优秀文档简而言之,对于上面的示例,双点语法显示所有可从 origin/master 访问的提交,但不是您的工作副本。同样,三点语法显示可从任一提交(隐式工作副本、远程/源)访问的所有提交,但不能从两者访问。

我正在逐步完成这个过程,因为我对 git 还很陌生,而这正是让感到困惑的事情......我相信 git 专家可以发现细节的缺陷...我只是希望这个答案能为那些发现所有各种帖子都有些简洁的人弥合差距。

关于git - 如何在从远程分支 merge 之前检查真实的 git diff?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4944376/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com