如何区分本地未提交的更改和来源
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]
【讨论】:
以上是关于如何区分本地未提交的更改和来源的主要内容,如果未能解决你的问题,请参考以下文章