Git中部分变更无法撤销的原因及特定变更取消暂存并忽略的方法咨询
嗨,我来帮你理清楚这个问题哈!你遇到的情况确实挺闹心的——没有.gitignore的代码库每次推送前都要手动清理变更,太麻烦了。
先说说为啥安装包的变更没法直接撤销:这类变更大多是新增了仓库原本没跟踪过的文件(比如node_modules目录里的文件、package-lock.json这类包管理锁文件)。Git界面里的“撤销”按钮一般只针对仓库已存在文件的修改,对于新增的未跟踪文件,Git默认不会提供撤销选项,因为这些文件本来就不在仓库的跟踪列表里,自然没法“撤销修改”啦。
那怎么解决“取消暂存并忽略特定变更,同时保留其他变更”的需求呢?给你分步说:
1. 先处理已暂存的安装包相关文件(如果有的话)
如果这些文件已经被你添加到暂存区了(出现在Git界面的“已暂存”区域),可以用以下命令取消暂存:
git reset HEAD <具体文件名/目录名>
比如要取消暂存package-lock.json,就敲:git reset HEAD package-lock.json;要是想批量取消暂存node_modules下的所有文件,用git reset HEAD node_modules/*就行。
2. 创建.gitignore文件来永久忽略这些文件
既然项目没有.gitignore,咱们自己建一个最省心!在项目根目录执行命令创建文件:
touch .gitignore
然后打开这个文件,把你不想让Git追踪的内容加进去,比如针对前端项目可以这么写:
# 忽略包依赖目录 node_modules/ # 忽略包管理锁文件 package-lock.json yarn.lock # 还可以加其他你想忽略的文件,比如日志、临时文件等 *.log temp/
保存后,把.gitignore本身加入仓库并提交,这样以后这些文件就不会再出现在变更列表里了:
git add .gitignore git commit -m "Add .gitignore to ignore package-related files"
3. 如果之前不小心提交过安装包文件到仓库
要是你之前误把node_modules这类文件提交到仓库了,得先把它们从仓库移除,但保留本地文件(别直接用git rm,会删掉本地的!):
git rm --cached -r node_modules git rm --cached package-lock.json
然后提交这个变更:
git commit -m "Remove tracked package files from repository"
临时忽略已跟踪文件的小技巧
如果只是临时想忽略某个已跟踪文件的修改(比如不想提交package.json的临时修改),可以用这个命令告诉Git暂时忽略它的变化:
git update-index --assume-unchanged <文件名>
要是之后想恢复跟踪,就用:
git update-index --no-assume-unchanged <文件名>

备注:内容来源于stack exchange,提问作者Dusty Shaw

