163

假设我克隆了一个存储库并开始修改文件。我知道如果我有本地未提交的更改,我可以按如下方式进行比较,git diff test.txt它将显示当前本地 HEAD 与文件中已修改的未提交更改之间的差异。如果我提交这些更改,我可以通过使用将其与原始存储库进行比较git diff master origin/master

但是,在本地提交之前,有什么方法可以将本地更改与服务器上的原始存储库进行比较?我尝试了各种排列,git diff --cached master origin/master但没有运气。

4

5 回答 5

151

鉴于远程存储库已通过它缓存,git fetch它应该可以与这些提交进行比较。尝试以下操作:

$ git fetch origin
$ git diff origin/master
于 2013-07-16T23:35:42.933 回答
48

我知道这不是对所提出的确切问题的答案,但我发现这个问题是为了区分分支中的文件和本地未提交的文件,我想我会分享

句法:

git diff <commit-ish>:./ -- <path>

例子:

git diff origin/master:./ -- README.md
git diff HEAD^:./ -- README.md
git diff stash@{0}:./ -- README.md
git diff 1A2B3C4D:./ -- README.md

(感谢 Eric Boehs 提供了一种不必输入两次文件名的方法)

于 2015-07-29T14:38:58.240 回答
23

查看对现有文件的非暂存(非添加)更改

git diff

请注意,这不会跟踪新文件。查看分阶段的、未提交的更改

git diff --cached

于 2016-07-29T22:56:53.803 回答
9

如果要直观地比较文件,可以使用:

git difftool

它将为每个更改的文件自动启动您的差异应用程序。

PS:如果你没有设置差异应用程序,你可以像下面的例子那样做(我使用Winmerge):

git config --global merge.tool winmerge
git config --replace --global mergetool.winmerge.cmd "\"C:\Program Files (x86)\WinMerge\WinMergeU.exe\" -e -u -dl \"Base\" -dr \"Mine\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\""
git config --global mergetool.prompt false
于 2015-12-09T13:44:52.710 回答
1

一般来说,以下命令可以实现,它会获取有关分支之间差异的所有详细信息(当前分支与另一个分支),包括未提交的更改:

$ git diff origin/master

它与下面的命令不同,它忽略未提交更改的差异:

$ git diff origin/master..develop

您可以添加一些选项来过滤掉差异:

$ git diff origin/master [--name-only] [--diff-filter=A] [<path>]

选项“ --diff-filter=A ”表示从 origin/master 分支过滤掉添加的文件。但是,如果您在此之前运行过git rm,则必须首先将更改推送到 git stash 中,然后恢复 git repo 并稍后应用隐藏的更改。否则,它不会按预期显示正确的差异。

因此,使用“--name-status”选项查看差异有助于状态。

$ git diff origin/master [--name-status] 
于 2021-05-18T08:54:18.400 回答