七、.gitignore:不要什么都提交
7.1 基本语法
# 注释
*.log # 忽略所有 .log 文件
/node_modules/ # 忽略整个目录
build/ # 忽略 build 目录
!build/package.json # 不忽略特定的文件
*.tmp # 忽略所有 .tmp 文件
temp-* # 忽略 temp- 开头的文件
[0-9].txt # 忽略 0.txt,1.txt...
**/temp # 忽略任意层级下的 temp
# 典型的 .gitignore(Node.js 项目)
/node_modules/
/dist/
/build/
.env
.env.local
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
.DS_Store
coverage/
.nyc_output/
.idea/
.vscode/
*.swp
*.swo
7.2 常用模板
# Python
__pycache__/
*.py[cod]
*.so
.Python
env/
venv/
.env
.venv
*.egg-info/
dist/
build/
# Java
*.class
*.jar
target/
.idea/
*.iml
.settings/
.project
.classpath
# 通用
.DS_Store
Thumbs.db
*.tmp
*.swp
*.swo
*~
7.3 检查忽略规则
# 查看为什么某个文件被忽略
git check-ignore -v node_modules/package.json
# 查看所有被忽略的文件
git status --ignored
# 强制添加被忽略的文件
git add -f config.local.js
八、Git 工作流:团队协作的最佳实践
8.1 Git Flow(经典工作流)
main (生产分支) o-----------o-----------o
| | |
develop (开发分支) o---o---o---o---o---o---o---o
| | | |
feature/1 o---o | | |
feature/2 o---o | |
hotfix/1 o---o |
release/1 o---o
分支类型:
main:生产环境代码,只接受 merge
develop:集成分支,所有功能合并到这里
feature/*:新功能开发分支
release/*:发布准备分支
hotfix/*:紧急修复分支
8.2 GitHub Flow(简化工作流)
更适合持续部署的项目:
main 分支始终是可部署状态
新功能从 main 创建分支
通过 Pull Request 合并回 main
8.3 GitLab Flow(环境分支)
main (开发) → staging (预发布) → production (生产)
8.4 Pull Request 流程
# 1. 创建功能分支
git checkout -b feature/user-profile
# 2. 开发并提交
git add .
git commit -m "添加用户资料页面"
# 3. 推送到远程
git push -u origin feature/user-profile
# 4. 在 GitHub/GitLab 上创建 Pull Request
# 5. 收到 Code Review 意见后修改
git add .
git commit -m "根据 review 意见修改"
git push
# 6. PR 被合并后,删除本地分支
git checkout main
git pull
git branch -d feature/user-profile
九、常见问题与解决方案
9.1 提交信息规范
# 格式:<type>(<scope>): <subject>
# 示例
feat(auth): 添加双因素认证
fix(login): 修复密码重置链接过期问题
docs(readme): 更新安装说明
style(button): 调整按钮内边距
refactor(api): 重构用户验证逻辑
test(unit): 添加支付模块测试
chore(deps): 升级 lodash 到 4.17.21
# Type 类型
# feat: 新功能
# fix: Bug 修复
# docs: 文档更新
# style: 代码格式(不影响功能)
# refactor: 重构(不是新功能也不是修复)
# test: 测试相关
# chore: 构建过程或辅助工具变动
9.2 恢复误删的分支
# 1. 查看 reflog(所有 HEAD 移动记录)
git reflog
# 2. 找到删除分支前的提交 hash
# a1b2c3d HEAD@{5}: checkout: moving from feature to main
# 3. 恢复分支
git checkout -b recovered-branch a1b2c3d
9.3 修改历史中的提交信息
# 修改最近一次提交
git commit --amend -m "新的提交信息"
# 修改历史中的某个提交
git rebase -i HEAD~5
# 将需要修改的提交前的 pick 改为 reword
# 保存后会自动弹出编辑器让你修改信息
9.4 拆分一个提交成多个
# 1. 开始交互式 rebase
git rebase -i HEAD~1
# 2. 将 pick 改为 edit
# 3. 重置该提交
git reset HEAD^
# 4. 分别提交
git add file1.js
git commit -m "第一部分:添加功能A"
git add file2.js
git commit -m "第二部分:添加功能B"
# 5. 继续 rebase
git rebase --continue
9.5 清理仓库大小
# 查看大文件
git rev-list --objects --all | git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' | awk '/^blob/ {print substr($0,6)}' | sort --numeric-sort --key=2 | tail -10
# 从历史中删除大文件
git filter-branch --force --index-filter "git rm --cached --ignore-unmatch path/to/large-file.zip" --prune-empty --tag-name-filter cat -- --all
# 强制推送并清理
git push origin --force --all
git reflog expire --expire=now --all
git gc --aggressive --prune=now
十、常用命令速查表
10.1 日常操作
10.2 分支操作
10.3 撤销操作
10.4 远程操作
附:Git 知识地图
Git
├── 基础概念
│ ├── 三大区域(工作区、暂存区、仓库)
│ ├── 三种状态(modified、staged、committed)
│ └── 数据结构(blob、tree、commit)
├── 日常操作
│ ├── add、commit、push、pull
│ ├── status、diff、log
│ └── restore、reset、revert
├── 分支管理
│ ├── branch、checkout、merge
│ ├── rebase、cherry-pick
│ └── stash
├── 远程协作
│ ├── remote、clone、fetch
│ ├── push、pull
│ └── 冲突解决
└── 高级技巧
├── interactive rebase
├── bisect
├── reflog
└── hooks