如何在git中撤销某种类型文件的未提交更改

39

我在我的git存储库中有很多被修改过的文件,其中很多是xml文件。我如何还原(重置修改)仅限于xml文件的更改?

3个回答

69

你不需要findsed,你可以使用通配符,因为git可以理解它们(不依赖于你的shell):

git checkout -- "*.xml"

这些引号将防止您的shell在执行命令之前将其扩展为当前目录中的文件。

您还可以禁用shell glob扩展(使用bash):

set -f
git checkout -- *.xml
当然,这将无可挽回地抹掉你所做的更改!

3
*/*.xml 并不表示“所有目录中的XML文件”。 - wRAR
1
**/*.xml 将使用您的 shell 通配符,因此已删除的文件不会被检出,但如果只有更改,则应该可以工作。 - Reactormonk
1
由于某些原因,当我指定一个分支时,这个命令不起作用 :-( 例如 git checkout master -- "*.xml" 不起作用,而 git checkout -- "*.xml" 却可以 :-( - mjaggard
@mjaggard 当您指定分支时,行为确实不同。它不会递归地获取文件 :/。您可以查看我的其他答案以了解如何以不同的方式执行。 - Mariusz Pawelski
1
有没有一种方法可以检出不是某种类型的文件?比如 git checkout -- "!*.xml" - sdfsdf
显示剩余7条评论

5
感谢大家的回复,但是对我来说,最准确的解决方案是:
git diff --name-only -- '*.xml' | sed 's, ,\\&,g' | xargs git checkout --

sed 用于转义空格,以解决 xargs 的问题,提高执行速度和准确性。


看到我的回答,您不需要所有这些 :) - CharlesB
如何进行反向操作,只需对您的代码进行简单而短小的更改,即如何仅还原所有未匹配*.xml或更好地不匹配*.xml和*.php的修改文件? - Vicky Dev

1
find . -name '*.xml' -print0 | xargs -0 git checkout HEAD

如果您的系统没有findxargs,可以使用类似的替代方法。或者在zsh或其他支持此种递归全局搜索的Shell中使用git checkout HEAD **/*.xml。请保留HTML标签。

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