git add *命令作用是什么?执行后如何撤销并找回文件
git add * 命令的具体作用 - 该命令的执行逻辑是先由当前Shell将
*通配符展开为当前工作目录下所有非.开头的非隐藏文件/文件夹路径,再将这些路径对应的所有改动同步到Git暂存区(索引区),作为下次提交的预备内容。 - 同步到暂存区的改动包含三类:新建文件的内容、已有文件的修改内容、已被手动删除的文件的删除操作——这也是很多人执行命令后误以为文件丢失的核心原因:如果执行命令前你手动删过工作区文件,
git add *会把这个删除动作也记录到暂存区,看起来就像文件“消失”了。 - 该命令本身不会直接删除磁盘上的任何实体文件,所有“文件丢失”的表象本质都是暂存区状态和工作区状态不匹配导致的。
- 注意:
*通配符默认不会匹配.git目录、以.开头的隐藏文件,以及已经被写入.gitignore规则、且从未被Git跟踪过的文件。
撤销
git add *的操作方法 所有撤销操作默认都不会修改你工作区的实体文件,仅改动暂存区的状态,安全性有保障:
- 全量撤销所有刚add到暂存区的内容,回到执行
git add *之前的暂存状态,直接执行:git reset - 如果只需要撤销特定文件的add状态,保留其他文件的暂存记录,执行:
git reset 目标文件路径
注意:不要随意加
--hard参数执行git reset --hard,该参数会同步清空工作区的所有未提交改动,操作不当会真的造成文件丢失。
找回疑似丢失文件的可行方案
根据文件之前的状态,按优先级选对应操作即可:
- 如果执行
git status后看到丢失的文件被标记为deleted且已加入暂存区,说明文件内容已经存在暂存区里,直接执行以下命令就能把文件恢复回工作区:git restore 丢失的文件路径 - 如果丢失的文件之前曾经被提交到Git历史中,哪怕当前暂存区和工作区都看不到,也可以通过操作记录找回:
- 先执行
git reflog列出所有本地仓库的操作历史,找到文件还存在时对应的提交哈希值 - 执行以下命令从对应提交中恢复文件:
git checkout 找到的提交哈希值 -- 丢失的文件路径
- 先执行
- 如果丢失的文件从来没有被commit过,但曾经执行过
git add操作把它加入过暂存区,可以用Git的底层对象回收机制兜底找回:- 执行
git fsck --lost-found,Git会扫描所有没有被引用的文件对象,把它们导出到仓库根目录下的.git/lost-found/other路径中 - 该路径下的文件以Git对象哈希值命名,逐个打开核对内容,就能找到你丢失的文件。注意:该方法仅在Git还没执行垃圾回收(默认30天以上未引用的对象才会被清理)时有效,发现文件丢失后尽量不要频繁执行会触发对象清理的操作。
- 执行
内容的提问来源于stack exchange,提问作者Anirudh Ramprasad
相关产品推荐
相关产品推荐

