标签(linux): git
checkout一个文件和带文件路径git reset非常像,除了它更改的是工作目录而不是缓存区。不像提交层面的checkout命令,它不会移动HEAD引用,也就是你不会切换到别的分支上去
如果你缓存并且提交了checkout的文件,它具备将某个文件回撤到之前版本的效果。注意它撤销了这个文件后面所有的更改,而git revert命令只撤销某个特定提交的更改

--soft 缓存区和工作目录都不会被改变
--mixed 默认选项。缓存区和你指定的提交同步,但工作目录不受影响
--hard 缓存区和工作目录都同步到你指定的提交
虽然在调用时加上 --hard选项可以令git reset成为一个危险的命令(译注:可能导致工作目录中所有当前进度丢失!),但本例中工作目录内的文件并不会被修改。不加选项地调用git reset并不危险——它只会修改暂存区域
执行命令后:
当检测到文件路径时,git reset将缓存区同步到你指定的那个提交。比如,下面这个命令会将倒数第二个提交中的foo.py加入到缓存区中,供下一个提交使用。
git reset HEAD~2 foo.py
运行git reset HEAD foo.py 会将当前的foo.py从缓存区中移除出去,而不会影响工作目录中对foo.py的更改
--soft、 --mixed和--hard对文件层面的git reset毫无作用,因为缓存区中的文件一定会变化,而工作目录中的文件一定不变。
git reflog命令分析你所有分支的头指针的日志来查找出你在重写历史上可能丢失的提交
命令
作用域
常用情景
git reset
提交层面
版本回滚,,在私有分支上舍弃一些没有提交的更改
文件层面
将文件从缓存区中移除
git checkout
切换分支或查看旧版本
舍弃工作目录中的更改
git revert
在公共分支上回滚更改
(没有)