代码恢复之git restore命令

683 阅读3分钟

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,效果就是需要用户再次确认才会删除,并且可取消。