如何在git checkout上仅恢复修改后的文件?


How can I restore only the modified files on a git checkout?

假设我有一个包含数百个文件的目录。我修改了其中的几项,但后来我意识到我的更改很糟糕。如果我这样做:

1
git checkout whole_folder

然后所有的东西都被再次签出,我必须重新编译所有的东西。是否有一种方法使签出只影响修改过的文件,或者我需要单独对每个文件运行checkout


试试这个:

1
$ git checkout `git ls-files -m`

-M只列出修改过的文件。


但是

1
git checkout -- $(git ls-files -m)

同时检查删除的文件。

如果您只想签出修改过的文件,这对我有效:

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


您所做的是正确的,但是您可能希望添加一个消除歧义的--,以防目录名与分支名相同,即:

1
git checkout -- whole_folder

Git将只更新它实际需要更改的文件上的时间戳,因此,如果基于依赖关系的构建工具正确地使用了mtimes,则应重新构建最小的安全文件数。如果你看到不同的行为,那将是一个错误。