如何区分本地未提交的更改和来源

Posted

技术标签:

【中文标题】如何区分本地未提交的更改和来源【英文标题】:How to Diff between local uncommitted changes and origin 【发布时间】:2013-07-15 08:17:17 【问题描述】:

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

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

【问题讨论】:

我想知道我的文件与本地上次提交的版本相比有多少变化。我的问题的答案就是这个问题。谢谢! 【参考方案1】:

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

$ git fetch origin
$ git diff origin/master

【讨论】:

啊,太好了。关键是让主人离开。我之前尝试过一个组合,但当我做git diff master origin/master 时,它仍在与提交的版本进行比较(回想起来很明显)。但是现在忽略 master 会将本地更改与获取的版本进行比较。 @Chaitanya 很好,我可以帮忙。实际上,我发现 Git 使用的不同风格有点烦人:一旦你必须写 origin master 和其他地方 origin/master。还有工作要做,恕我直言。 这似乎不起作用:git diff origin/master 返回 fatal: ambiguous argument 'origin/master': unknown revision or path not in the working tree. master 存在于原点,例如 git fetch origin master 工作正常,【参考方案2】:

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

语法:

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 提供了一种不必输入两次文件名的方法)

【讨论】:

我更喜欢一般的解决方案,而不是上面狭窄的、具体的解决方案。介意分享一下你在哪里找到的吗? 我似乎找不到关于commit-ish 和冒号分隔符的详细信息的文档。 git-diff 上的文档似乎没有提到它。我已经使用了很长时间,以至于我不记得我第一次在哪里找到它。可能是其他人关于其他命令的示例,我只是尝试了git-diff。恐怕another answer on commit-ish 是我目前能想到的最好的了。 一个很好的补充是git diff master:./ -- README.md。这样您就不必输入两次README.md,并且可以更轻松地将其添加到别名中。 感谢@EricBoehs,这是一个很好的建议。 该语法对我不起作用......而不是git diff master: -- README.md ./ 创建一个/dev/null 源而不是远程分支。使用 git 版本 2.19.0【参考方案3】:

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

git diff

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

git diff --cached

【讨论】:

【参考方案4】:

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

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

【讨论】:

此更改是否立即生效? 我只是好奇,这与提出的问题有什么关系? git difftool 不会将本地更改与 master 进行比较吗?但是,OP 希望它在本地更改和远程主机之间。 迄今为止最简单的解决方案【参考方案5】:

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

$ 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] 

【讨论】:

以上是关于如何区分本地未提交的更改和来源的主要内容,如果未能解决你的问题,请参考以下文章

Git 区分大小写

Git区分文件名大小写

事务隔离级别区分,未提交读,提交读,可重复读

如何将本地未提交的更改合并到另一个 Git 分支?

如何使用两个提交按钮,并区分使用哪个提交表单? [复制]

如何区分从 HTML 表单提交的 HTTP 请求和从客户端提交的 HTTP 请求?