本教程将介绍工作中最常用的 Git 工作流程和最佳实践。内容基于 Git 官方文档 和实际项目经验整理,涵盖从基础操作到团队协作的完整流程。
Table of contents
Open Table of contents
Git 工作流概述
Git 工作流是团队在使用 Git 进行版本控制时遵循的一套规范和流程。选择合适的工作流可以提高团队协作效率,减少代码冲突,确保代码质量。
常见的 Git 工作流类型
- 集中式工作流:适合小团队,类似 SVN 的工作方式
- 功能分支工作流:每个功能在独立分支开发
- Git Flow:适合有明确发布周期的项目
- GitHub Flow:简化的分支模型,适合持续部署
- GitLab Flow:结合环境分支的工作流
本教程将重点介绍最实用的功能分支工作流和 Git Flow。
基础准备
配置 Git 用户信息
首次使用 Git 需要配置用户信息:
# 配置全局用户名和邮箱
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"
# 查看配置
git config --list
配置常用别名
设置别名可以提高工作效率:
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.unstage 'reset HEAD --'
git config --global alias.last 'log -1 HEAD'
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"
配置默认编辑器
# 使用 vim
git config --global core.editor vim
# 使用 VS Code
git config --global core.editor "code --wait"
功能分支工作流
功能分支工作流是最常用的工作模式,每个新功能都在专门的分支上开发。
1. 克隆仓库
# 克隆远程仓库
git clone https://github.com/username/repository.git
cd repository
2. 创建功能分支
# 从 main 分支创建新的功能分支
git checkout -b feature/user-authentication
# 或者使用两步操作
git branch feature/user-authentication
git checkout feature/user-authentication
分支命名规范:
feature/- 新功能bugfix/- 错误修复hotfix/- 紧急修复refactor/- 代码重构docs/- 文档更新
3. 开发和提交
# 查看文件状态
git status
# 添加文件到暂存区
git add filename.js
# 或添加所有修改
git add .
# 提交更改
git commit -m "feat: add user authentication module"
提交信息规范
遵循约定式提交(Conventional Commits):
<type>(<scope>): <subject>
<body>
<footer>
常用类型:
feat: 新功能fix: 错误修复docs: 文档更新style: 代码格式调整refactor: 代码重构test: 测试相关chore: 构建或辅助工具变动
示例:
git commit -m "feat(auth): implement JWT token validation"
git commit -m "fix(api): resolve null pointer exception in user service"
git commit -m "docs(readme): update installation instructions"
4. 推送到远程仓库
# 首次推送需要设置上游分支
git push -u origin feature/user-authentication
# 后续推送
git push
5. 保持分支更新
在开发过程中,定期同步主分支的更新:
# 切换到主分支
git checkout main
# 拉取最新代码
git pull origin main
# 切回功能分支
git checkout feature/user-authentication
# 合并主分支的更新
git merge main
# 或使用 rebase(保持提交历史线性)
git rebase main
6. 创建 Pull Request
功能开发完成后,在 GitHub/GitLab 上创建 Pull Request(或 Merge Request):
- 推送最新代码到远程分支
- 在代码托管平台创建 PR
- 填写 PR 描述,说明改动内容
- 指定审查者(Reviewers)
- 等待代码审查和批准
- 合并到主分支
7. 合并后清理
# 切换到主分支
git checkout main
# 拉取最新代码(包含已合并的功能)
git pull origin main
# 删除本地功能分支
git branch -d feature/user-authentication
# 删除远程分支
git push origin --delete feature/user-authentication
Git Flow 工作流
Git Flow 是一个更严格的分支模型,适合有明确发布周期的项目。
分支结构
main(或master):生产环境代码develop:开发分支,集成所有功能feature/*:功能分支,从 develop 创建release/*:发布分支,准备新版本hotfix/*:热修复分支,从 main 创建
1. 初始化 Git Flow
# 安装 git-flow 工具(可选)
# macOS
brew install git-flow
# Ubuntu
sudo apt-get install git-flow
# 初始化
git flow init
2. 开发新功能
# 创建功能分支
git flow feature start user-profile
# 开发和提交
git add .
git commit -m "feat: add user profile page"
# 完成功能(合并到 develop)
git flow feature finish user-profile
等效的标准 Git 命令:
# 创建功能分支
git checkout -b feature/user-profile develop
# 开发完成后合并
git checkout develop
git merge --no-ff feature/user-profile
git branch -d feature/user-profile
3. 准备发布
# 创建发布分支
git flow release start 1.0.0
# 在发布分支上进行版本号更新、文档完善等
git commit -am "chore: bump version to 1.0.0"
# 完成发布(合并到 main 和 develop)
git flow release finish 1.0.0
4. 紧急修复
# 创建热修复分支
git flow hotfix start critical-bug
# 修复问题
git commit -am "fix: resolve critical security vulnerability"
# 完成热修复(合并到 main 和 develop)
git flow hotfix finish critical-bug
常用 Git 操作
查看提交历史
# 查看提交日志
git log
# 简洁格式
git log --oneline
# 图形化显示分支
git log --graph --oneline --all
# 查看某个文件的历史
git log -- filename.js
# 查看最近 5 次提交
git log -5
撤销和修改
# 撤销工作区的修改
git checkout -- filename.js
# 撤销暂存区的文件
git reset HEAD filename.js
# 修改最后一次提交
git commit --amend
# 回退到某个提交
git reset --soft HEAD~1 # 保留更改在暂存区
git reset --mixed HEAD~1 # 保留更改在工作区(默认)
git reset --hard HEAD~1 # 完全丢弃更改(危险)
# 撤销某次提交(创建新提交)
git revert <commit-hash>
暂存工作进度
# 暂存当前工作
git stash
# 暂存并添加描述
git stash save "work in progress on feature X"
# 查看暂存列表
git stash list
# 恢复最近的暂存
git stash pop
# 恢复指定的暂存
git stash apply stash@{0}
# 删除暂存
git stash drop stash@{0}
# 清空所有暂存
git stash clear
分支管理
# 查看所有分支
git branch -a
# 查看远程分支
git branch -r
# 重命名分支
git branch -m old-name new-name
# 删除本地分支
git branch -d branch-name
git branch -D branch-name # 强制删除
# 删除远程分支
git push origin --delete branch-name
# 查看分支合并情况
git branch --merged
git branch --no-merged
标签管理
# 创建轻量标签
git tag v1.0.0
# 创建附注标签
git tag -a v1.0.0 -m "Release version 1.0.0"
# 查看标签
git tag
git tag -l "v1.*"
# 查看标签信息
git show v1.0.0
# 推送标签到远程
git push origin v1.0.0
git push origin --tags # 推送所有标签
# 删除标签
git tag -d v1.0.0
git push origin --delete v1.0.0
远程仓库操作
# 查看远程仓库
git remote -v
# 添加远程仓库
git remote add upstream https://github.com/original/repository.git
# 修改远程仓库 URL
git remote set-url origin https://github.com/username/repository.git
# 删除远程仓库
git remote remove upstream
# 拉取远程更新
git fetch origin
git fetch --all
# 拉取并合并
git pull origin main
# 拉取并变基
git pull --rebase origin main
解决冲突
合并冲突
当合并分支时出现冲突:
# 尝试合并
git merge feature/new-feature
# 如果出现冲突,查看冲突文件
git status
# 手动编辑冲突文件,解决冲突标记
# <<<<<<< HEAD
# 当前分支的内容
# =======
# 要合并分支的内容
# >>>>>>> feature/new-feature
# 标记冲突已解决
git add conflicted-file.js
# 完成合并
git commit
Rebase 冲突
# 开始 rebase
git rebase main
# 如果出现冲突,解决后继续
git add resolved-file.js
git rebase --continue
# 跳过当前提交
git rebase --skip
# 放弃 rebase
git rebase --abort
团队协作最佳实践
1. 提交频率
- 频繁提交小的、逻辑完整的更改
- 每次提交应该是可编译、可运行的
- 避免一次提交包含多个不相关的更改
2. 分支策略
- 保持主分支(main/master)始终可部署
- 功能分支应该短期存在,及时合并
- 定期清理已合并的分支
- 使用描述性的分支名称
3. 代码审查
- 所有代码通过 Pull Request 合并
- 至少一人审查后才能合并
- 审查时关注代码质量、测试覆盖、文档
- 及时响应审查意见
4. 提交信息
- 使用清晰、描述性的提交信息
- 遵循团队约定的提交规范
- 在提交信息中引用相关的 Issue 编号
- 必要时在提交信息中说明”为什么”而不仅是”做了什么”
5. 同步策略
- 每天开始工作前拉取最新代码
- 长期功能分支定期合并主分支更新
- 推送前先拉取,避免不必要的合并提交
- 使用
git pull --rebase保持提交历史整洁
6. 保护分支
在代码托管平台设置分支保护规则:
- 禁止直接推送到主分支
- 要求 PR 审查通过才能合并
- 要求 CI/CD 检查通过
- 要求提交信息符合规范
高级技巧
交互式 Rebase
整理提交历史:
# 交互式 rebase 最近 3 次提交
git rebase -i HEAD~3
# 在编辑器中可以:
# pick - 保留提交
# reword - 修改提交信息
# edit - 修改提交内容
# squash - 合并到前一个提交
# fixup - 合并到前一个提交,丢弃提交信息
# drop - 删除提交
Cherry-pick
将特定提交应用到当前分支:
# 应用单个提交
git cherry-pick <commit-hash>
# 应用多个提交
git cherry-pick <commit-hash1> <commit-hash2>
# 应用提交范围
git cherry-pick <start-commit>..<end-commit>
查找问题提交
使用二分查找定位引入 bug 的提交:
# 开始二分查找
git bisect start
# 标记当前版本有问题
git bisect bad
# 标记某个已知正常的版本
git bisect good v1.0.0
# Git 会自动切换到中间的提交
# 测试后标记为 good 或 bad
git bisect good # 或 git bisect bad
# 重复直到找到问题提交
# 结束二分查找
git bisect reset
子模块管理
# 添加子模块
git submodule add https://github.com/user/repo.git path/to/submodule
# 克隆包含子模块的仓库
git clone --recursive https://github.com/user/repo.git
# 初始化和更新子模块
git submodule init
git submodule update
# 更新所有子模块
git submodule update --remote
# 删除子模块
git submodule deinit path/to/submodule
git rm path/to/submodule
常见问题和解决方案
1. 误提交敏感信息
# 从历史中完全删除文件
git filter-branch --force --index-filter \
"git rm --cached --ignore-unmatch path/to/sensitive-file" \
--prune-empty --tag-name-filter cat -- --all
# 或使用 BFG Repo-Cleaner(更快)
bfg --delete-files sensitive-file
git reflog expire --expire=now --all
git gc --prune=now --aggressive
# 强制推送
git push origin --force --all
2. 恢复已删除的分支
# 查看引用日志
git reflog
# 找到分支删除前的提交哈希
# 恢复分支
git checkout -b recovered-branch <commit-hash>
3. 合并大量提交
# 将功能分支的所有提交合并为一个
git checkout main
git merge --squash feature/long-running-feature
git commit -m "feat: implement complete feature X"
4. 修改历史提交的作者信息
# 修改最近一次提交的作者
git commit --amend --author="New Author <email@example.com>"
# 修改历史提交的作者
git rebase -i HEAD~5
# 将要修改的提交标记为 edit
# 然后执行
git commit --amend --author="New Author <email@example.com>"
git rebase --continue
5. 处理大文件
# 使用 Git LFS(Large File Storage)
git lfs install
git lfs track "*.psd"
git add .gitattributes
git add large-file.psd
git commit -m "Add large file with LFS"
实用工具和配置
.gitignore 配置
创建 .gitignore 文件忽略不需要版本控制的文件:
# 依赖目录
node_modules/
vendor/
# 构建输出
dist/
build/
*.o
*.exe
# 环境配置
.env
.env.local
# IDE 配置
.vscode/
.idea/
*.swp
# 日志文件
*.log
logs/
# 操作系统文件
.DS_Store
Thumbs.db
Git Hooks
在 .git/hooks/ 目录下创建钩子脚本:
# pre-commit: 提交前检查
#!/bin/sh
npm run lint
npm run test
# commit-msg: 检查提交信息格式
#!/bin/sh
commit_msg=$(cat $1)
if ! echo "$commit_msg" | grep -qE "^(feat|fix|docs|style|refactor|test|chore)(\(.+\))?: .+"; then
echo "错误: 提交信息不符合规范"
exit 1
fi
推荐工具
- GitKraken / SourceTree:图形化 Git 客户端
- Husky:简化 Git Hooks 配置
- Commitizen:规范化提交信息
- Conventional Changelog:自动生成变更日志
- Git LFS:大文件存储
- lazygit:终端 UI 工具
总结
掌握 Git 工作流是现代软件开发的必备技能。本教程介绍了从基础操作到高级技巧的完整流程:
- 功能分支工作流适合大多数团队的日常开发
- Git Flow 适合有明确发布周期的项目
- 遵循提交规范和代码审查流程可以提高代码质量
- 熟练使用 Git 命令可以高效解决各种版本控制问题
建议根据团队规模和项目特点选择合适的工作流,并在实践中不断优化。记住,工作流是为了提高效率,而不是增加负担。
参考资源
- Pro Git Book - Git 官方文档
- Git Flow - Git Flow 原始文章
- GitHub Flow - GitHub 工作流指南
- Conventional Commits - 约定式提交规范
- Git Cheat Sheet - Git 速查表
内容基于 Git 官方文档和实践经验整理,遵循 Creative Commons Attribution Non Commercial Share Alike 3.0 license。