2024-02-15·18 min read
Git 高级技巧与工作流
掌握 Git 的高级功能和团队协作最佳实践
Git版本控制工作流
Git 高级技巧与工作流
Git 不仅仅是简单的版本控制工具。掌握其高级功能可以大大提升开发效率。
Git 工作流
Git Flow
Git Flow 是一种成熟的分支管理策略:
# 初始化 git flow
git flow init
# 开始新功能
git flow feature start new-feature
# 完成功能
git flow feature finish new-feature
# 开始发布
git flow release start 1.0.0
# 完成发布
git flow release finish 1.0.0
GitHub Flow
更简单的工作流,适合持续部署:
- 从
main
创建功能分支 - 提交代码
- 开启 Pull Request
- 代码审查
- 合并到
main
- 部署
高级 Git 命令
Interactive Rebase
整理提交历史:
# 交互式变基最近 3 个提交
git rebase -i HEAD~3
# 在编辑器中:
# pick = 使用提交
# reword = 修改提交信息
# edit = 修改提交
# squash = 合并到前一个提交
# fixup = 合并到前一个提交,丢弃提交信息
# drop = 删除提交
Cherry Pick
选择性地应用提交:
# 将特定提交应用到当前分支
git cherry-pick <commit-hash>
# 应用多个提交
git cherry-pick <commit1> <commit2>
# 应用但不自动提交
git cherry-pick -n <commit-hash>
Stash 高级用法
# 保存工作进度,包括未跟踪文件
git stash save -u "WIP: feature implementation"
# 查看 stash 内容
git stash show -p stash@{0}
# 应用特定的 stash
git stash apply stash@{2}
# 创建分支从 stash
git stash branch new-feature stash@{0}
修复错误
修改最后一次提交
# 修改提交信息
git commit --amend -m "New commit message"
# 添加遗漏的文件
git add forgotten-file.js
git commit --amend --no-edit
撤销操作
# 撤销未暂存的修改
git checkout -- file.js
# 撤销暂存的修改
git reset HEAD file.js
# 撤销提交但保留修改
git reset --soft HEAD~1
# 完全撤销提交
git reset --hard HEAD~1
# 撤销已推送的提交
git revert <commit-hash>
恢复删除的分支
# 查找删除的分支
git reflog
# 恢复分支
git branch recovered-branch <commit-hash>
Git Hooks
客户端 Hooks
创建 .git/hooks/pre-commit
:
#!/bin/sh
# 运行测试
npm test
# 运行 linter
npm run lint
# 检查提交信息格式
commit_regex='^(feat|fix|docs|style|refactor|test|chore): .+'
if ! grep -qE "$commit_regex" "$1"; then
echo "提交信息格式错误!"
exit 1
fi
Husky 配置
// package.json
{
"husky": {
"hooks": {
"pre-commit": "lint-staged",
"commit-msg": "commitlint -E HUSKY_GIT_PARAMS"
}
},
"lint-staged": {
"*.{js,jsx}": ["eslint --fix", "git add"],
"*.{json,md}": ["prettier --write", "git add"]
}
}
性能优化
大仓库优化
# 浅克隆
git clone --depth 1 <repository-url>
# 稀疏检出
git sparse-checkout init --cone
git sparse-checkout set src tests
# 部分克隆
git clone --filter=blob:none <repository-url>
Git LFS
处理大文件:
# 安装 Git LFS
git lfs install
# 跟踪大文件类型
git lfs track "*.psd"
git lfs track "*.zip"
# 查看跟踪的文件
git lfs ls-files
实用技巧
搜索技巧
# 搜索提交信息
git log --grep="bug fix"
# 搜索代码改动
git log -S "function name"
# 查找引入 bug 的提交
git bisect start
git bisect bad HEAD
git bisect good v1.0.0
别名设置
# 设置别名
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.st status
git config --global alias.lg "log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
清理仓库
# 清理未跟踪的文件
git clean -fd
# 垃圾回收
git gc --prune=now --aggressive
# 查找大文件
git rev-list --objects --all | \
git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' | \
awk '/^blob/ {print substr($0,6)}' | \
sort -n -k 2 | \
tail -20
团队协作
Pull Request 最佳实践
- 保持 PR 小而专注
- 写清晰的描述
- 添加相关的 issue 链接
- 确保 CI 通过
- 及时响应 review 意见
代码审查技巧
# 查看 PR 的改动
git fetch origin pull/123/head:pr-123
git checkout pr-123
# 本地测试 PR
git checkout -b test-pr main
git pull origin pull/123/head
总结
掌握 Git 的高级功能可以:
- 保持代码历史整洁
- 提高团队协作效率
- 快速定位和修复问题
- 优化仓库性能
记住,Git 是一个强大的工具,但也要根据团队实际情况选择合适的工作流和功能。