git reset
和git checkout
命令还接受文件路径作为参数。这让它们将操作限制在单个文件中,而不是对整个提交快照。
Git reset 文件
当使用文件路径调用时,git reset
将更新暂存区以匹配指定提交的版本,但从不更改工作目录。--soft
、--mixed
和--hard
标志对操作文件的git reset
不起作用,操作文件时暂存区总是会更新,而工作目录永远不会更新。
例如,下面的命令将获取foo.py
文件,在头部往后第2个提交中的版本,然后添加到暂存区:
git reset HEAD~2 foo.py
git reset
通常与HEAD一起使用,而不是任意提交。运行git reset HEAD foo.py
将清除暂存区中的更改,但工作目录中的更改不变。
Git checkout 文件
git checkout
操作文件类似于git reset
操作文件,只不过它更新的是工作目录而不是暂存区。git checkout
命令操作文件时,不移动HEAD指针。
例如,下面的命令将获取foo.py
文件,在头部往后第2个提交中的版本,然后更新工作目录中的foo.py
文件:
git checkout HEAD~2 foo.py
就像git checkout
针对提交的操作一样,这可以用于检查项目的旧版本 — 但是范围仅限于指定的文件。
如果提交签出的旧文件,这将产生revert
到该文件旧版本的效果。注意,这将删除对文件的所有后续更改,而git revert
命令仅撤消指定提交所引入的更改。
与git reset
一样,git checkout
通常使用HEAD作为参数来引用提交。例如,git checkout HEAD foo.py
的作用是将foo.py文件,未添加到暂存区的更改丢弃。这与git reset HEAD --hard
命令的作用类似,但是git checkout HEAD foo.py
只对指定的文件进行操作。