Git能否将工作副本与暂存区进行差异比较?

89

如何将我的当前工作副本与存储区进行差异比较?

我的用例是:我的工作副本已经包含了我在 stash@{0}中的一部分更改,但我不想应用所有stash@{0}中的更改。我想要进行差异比较以确定我当前工作副本中还缺少哪些值得欢迎的更改。

10个回答

57

如果这是你最近的存储,git diff stash@{0} 将可以完成。如果不是最近的,你可以使用 git stash list 来获取你想要比较的存储索引。

要查看实际工作副本和存储之间的差异,需要先提交它。然后再回滚提交。

git add -A                   <- Add all the files
git commit -m "temp"         <- commit them
git diff stash@{0}..HEAD     <- diff the commit with your stash
git reset HEAD~              <- roll your commit back

1
它没有起作用吗?你期望得到什么,实际上又得到了什么? - Andy
14
这仅与最新提交进行比较,而不是与工作区(未提交更改)进行比较,对吗? - Magne
2
它应该与您的工作目录进行差异比较。如果您想要针对您已经检出的内容进行差异比较,则需要使用 git diff HEAD stash@{0} - Andy
6
确实与最新提交有区别。 - Iulian Onofrei
6
为什么这个明显没有做到要求却被点赞了。踩了它。 - lucid_dreamer
显示剩余6条评论

30

如果您的工作目录存在未提交的更改,您可以先将其提交,然后将其与存储区比较,从而将其视为一个存储区。之后,您可能希望撤销有关工作目录的提交(以保持历史记录的干净)。

  • 提交您的未提交更改的工作目录:

git add .
git commit -m "Dirty commit"
  • 将存储的内容与该提交进行比较:

    git diff stash@{0}
    
  • 然后,稍后你可以撤销这个提交,并将其放回工作目录:

  • git reset --soft HEAD~1
    git reset .
    
    现在你已经使用存储的代码片段与脏工作树进行了比较,回到了最初的状态。

    5
    这个回答应该得到更多的赞。首先,它确实做到了问题所要求的(大多数答案与最后一次提交进行比较,而不是与工作树进行比较)。此外,它非常完整,即使使用“临时提交”来实现目标,也向你展示了如何还原该提交并返回到你的工作树。 - Alexandros

    24

    如果你不提交或者存储你的工作副本,是无法完成这个操作的。存储可能是更低风险的选择:

    git add -A                    # Stage all changes in your working copy.
    git stash save --keep-index   # Stash your working copy and leave it intact
    git diff stash@{0} stash@{1}
    
    为了删除你仅为diffing创建的存储,使用git stash popgit stash drop stash@{0}
    如果您想使用提交代替,请参阅@Magne's answer

    1
    这确实是一种很好的比较工作副本和存储区的方法,谢谢! - Peter T.
    2
    +1 如果您将存储区作为制作大型更改时不想提交的“检查点”的形式,那么这也很方便。进行更改,然后隐藏它们,再进行一些更改并再次隐藏。然后使用类似于 git difftool -d stash@{3} stash@{0} 的内容,以查看两个感兴趣的存储区之间所有更改的目录差异。 - Eric Mutta

    15

    我认为 OP 希望答案能够展示存储区除了工作副本中存在的文件之外还包含哪些差异。

    以下命令可显示存储区包含的内容。

    git stash show -p stash@{0}
    

    5
    这并没有回答这个问题。 - Chris Page

    6
    你可以使用 git stash show -l 命令,它可以显示你想要的内容而不需要额外的存储或提交。

    尽管-l选项有效,但它在git help stash中没有提到。它的文档在哪里? - Chris Page
    我不知道。我是偶然发现的。 - MOHRE
    2
    我记得过去曾经使用过这个。由于我总是会忘记,所以我经常来到这个答案。在我的新版本的git中,它会抛出一个错误 error: switch l requires a value - Iker

    4

    如果要比较工作目录中的文件或文件夹与存储区中的文件或文件夹的差异,可以执行以下操作:

    git diff stash@{0} -- /path/to/fileorfolder

    这里的 stash@{0} 只是代表一个提交哈希值,因此它的工作方式与 git diff 相同。 stash@{0} 只是一个处理程序。


    要获取整个工作目录与存储区内容之间的差异,请执行以下操作:git difftool --dir-diff --no-prompt stash@{0} -- /source/folder/path/here。+1 - Eric Mutta

    2
    您可以像下面这样使用Unix的diff命令与两个Git命令一起使用:
    diff <(git diff) <(git stash show -p stash@{0})
    

    当然您可以将stash@{0}更改为任何您想要的stash。该命令实际上是将实际工作目录(git diff)与其中一个存储进行比较。
    更新:
    您还可以安装colordiff并查看更好的结果:
    安装:
    - Ubuntu/Debian:sudo apt-get install colordiff - OS X:brew install colordiff
    然后只需将命令更改为:
    colordiff <(git diff) <(git stash show -p stash@{0})
    

    这种在Windows 10的bash中(在ConEmu内部,diff 3.3)使用colordiff没有按预期工作。 - o.v

    0
    不确定原帖的意图,但我使用这个命令来查看存储区中实际差异集的内容:
    git difftool stash@{0}^!
    或者
    git diff stash@{0}^!
    或者
    git diff stash@{0}^! > patchfile

    @Wayne,谢谢你的回答。你能解释一下这里的 ^! 是什么意思吗?我以前没见过这个... - alpha_989
    1
    从 https://git-scm.com/docs/revisions: @alpha_989,“'r1^!' 表示包括提交 'r1' 但不包括其所有父提交。单独使用时,此符号表示单个提交 'r1'。” - heidi
    1
    这并没有回答问题。它仅显示存储库的差异,而不是与工作区比较的情况。 - Chris Page

    0
    diff <(git diff --color) <(git stash show -p --color)
    diff <(git diff --color) <(git stash show -p --color stash@{1})
    

    基于 @petros-mitakos 的 答案这个 关于 git --color 选项和 diff 能够显示 git diff 颜色的能力。


    -1

    2
    这并没有回答问题。它只显示了存储区的差异,而不是与工作树的比较。 - Chris Page
    同意。这与工作树不匹配。 - Alexandros

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