能忽略未追踪文件,需用.gitignore;已追踪文件必须先git rm --cached取消追踪,否则.gitignore无效。

直接说结论:能否忽略,取决于文件是否已被 Git 追踪。未追踪的文件靠 .gitignore;已追踪的文件必须先“取消追踪”,否则 .gitignore 完全无效。
文件还没被 git add 过,怎么忽略?
这是最常见也最简单的场景:新建项目、刚克隆仓库,或新增了 node_modules/、.env、dist/ 这类文件,还没执行过 git add。
-
.gitignore规则此时立刻生效,只要规则写对,git add .就不会把它们加进去 - 规则必须放在项目根目录的
.gitignore文件里(不是任意位置) - 路径写法要小心:
logs/表示忽略根目录下的logs目录;**/logs/才能递归忽略所有子目录里的logs - 注意大小写和空格:Windows 下可能因大小写不敏感导致规则失效,建议统一用小写 + 明确后缀,比如
*.LOG不如写成*.log并确保文件名实际是小写
文件已经 git add 甚至 commit 过了,怎么让它不再提交?
.gitignore 对这类文件完全没用——Git 已经把它记在案了,忽略规则只管“新来者”。必须手动解除追踪,但保留本地文件。
- 运行
git rm --cached <file></file>(单个文件)或git rm --cached -r <dir></dir>(整个目录),比如git rm --cached .env - 之后再
git add .和git commit,该文件就彻底从下次提交中消失了 - 如果误删了本地文件(比如忘了加
--cached),用git checkout -- <file></file>能快速恢复 - 别漏掉后续步骤:修改完后记得
git commit -m "remove .env from tracking",否则撤回操作本身不会进历史
为什么 .gitignore 里写了 *.log,但日志文件还是被提交了?
大概率是这些 .log 文件早已被 Git 追踪过,或者规则写法有歧义。
- 检查状态:
git ls-files | grep '\.log$',如果有输出,说明它们正被追踪,.gitignore无效是正常现象 - 确认规则位置:
.gitignore必须在 Git 仓库根目录;子目录里的同名文件只影响该子目录及以下 - 避免过度通配:
*.log能匹配a.log,但不能匹配logs/a.log(除非该目录也在根目录下且规则为logs/*.log或**/*.log) - 注意缓存残留:改完
.gitignore后,如果之前已git add过,得先git rm --cached,否则 Git 仍按旧状态处理
想临时改配置但又不想提交,比如本地 .env 或 database.yml
这不是忽略问题,而是“已追踪但需跳过本地修改”的场景,.gitignore 和 git rm --cached 都不合适——前者会丢掉远程模板,后者会删掉远程文件。
- 用
git update-index --skip-worktree <file></file>,比如git update-index --skip-worktree .env - 这样 Git 会假装没看见你的本地修改,
git status不显示,git commit不包含,但git pull时仍能收到远程更新 - 切分支或
git reset可能导致该标记丢失,需要重新设置;取消标记用git update-index --no-skip-worktree <file></file> - 这个命令不共享给协作者,适合纯本地适配,别指望它替代
.gitignore
最容易被忽略的一点:规则生效依赖 Git 缓存状态,而不是文件系统变化。改了 .gitignore 却没清缓存,或对已追踪文件妄想靠它“自动消失”,是绝大多数人卡住的第一步。


















