Git 完全指南:从基础到企业级协同开发
目录
Git 基础概念
什么是 Git
Git 是一个分布式版本控制系统,由 Linus Torvalds 在 2005 年创建,用于管理 Linux 内核开发。
Git 工作区域
工作区 (Working Directory) ←→ 暂存区 (Staging Area) ←→ 本地仓库 (Local Repository) ←→ 远程仓库 (Remote Repository)
- 工作区: 实际编辑文件的地方
- 暂存区: 临时存储准备提交的更改
- 本地仓库: 本地版本历史
- 远程仓库: 团队共享的中央仓库
基础命令
初始化与配置
# 初始化 Git 仓库
git init
# 配置用户信息
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"
# 查看配置
git config --list
# 克隆远程仓库
git clone <repository-url>
git clone <repository-url> <directory-name>
基本操作
# 查看状态
git status
# 添加文件到暂存区
git add <filename> # 添加指定文件
git add . # 添加所有更改
git add *.js # 添加所有 .js 文件
# 提交更改
git commit -m "commit message"
git commit -am "message" # 跳过暂存区,直接提交已跟踪文件的更改
# 查看提交历史
git log # 查看完整历史
git log --oneline # 查看简洁历史
git log --graph # 查看图形化历史
git log -p # 查看详细差异
# 查看文件差异
git diff # 工作区与暂存区的差异
git diff --staged # 暂存区与最后一次提交的差异
git diff HEAD # 工作区与最后一次提交的差异
撤销操作
# 撤销工作区的更改
git checkout -- <filename>
git restore <filename> # Git 2.23+ 新命令
# 撤销暂存区的更改
git reset HEAD <filename>
git restore --staged <filename>
git reset HEAD #撤销暂存区的所有更改
git reset --hard HEAD #放弃暂存区和工作区的所有修改,但新增的文件不会放弃
git clean -fd #放弃工作区的新增文件
# 撤销最后一次提交
git reset --soft HEAD~1 # 保留更改在暂存区
git reset --mixed HEAD~1 # 保留更改在工作区(默认)
git reset --hard HEAD~1 # 完全删除更改
# 修改最后一次提交
git commit --amend
分支管理详解
分支基础概念
分支是 Git 的核心特性,允许在不影响主分支的情况下进行开发。
# 查看分支
git branch # 查看本地分支
git branch -r # 查看远程分支
git branch -a # 查看所有分支
# 创建分支
git branch <branch-name> # 创建分支但不切换
git checkout -b <branch-name> # 创建并切换到新分支
git switch -c <branch-name> # Git 2.23+ 新命令
# 切换分支
git checkout <branch-name> # 切换到已存在的本地分支
git checkout -b <branch-name> # 创建并切换到新分支
git switch <branch-name> # Git 2.23+ 新命令,切换到已存在的本地分支
git switch -c <branch-name> # Git 2.23+ 新命令,创建并切换到新分支
# 注意:如果本地分支不存在,但远程存在同名分支,可以使用:
git checkout -b <branch-name> origin/<branch-name> # 创建本地分支并跟踪远程分支
git switch -c <branch-name> origin/<branch-name> # Git 2.23+ 新命令
# 删除分支
git branch -d <branch-name> # 安全删除(已合并)
git branch -D <branch-name> # 强制删除(未合并)
# 保留未commit的代码(当我想切换分支但又不想commit代码时)
git stash #不能将新建的文件放入stash,会将其放入暂存区,需要再执行一次git stash
git stash -u #将修改的和新建立的文件全部放入stash里面
git stash pop #将暂存区里面的文件释放
# 重命名分支
git branch -m <old-name> <new-name>
分支策略
1. Git Flow 分支模型
main (master) ←─── hotfix/xxx
↑ ↑
develop ←─── release/xxx
↑ ↑
feature/xxx ←─── feature/xxx
2. GitHub Flow 分支模型
main
↑
feature/xxx
3. GitLab Flow 分支模型
main
↑
pre-production
↑
production
分支操作详解
# 合并分支
git merge <branch-name> # 将指定分支合并到当前分支
git merge --no-ff <branch-name> # 禁用快进合并
# 变基操作
git rebase <branch-name> # 将当前分支变基到指定分支
git rebase -i HEAD~3 # 交互式变基,修改最近3次提交
# 解决冲突
# 1. 合并时出现冲突
git status # 查看冲突文件
# 2. 手动编辑冲突文件
# 3. 解决冲突后
git add <resolved-files> # 添加已解决的文件
git commit # 完成合并
# 查看分支关系
git log --graph --oneline --all
git show-branch
协同开发流程
远程仓库操作
# 添加远程仓库
git remote add origin <repository-url>
# 查看远程仓库
git remote -v
# 推送分支
git push origin <branch-name>
git push -u origin <branch-name> # 设置上游分支
# 拉取更新
git pull origin <branch-name> # 拉取并合并
git fetch origin # 只拉取不合并
# 删除远程分支
git push origin --delete <branch-name>
团队协作流程
1. 基本协作流程
# 1. 获取最新代码
git fetch origin
git pull origin main
# 2. 创建功能分支
git checkout -b feature/new-feature
# 3. 开发并提交
git add .
git commit -m "feat: add new feature"
# 4. 推送分支
git push origin feature/new-feature
# 5. 创建 Pull Request / Merge Request
# 在 GitHub/GitLab 上操作
# 6. 代码审查通过后合并
# 在 GitHub/GitLab 上操作
# 7. 删除本地分支
git checkout main
git pull origin main
git branch -d feature/new-feature
2. 代码审查流程
# 1. 创建 Pull Request
# 2. 团队成员审查代码
# 3. 提出修改建议
# 4. 开发者修改代码
git add .
git commit -m "fix: address review comments"
git push origin feature/new-feature
# 5. 审查通过,合并到主分支
标签管理
# 创建标签
git tag <tag-name> # 轻量标签
git tag -a <tag-name> -m "message" # 附注标签
# 推送标签
git push origin <tag-name>
git push origin --tags # 推送所有标签
# 删除标签
git tag -d <tag-name> # 删除本地标签
git push origin --delete <tag-name> # 删除远程标签
企业级开发流程示例
阿里巴巴前端团队 Git 工作流程
项目初始化阶段
# 1. 克隆项目
git clone https://github.com/alibaba/ant-design.git
cd ant-design
# 2. 查看项目结构
git branch -a
# 输出:
# * main
# remotes/origin/main
# remotes/origin/develop
# remotes/origin/feature/xxx
# 3. 切换到开发分支
git checkout develop
git pull origin develop
日常开发流程
# 1. 每日开始工作前,同步最新代码
git fetch origin
git checkout develop
git pull origin develop
# 2. 创建功能分支(遵循命名规范)
git checkout -b feature/button-component-20241201
# 或者
git checkout -b bugfix/login-validation-20241201
git checkout -b hotfix/critical-security-fix-20241201
# 3. 开发过程中,定期提交代码
git add .
git commit -m "feat(Button): add new variant styles
- Add outline variant
- Add ghost variant
- Update documentation
- Add unit tests
Closes #1234"
# 4. 推送分支到远程
git push origin feature/button-component-20241201
代码审查流程
# 1. 在 GitLab 上创建 Merge Request
# 标题:feat(Button): add new variant styles
# 描述:详细描述功能变更
# 2. 代码审查阶段
# 团队成员提出修改建议
# 3. 根据反馈修改代码
git add .
git commit -m "fix(Button): address review comments
- Remove unused imports
- Fix typo in documentation
- Improve test coverage
Addresses #1234"
# 4. 推送修改
git push origin feature/button-component-20241201
# 5. 审查通过后,在 GitLab 上合并
发布流程
# 1. 合并到 develop 分支后,创建发布分支
git checkout develop
git pull origin develop
git checkout -b release/v4.25.0
# 2. 版本号更新
# 修改 package.json 中的版本号
# 更新 CHANGELOG.md
# 3. 提交版本更新
git add .
git commit -m "chore(release): prepare v4.25.0
- Update version to 4.25.0
- Update CHANGELOG.md
- Update dependencies"
# 4. 推送发布分支
git push origin release/v4.25.0
# 5. 创建 Merge Request 到 main 分支
# 6. 合并后,创建标签
git checkout main
git pull origin main
git tag -a v4.25.0 -m "Release v4.25.0"
git push origin v4.25.0
# 7. 删除发布分支
git branch -d release/v4.25.0
git push origin --delete release/v4.25.0
热修复流程
# 1. 发现生产环境 bug,创建热修复分支
git checkout main
git pull origin main
git checkout -b hotfix/critical-bug-20241201
# 2. 修复 bug
# 编辑相关文件
# 3. 提交修复
git add .
git commit -m "fix: critical security vulnerability
- Fix XSS vulnerability in user input
- Add input sanitization
- Update security tests
Fixes #5678"
# 4. 推送热修复分支
git push origin hotfix/critical-bug-20241201
# 5. 创建紧急 Merge Request
# 6. 快速审查和合并
# 7. 创建补丁版本标签
git checkout main
git pull origin main
git tag -a v4.25.1 -m "Hotfix v4.25.1 - Security fix"
git push origin v4.25.1
分支命名规范
# 功能分支
feature/user-authentication
feature/payment-integration
feature/admin-dashboard
# 修复分支
bugfix/login-validation
bugfix/performance-issue
bugfix/mobile-responsive
# 热修复分支
hotfix/security-vulnerability
hotfix/critical-bug
hotfix/urgent-fix
# 发布分支
release/v1.2.0
release/v2.0.0-beta
release/v3.1.0-rc
# 实验分支
experiment/new-architecture
experiment/performance-optimization
提交信息规范
# 格式:type(scope): subject
# 类型:
# feat: 新功能
# fix: 修复 bug
# docs: 文档更新
# style: 代码格式调整
# refactor: 代码重构
# test: 测试相关
# chore: 构建过程或辅助工具的变动
# 示例:
git commit -m "feat(Button): add loading state and disabled styles"
git commit -m "fix(Form): resolve validation error on submit"
git commit -m "docs(README): update installation instructions"
git commit -m "style(Button): adjust padding and margin values"
git commit -m "refactor(utils): extract common validation logic"
git commit -m "test(Button): add unit tests for new variants"
git commit -m "chore(deps): update dependencies to latest versions"
常见问题与解决方案
1. 合并冲突解决
# 查看冲突文件
git status
# 手动编辑冲突文件,解决冲突标记
# <<<<<<< HEAD
# 当前分支内容
# =======
# 要合并的分支内容
# >>>>>>> feature/branch
# 解决冲突后
git add <resolved-files>
git commit -m "resolve merge conflicts"
2. 撤销错误提交
# 撤销最后一次提交但保留更改
git reset --soft HEAD~1
# 撤销最后一次提交并删除更改
git reset --hard HEAD~1
# 创建新的提交来撤销之前的提交
git revert <commit-hash>
3. 找回丢失的提交
# 查看操作历史
git reflog
# 回到指定操作
git reset --hard HEAD@{n}
4. 清理工作区
# 清理未跟踪的文件
git clean -f
# 清理未跟踪的文件和目录
git clean -fd
# 预览将要清理的文件
git clean -n
5. 分支同步问题
# 同步远程分支信息
git fetch --prune
# 删除本地已不存在的远程分支引用
git remote prune origin
# 强制更新本地分支
git reset --hard origin/main
最佳实践总结
1. 分支管理
- 使用清晰的分支命名规范
- 及时删除已合并的分支
- 保持主分支的稳定性
2. 提交规范
- 编写清晰的提交信息
- 遵循团队约定的提交格式
- 每次提交只做一件事
3. 协作流程
- 定期同步远程代码
- 及时处理代码审查反馈
- 使用 Pull Request/Merge Request 进行代码审查
4. 版本发布
- 使用语义化版本号
- 创建详细的发布说明
- 及时处理热修复问题
5. 安全考虑
- 不要在提交中包含敏感信息
- 定期更新依赖包
- 及时修复安全漏洞
通过遵循这些最佳实践,团队可以建立高效、稳定的 Git 工作流程,提高开发效率和代码质量。