git restore .和git restore --staged .的区别:restore命令撤销的默认目标是工作区,加了--staged,目标就变成了stage暂存区
| 命令 | 工作区内容 | 缓存区内容 |
|---|---|---|
git restore .或 git checkout . | 被修改,恢复到暂存区的版本 | 不操作,已有内容不变,代表最新版本 |
git restore --staged . | 不操作,最新修改不变 | 被清空,撤销跟踪修改 |
注:
.代表所有文件,可指定具体文件
区别:
从表中可以看出,git restore .或git checkout .的影响会更大,它是为工作区设计的命令:
如果正在修改代码,还没记录到版本中,git会把当前最新的版本记录(如果当前暂存区有记录,那它代表最新的),直接覆盖工作区正在修改的文件。
而git restore --staged .只是当前暂存区中的版本记录,不会修改任何工作区看到的文件。也就是说它和git reset HEAD .作用一样,都只是摘掉当前最新的版本记录,工作区的文件不会变,对工作区唯一的影响是修改参照的最新版本变了。
得吐槽一下git的命令设计也太乱了,加个参数就变更了操作的初衷
# 查看暂存区状态
git status
# 添加修改到暂存区
git add .
# 将暂存区的内容,覆盖本地还没添加到暂存区的修改,暂存区的内容不变
# 即撤销所有未暂存的修改,代码恢复到暂存区的版本
git restore .
# 等价于
git checkout .
# 不再跟踪缓存区的文件,不会覆盖最近的修改
# 只是撤销添加到缓冲区的记录,与工作区的内容没关系
git restore --staged .
注意
git restore .会将缓存区记录的最新版本覆盖工作区的修改,但是只对已跟踪的文件生效,也就是说只能做到:文件删除恢复、修改恢复。
但是未跟踪的文件是不会修改的,例如工作区新增的文件,由于它们未被跟踪,git restore . 并不会将它们删除(删除可理解为恢复到未添加状态)。PS:git reset虽然能删除文件,但只针对被跟踪的文件。
针对未跟踪文件的删除,git提供了clean命令(只做一件事:删除未跟踪文件,不会撤销任何工作区修改)
git clean [参数]
-n 列出找到的新增文件,不会执行删除
-i 列出找到的新增文件,并等待用户确认是否删除
-f 找到新增文件并直接删除,只会删除一级目录文件,不会递归
组合参数(单独使用无效,需搭配上面三个命令使用):
-d 表示递归所有目录及文件
-q 仅显示错误,成功删除的文件不显示(不加这个参数,删除成功后默认展示删除成果的文件)
# 例子
git clean -f # 删除一级目录下的未跟踪文件,不包括目录
git clean -fd # 删除所有未跟踪文件及目录(包括空目录)
# 上面把f换成i,效果就是需要用户再次确认才会删除,并且可取消。