如何在 git checkout 中仅还原修改过的文件?

10

假设我有一个包含数百个文件的目录。我修改了其中几个文件,但之后我意识到我的更改是错误的。如果我执行:

git checkout whole_folder

然后所有的东西都需要重新检查,我必须重新编译所有内容。有没有一种方法可以使检出只影响修改过的文件,或者我需要对每个文件分别运行 checkout 命令?


如果你使用 git checkout -- <path> (比 git checkout whole_folder 更为安全的方式),那么时间戳仅对那些未被该命令更改的文件保持不变。这意味着,根据修改时间戳,你的构建过程仍然只需重新构建最小化需要重新构建的文件。 - Mark Longair
你确定git会检出所有文件吗?据我所知,当你执行git checkout -- whole_folder或者git reset --hard HEAD时,git会尽力只检出被修改的文件,而不会触及其他任何东西。 - holygeek
那么,我应该执行 git checkout -- whole_folder 吗? - Geo
是的,我认为你所做的是正确的 - 如果你看到 git 更新了时间戳却没有必要更改的文件,那就是一个 bug。我已经添加了一个这样的回答。 - Mark Longair
3个回答

19

试一试这个:

$ git checkout `git ls-files -m`

-m 仅列出修改过的文件。


有没有跨平台的解决方案可用?我有时会在Windows上使用标准的cmd.exe shell。 - Geo

6
但是
git checkout -- $(git ls-files -m)

此外,它还检查已删除的文件。

如果您只想检出修改过的文件,则可以尝试以下方法:

git checkout -- $(git status -uno | grep --colour=never '#' | awk '{ print $2 $3 }' | grep --colour=never ^modified: | cut -c10-)

谢谢@TheFox。它几乎起作用了。我必须稍微修改一下命令才能让它对我起作用。这是我使用的命令行:git checkout -- $(git status | grep modified: | cut -c14-) - user1029978

2

你所做的是正确的,但是为了防止目录名与分支名相同的情况,建议添加一个消歧标记--,例如:

git checkout -- whole_folder

Git只会更新它实际需要更改的文件的时间戳,因此如果您的基于依赖关系的构建工具正确使用了修改时间,那么应该只重建最少量的文件才是安全的。如果您看到不同的行为,则可能是一个错误。


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