本地仓库和远程仓库之间的'git diff'

88

我想在提交拉取请求之前,使用GitHub存储库对比工具比较本地文件和存储库的差异,以便查看将显示什么。是否有准确的方法来做这件事?

我认为GitHub的对比工具使用Git的diff进行操作。


1
你可以在不发送到文本文件的情况下执行git diff。在控制台中查看通常是高效的,这是我的观点。 - Denys Séguret
@dystroy 我知道,但我的问题是Windows与Unix的换行符,因此整个文件都被跟踪为差异。我发现对于如此大量的输出来说,控制台效率低下。 - Terry
哦,ST2会对输出进行着色,这非常方便。 - Terry
我使用了新的GitHub for Windows来进行原始的提交/推送,并使用GitHub网页界面来进行原始的拉取请求。 - Terry
可能是重复的问题:如何比较本地 Git 分支和远程分支? - nawfal
显示剩余4条评论
7个回答

184

比较本地工作目录与远程分支的差异,例如origin/master:

  1. git fetch origin master
    这告诉 git 从名为 'origin' 的远程仓库中获取名为 'master' 的分支。 git fetch 不会影响您的工作目录中的文件;它不像 git pull 一样尝试合并更改。
  2. git diff --summary FETCH_HEAD
    当获取远程分支时,可以通过 FETCH_HEAD 在本地引用。上面的命令告诉 git 将工作目录文件与 FETCHed 分支 HEAD 进行比较,并以摘要格式报告结果。 摘要格式提供了变更的概述,通常是一个很好的开始方式。 如果想要更多信息,请使用 --stat 替换 --summary
  3. git diff FETCH_HEAD -- mydir/myfile.js
    如果要查看特定文件(例如 myfile.js)的更改,请跳过 --summary 选项并引用所需的文件(或树)。

请注意,origin 引用远程仓库,而 master 引用该仓库中的分支。 默认情况下,git 使用名称 origin 作为远程仓库的名称,因此如果执行 git clone <url>,它将默认调用该远程仓库 origin。 使用 git remote -v 查看 origin 指向哪里。

你可能有多个远程版本库。例如,如果你在GitHub上“fork”了一个项目,通常需要引用原始项目的远程版本库以及你自己的分支。假设你创建了 https://github.com/yourusername/someproject 作为 https://github.com/theoriginal/someproject 的分支。按照惯例,你会将引用原始版本库的远程版本库命名为 upstream,而你自己的分支则为 origin。如果你在GitHub上对自己的分支进行更改,并希望在本地获取这些更改,则需要使用 git fetch origin master。如果 upstream 进行了更改,你需要在进行更多更改之前同步在本地更新版本库,那么你需要使用git fetch upstream master


6
感谢您的点赞,因为它提供了比其他答案更多的细节。 - paxdiablo
7
因为提供了详细的内容和上下文解释,所以我给你点赞。如果有人在问这个问题,他们可能刚开始接触 Git。当你试图理解一项新技术时,清晰的上下文和解释非常重要,这从来不会有坏处。 - Michael Harris
8
我建议补充一个命令:2b. 如果--summary不够用,可以使用 git diff --stat FETCH_HEAD 命令来获取更多信息。这将提供一些额外的信息。 - Randall
2
如果我想在推送更改之前避免合并冲突,那么最好的方法是先进行一次拉取操作,然后将我的本地工作目录与FETCH_HEAD进行比较,如果一切正常就执行推送操作吗? - Nuetrino
这是一个正确的答案,但输出结果让人困惑,因为它将任何需要添加或更改的内容显示为已删除和还原。建议使用git diff HEAD FETCH_HEAD,它相当于git diff branchname origin/branchname,这样通过pull将要添加/修改的文件将显示在diff的右侧。 - undefined
显示剩余2条评论

47

不要执行 pull 操作:

  • 执行 fetch 操作(命令行与 git pull 相同,但不会自动合并)
  • 在你的目标分支和其他分支之间执行 diff
  • 如果需要,再执行 merge

6

根据原帖作者的评论,他遇到的问题是Windows和Unix换行符导致的。您可以使用以下配置命令告诉git-diff忽略EOL代码的差异。

git config --global core.whitespace cr-at-eol

core.autocrlf 是另一个有用的设置,用于处理系统换行符差异。 - DylanYoung

3
你可以使用:git diff remote/my_topic_branch my_topic_branch
其中my_topic_branch是你的主题分支。

1
这给了我一个错误: 致命错误:模棱两可的参数 'origin/<branch>':未知的修订版或路径不在工作树中。 - BobHy

2

例如:git diff master origin/master


这实际上是我发现最有用的答案。将“master”替换为您的分支名称。 像OP一样,我想在执行git pull之前查看所有实际的更改。 这将显示每个已添加/修改文件与我的本地版本的“左侧”和原始版本的“右侧”的差异。如果您使用less作为您的分页器,那么可以搜索/^diff以跳转到每个差异的开始。 - undefined

0

我曾经遇到过一个相关的问题,我想在合并GitHub PR之前快速了解更改的概述。

基本上,我只对知道PR中添加、修改或删除了多少文件感兴趣。这个PR有成千上万的更改,使得GitHub Web UI无用。

如果有人有类似的问题,请尝试在本地机器上执行以下操作:

  1. 按照 @HieroB 的建议,使用 git fetch origin branch 命令。这将获取远程分支的最新更改元数据,而不会在本地拉取所有这些更改。

  2. 使用命令 git diff --name-status FETCH_HEAD > difflog.txt。Git 将创建一个列表,其中包含在远程分支中更改的所有文件,并将该列表保存到文件中。结果文件的结构如下:

    M  files/file1.json
    D  files/file2.json
    A  files/file3.json
    

    其中,更改标记 M 表示“修改”,D 表示“删除”,A 表示“添加”。在每行中,其更改标记将与文件名用制表符分隔。

  3. 在文本编辑器中打开文件,复制每个更改标记以及它们相邻的制表符,并使用文本编辑器的“在文件中查找”功能搜索标记的出现。


0

需要记住的重要事项: Git diff 将显示两个提交分支(远程或本地)之间的差异。

步骤1)- 提交本地

因此,第一步是确保您已经提交了本地存储库。您可以运行 git status 查看是否有任何文件未提交。

如果您需要添加文件,请运行 git add {filename} 或者添加所有文件 git add .。然后,您可以运行 git commit -m "message" 来提交您的本地文件。

步骤2)- 从远程获取您的分支

您可以使用 git fetch origin master 获取您的远程分支。如果您看到以下消息,则可以继续进行。

branch            master     -> FETCH_HEAD

请注意,origin 是存储库,master 是该存储库中的分支。
第三步 检查差异
现在,您可以使用 git diff --summary FETCH_HEADgit diff origin/master master --summary 来查看您的更改。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接