Git 上库流程培训文档
1. 前言
本培训文档旨在帮助团队成员掌握标准的Git工作流程,确保代码开发过程的规范性和高效性。通过遵循这些最佳实践,我们可以提高协作效率,减少冲突,并保证代码质量。
2. Git 工作流基础概念
2.1 分支策略
- main/master: 主分支,用于生产环境的稳定代码
- develop: 开发主分支,集成所有功能分支的代码
- feature/ : 功能开发分支,命名格式如
feature/user-authentication - hotfix/: 紧急修复分支,用于快速修复生产问题
- release/: 发布准备分支,用于版本发布前的测试
2.2 提交信息规范
- 使用英文描述,格式:
type(scope): description - 类型包括:feat(新功能)、fix(修复)、docs(文档)、style(格式)、refactor(重构)、test(测试)、chore(构建工具)
- 示例:
feat(auth): add login validation logic
3. 标准操作流程
3.1 初始化配置
bash
# 全局配置
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"
git config --global core.autocrlf input # Linux/Mac
git config --global pull.rebase true # 保持提交历史整洁
3.2 开始新功能开发
bash
# 从develop分支拉取最新代码
git checkout develop
git pull origin develop
# 创建功能分支
git checkout -b feature/new-feature-name
# 开始编码...
3.3 日常开发流程
bash
# 阶段化提交
git add .
git commit -m "feat(module): add new feature description"
# 推送本地分支
git push origin feature/new-feature-name
3.4 合并到主分支
bash
# 在功能开发完成后,同步develop分支
git checkout develop
git pull origin develop
# 切换到功能分支,rebase主分支
git checkout feature/new-feature-name
git rebase develop
# 解决可能的冲突后,推送更新
git push origin feature/new-feature-name --force-with-lease
# 在代码审查通过后,合并到develop
git checkout develop
git merge --no-ff feature/new-feature-name
git push origin develop
# 删除已合并的分支
git branch -d feature/new-feature-name
git push origin --delete feature/new-feature-name
4. 代码审查流程
4.1 Pull Request 创建
- 在Git平台上创建Pull Request
- 设置审查者(Reviewer)
- 填写PR描述,说明变更内容和影响
- 关联相关Issue(如果有)
4.2 代码审查要点
- 代码是否符合项目规范
- 是否有适当的单元测试
- 是否有潜在的安全问题
- 性能是否有影响
- 文档是否更新
5. 冲突解决
5.1 识别冲突
bash
# 尝试合并时出现冲突
git merge develop
# Auto-merging file.c
# CONFLICT (content): Merge conflict in file.c
5.2 解决冲突步骤
- 打开冲突文件
- 查找冲突标记
<<<<<<<,=======,>>>>>>> - 编辑保留正确的代码
- 移除冲突标记
- 添加已解决的文件
bash
git add conflicted-file.c
git commit -m "resolve: merge conflicts in file.c"
6. 最佳实践
6.1 提交原则
- 原子提交:每次提交应该只包含一个逻辑变更
- 频繁提交:经常保存工作进度
- 清晰描述:提交信息要准确描述变更内容
- 测试先行:提交前确保代码可运行
6.2 分支管理
- 保持功能分支简短,避免长期存在的大分支
- 及时同步主分支的更新
- 完成后及时删除已合并的分支
- 避免在非自己负责的分支上直接提交
6.3 回滚操作
bash
# 撤销未提交的更改
git checkout -- filename
git clean -f # 清理新增文件
# 撤销已提交的更改
git revert commit-hash # 创建反向提交
git reset --hard HEAD~1 # 丢弃最近一次提交(谨慎使用)
7. 常见问题及解决方案
7.1 问题1:忘记切换分支就开始编码
解决方案:
bash
# 将当前更改暂存
git stash
# 切换到正确分支
git checkout feature/correct-branch
# 恢复更改
git stash pop
7.2 问题2:提交到了错误的分支
解决方案:
bash
# 将最近的提交移动到其他分支
git checkout correct-branch
git cherry-pick commit-hash
git checkout wrong-branch
git reset --hard HEAD~1
7.3 问题3:远程仓库与本地不同步
解决方案:
bash
# 强制同步远程状态(仅在必要时使用)
git fetch origin
git reset --hard origin/branch-name
8. 工具推荐
8.1 GUI工具
- SourceTree: 免费的Git客户端,适合初学者
- GitKraken: 功能丰富的图形化Git工具
- VS Code Git: 集成在编辑器中的Git功能
8.2 命令行增强
- Oh My Zsh 的Git插件
- git alias 自定义命令别名
9. 附录
9.1 常用Git命令速查表
| 操作 | 命令 |
|---|---|
| 查看状态 | git status |
| 查看差异 | git diff |
| 查看日志 | git log --oneline |
| 查看分支 | git branch -a |
| 切换分支 | git checkout branch-name |
| 创建分支 | git checkout -b branch-name |
| 推送分支 | git push origin branch-name |
| 拉取更新 | git pull origin branch-name |
9.2 Git Submodule 子模块操作
9.2.1 添加子模块
bash
# 添加远程仓库作为子模块
git submodule add https://github.com/user/repo.git path/to/submodule
# 添加特定分支的子模块
git submodule add -b branch-name https://github.com/user/repo.git path/to/submodule
9.2.2 克隆包含子模块的仓库
bash
# 方法1:克隆后初始化子模块
git clone https://github.com/user/main-repo.git
cd main-repo
git submodule init
git submodule update
# 方法2:克隆时递归获取子模块
git clone --recursive https://github.com/user/main-repo.git
# 方法3:深度克隆(浅克隆)
git clone --recursive --depth=1 https://github.com/user/main-repo.git
9.2.3 更新子模块
bash
# 更新所有子模块到最新提交
git submodule update --remote
# 更新指定子模块
git submodule update --remote path/to/submodule
# 更新子模块到特定提交
cd path/to/submodule
git checkout specific-commit-hash
cd ../.. # 返回主项目目录
git add path/to/submodule
git commit -m "update submodule to specific commit"
9.2.4 同步子模块URL
bash
# 当子模块URL发生变化时同步
git submodule sync
# 同步特定子模块
git submodule sync path/to/submodule
9.2.5 删除子模块
bash
# 从工作区删除子模块
git submodule deinit -f path/to/submodule
rm -rf .git/modules/path/to/submodule
git rm -f path/to/submodule
9.2.6 子模块工作流程
bash
# 进入子模块进行开发
cd path/to/submodule
# 在子模块中创建特性分支
git checkout -b feature/new-feature
# 进行开发并提交
git add .
git commit -m "feat: add new functionality"
# 推送到远程
git push origin feature/new-feature
# 返回主项目
cd ..
# 更新主项目中的子模块引用
git add path/to/submodule
git commit -m "update submodule reference"
git push origin branch-name
9.2.7 子模块常见问题
-
问题:子模块显示为"modified"
-
解决方案:子模块指向了不同的提交,需要决定是要更新到新提交还是切换回原提交
-
问题:克隆后子模块目录为空
-
解决方案 :运行
git submodule update --init或git clone --recursive
9.3 Git Hooks 示例
创建预提交钩子确保代码质量:
bash
#!/bin/sh
# .git/hooks/pre-commit
# 运行代码检查
npm run lint
if [ $? -ne 0 ]; then
echo "代码检查失败,请修复后再提交"
exit 1
fi
# 运行测试
npm run test
if [ $? -ne 0 ]; then
echo "测试失败,请修复后再提交"
exit 1
fi
10. 总结
良好的Git工作流程是团队协作的基础。通过遵循本文档中的规范和最佳实践,可以显著提高开发效率,减少冲突,保证代码质量。记住,Git是一个强大的工具,正确使用它能够极大地提升团队的协作能力。
本文档持续更新中,如有建议请联系管理员。