背景与动机
除了提交、分支、远程同步,Git 日常使用中还有两类高频问题:
- 哪些文件不该提交。
- 一个功能从开始开发到推送远程,应该按什么顺序操作。
这一篇整理 .gitignore 和常见工作流,把容易散落在日常操作里的习惯收束到一起。
核心原理拆解
1. .gitignore:声明不需要跟踪的文件
.gitignore 用来声明哪些文件不应该被 Git 跟踪,例如日志、临时文件、本地环境配置、依赖目录等。
常见写法:
# 日志*.log
# 本地环境.env.env.local
# 依赖目录node_modules/
# 构建产物dist/build/.gitignore 更适合放团队共同认可的忽略规则,例如构建产物、依赖目录、日志文件。
2. 已经被跟踪的文件不会自动被忽略
如果文件已经被 Git 跟踪,后来再加入 .gitignore 不会自动停止跟踪。需要先从 Git 索引中移除:
git rm --cached <file>如果要按 .gitignore 重新整理整个仓库索引:
git rm -r --cached .git add .git commit -m "remove ignored files from tracking"这类操作影响范围较大,提交前一定要检查:
git status -sbgit diff --cached3. 本地个人忽略规则
有些文件只是不想在自己机器上看到,不一定适合写进项目 .gitignore。这类规则可以放到:
.git/info/exclude它和 .gitignore 类似,但不会提交到仓库,因此不会影响其他人。
常见工作流示例
1. 第一次提交一个新项目
git initgit add .git commit -m "initial commit"git remote add origin <remote-url>git push -u origin main如果当前默认分支叫 master,可以根据团队规范决定是否改成 main。
2. 日常开发一个功能
git switch maingit pullgit switch -c feature/login
# 修改代码
git statusgit diffgit add .git diff --cachedgit commit -m "add login form"git push -u origin feature/login这个流程里有两个检查点:
git diff:暂存前看工作区具体改动。git diff --cached:提交前看暂存区内容。
3. 拉取远程更新前先检查
git statusgit fetch origingit log --oneline --graph --decorate --allgit pull origin main如果本地工作区还有未提交变更,先提交、stash,或者明确丢弃后再拉取,避免混在一起难排查。
4. 清理误提交的环境文件
假设 .env 已经被提交过,现在想停止跟踪:
echo ".env" >> .gitignoregit rm --cached .envgit add .gitignoregit commit -m "stop tracking local env file"如果 .env 里已经包含真实密钥,还需要额外处理密钥泄露问题:撤销跟踪不等于从历史中彻底删除秘密。
常见陷阱
1. 误以为 .gitignore 会影响已经提交的文件
.gitignore 只影响“未被跟踪的新文件”。已经进入 Git 历史或索引的文件,需要用 git rm --cached 移除跟踪。
2. 把本地个人规则提交给所有人
只和个人编辑器、个人临时文件有关的忽略规则,不一定要写进项目 .gitignore。可以考虑 .git/info/exclude。
3. 提交前不看暂存区
日常工作流里最容易漏掉的是 git diff --cached。它能帮你确认下一次提交到底包含什么。
4. 密钥误提交后只改 .gitignore
如果密钥已经进了 Git 历史,只加入 .gitignore 并不能让历史里的密钥消失。正确处理通常还包括吊销旧密钥、替换新密钥,并按团队流程处理历史清理。
一句话总结
.gitignore 解决的是“以后哪些新文件不跟踪”,日常工作流解决的是“每次提交前如何确认范围和意图”。