本文档旨在指导贡献者如何正确地为本仓库贡献代码。遵循本指南可以帮助我们更高效地协作,减少冲突,确保代码质量。无论你是Git初学者还是有经验的开发者,都应按照本文档的指引参与项目开发。
-
Windows:
- 下载地址:https://git-scm.com/download/win
- 按照安装向导完成安装
-
Mac:
- 终端执行:
brew install git - 或下载安装包:https://git-scm.com/download/mac
- 终端执行:
-
Linux:
- Ubuntu/Debian:
sudo apt-get install git - CentOS/Fedora:
sudo yum install git
- Ubuntu/Debian:
打开终端或命令提示符,设置你的用户名和邮箱:
git config --global user.name "你的名字"
git config --global user.email "你的邮箱@example.com"访问 Github官网 注册账号。
- 访问本项目的GitHub页面
- 点击右上角的"Fork"按钮,创建一个自己的仓库副本
git clone https://github.com/你的用户名/项目名.git
cd 项目名git remote add upstream https://github.com/原始组织名/项目名.git在开始任何代码更改前,必须先创建一个Issue:
- 访问项目的Issues页面
- 点击"New issue"按钮
- 选择适当的Issue模板(如果有)
- 填写Issue标题和描述,清晰说明你要解决的问题或实现的功能
- 标记相关标签(Labels)
- 提交Issue等待管理员确认
在开始工作前,确保你的本地仓库是最新的:
git checkout main
git pull upstream main根据你的Issue编号和要开发的功能,创建并切换到新的功能分支:
git checkout -b feature/issue-123-功能描述 main在你的功能分支上进行开发,并定期提交代码:
# 修改代码后...
git add .
git commit -m "feat: 添加了xxx功能 #123"注意:在提交信息中引用Issue编号(如#123),这样GitHub会自动关联提交与Issue。
定期从upstream仓库的main分支获取最新代码,并通过rebase保持分支历史线性:
git checkout main
git pull upstream main
git checkout feature/issue-123-功能描述
git rebase main如果出现冲突,请参考冲突解决部分。
当功能开发完成后,将你的分支推送到你的Fork仓库:
git push origin feature/issue-123-功能描述如果你之前已经推送过分支并且使用了rebase,你需要强制推送:
git push origin feature/issue-123-功能描述 --force注意:使用--force时要谨慎,确保没有其他人在同一分支上工作。
- 访问你Fork的仓库页面
- 点击"Pull requests"标签
- 点击"New pull request"按钮
- 选择base分支为原始仓库的main分支,compare分支为你的功能分支
- 填写PR标题和描述,说明你的变更内容
- 在描述中使用关键词关联Issue,如"Closes #123"或"Fixes #123"
- 点击"Create pull request"
PR描述应包含:
- 变更内容概述
- 关联的Issue编号
- 测试方法或结果
- 其他需要审阅者注意的事项
等待项目维护者进行代码审查。如有修改意见,请在你的分支上继续提交修改,PR会自动更新。
当PR获得批准并被合并后,你可以:
# 切换回main分支
git checkout main
# 更新本地main
git pull upstream main
# 删除本地功能分支
git branch -d feature/issue-123-功能描述
# 更新你的fork仓库
git push origin main
# 删除远程功能分支
git push origin --delete feature/issue-123-功能描述我们采用基于功能分支(Feature Branch)的Git工作流:
- main: 主分支,保存正式发布的历史
- feature/issue-xxx-描述: 功能分支,用于开发新功能
- bugfix/issue-xxx-描述: 修复bug的分支
- docs/issue-xxx-描述: 文档相关的修改
- hotfix/issue-xxx-描述: 紧急修复生产环境问题的分支
我们遵循最小化原则进行开发:
- 每个分支只做一件事,即解决一个具体的Issue
- 避免在一个分支中混合多种不相关的修改
- 分支内容应该尽可能小,便于审查和测试
- 如果一个功能较大,应在Issues中拆分为多个小功能点,分别创建分支开发
通过遵循最小化原则,可以:
- 减少代码冲突的可能性
- 简化代码审查过程
- 提高问题定位的效率
- 保持提交历史的清晰
我们使用约定式提交规范来确保提交信息的一致性。
<类型>[可选的作用域]: <描述> #Issue编号
[可选的正文]
[可选的脚注]
- feat: 新功能
- fix: 修复Bug
- docs: 文档变更
- style: 代码格式调整,不影响代码含义的变更
- refactor: 代码重构,既不是新增功能,也不是修补bug的代码变动
- perf: 性能优化
- test: 添加或修改测试代码
- chore: 构建过程或辅助工具的变动
feat(user): 添加用户登录功能 #123
实现了基于JWT的认证系统和用户登录表单。
Closes #123
- 在PR中@提及相关人员或等待维护者指派Reviewer
- 等待反馈
- CI/CD检查需要通过
- 检查代码逻辑是否正确
- 确认代码风格是否符合项目规范
- 测试功能是否正常工作
- 提出建设性的改进意见
- 针对Review意见在PR评论中回应
- 进行必要的代码修改
- 推送新的修改到你的功能分支
- PR会自动更新
当满足以下条件时,PR可以被合并:
- 至少一名项目维护者批准
- 所有讨论都已解决
- CI/CD检查通过
- 代码符合项目质量标准
当你的分支与main分支有冲突时,需要手动解决:
git checkout main
git pull upstream main
git checkout feature/issue-123-功能描述
git rebase main-
当rebase过程中出现冲突时,Git会暂停并提示你解决冲突
-
打开有冲突的文件,找到被标记的冲突区域:
<<<<<<< HEAD (当前更改) main分支上的代码 ======= 你的代码 >>>>>>> feature/issue-123-功能描述 (传入的更改) -
编辑文件解决冲突,删除冲突标记
-
保存文件
-
标记为已解决
git add 已解决冲突的文件
-
继续rebase过程
git rebase --continue
-
完成后推送到远程
git push origin feature/issue-123-功能描述 --force
注意:使用
--force要谨慎,只在你确定没有其他人在同一分支工作时使用。
如果你想撤销最后一次提交:
git reset --soft HEAD~1当你需要切换分支但不想提交当前工作时:
git stash save "工作描述"
# 切换分支后,恢复工作
git stash popgit log --graph --oneline --allgit bisect start
git bisect bad # 当前版本有bug
git bisect good 版本号 # 指定一个没有bug的旧版本
# Git会自动检出中间版本,你测试后标记:
git bisect good # 或 git bisect bad
# 重复直到找出第一个有bug的提交
git bisect reset # 完成后重置git fetch origin
git reset --hard origin/branch名称git fetch --prune当你在功能分支上有多个小提交,提交PR前想将它们合并为一个或几个有意义的提交时,可以使用交互式rebase:
# n是你要合并的提交数量
git rebase -i HEAD~n例如,压缩最近的5个提交:
git rebase -i HEAD~5执行后会打开一个编辑器,显示类似下面的内容:
pick 1a2b3c4 第一个提交信息
pick 5d6e7f8 第二个提交信息
pick 9g0h1i2 第三个提交信息
pick 3j4k5l6 第四个提交信息
pick 7m8n9o0 第五个提交信息
# 命令:
# p, pick <commit> = 使用提交
# r, reword <commit> = 使用提交,但修改提交信息
# e, edit <commit> = 使用提交,但停下来修改
# s, squash <commit> = 使用提交,但融合到前一个提交
# f, fixup <commit> = 类似squash,但丢弃提交信息
# x, exec <command> = 使用shell运行命令
# b, break = 在这里停下来
# d, drop <commit> = 删除提交
- 保留第一个提交为
pick - 对于想要合并的后续提交,将
pick改为squash(或s)或fixup(或f)squash: 合并提交并保留提交信息fixup: 合并提交但丢弃提交信息
例如,将5个提交压缩成一个:
pick 1a2b3c4 第一个提交信息
s 5d6e7f8 第二个提交信息
s 9g0h1i2 第三个提交信息
s 3j4k5l6 第四个提交信息
s 7m8n9o0 第五个提交信息
- 保存并关闭编辑器
- 如果使用了
squash,Git会打开另一个编辑器让你编辑合并后的提交信息 - 编辑、保存并关闭提交信息编辑器
假设你在开发新功能时有以下提交:
aac23f4 feat: 添加用户登录表单
b56d2e7 feat: 添加表单验证
c789f01 fix: 修复表单样式问题
d890e23 chore: 调整代码格式
ef01g23 docs: 添加注释
你希望将它们合并为一个完整的功能提交:
git rebase -i HEAD~5在编辑器中修改为:
pick aac23f4 feat: 添加用户登录表单
s b56d2e7 feat: 添加表单验证
s c789f01 fix: 修复表单样式问题
s d890e23 chore: 调整代码格式
s ef01g23 docs: 添加注释
保存后,在新的编辑器中编写合并后的提交信息:
feat: 实现完整的用户登录功能
- 添加用户登录表单
- 实现表单验证
- 修复表单样式问题
- 优化代码格式和文档
- 仅对尚未推送到远程的提交执行此操作。如果已推送,需要使用
git push --force,这可能影响其他人的工作。 - 交互式rebase会改写提交历史,确保你了解其影响。
- 如果rebase过程中出现冲突,解决冲突后使用
git add .标记已解决,然后执行git rebase --continue继续。 - 如果想要取消rebase操作,可以执行
git rebase --abort。
通过适当地压缩提交,你可以在保持功能完整性的同时,使提交历史更加清晰和有条理,便于团队成员理解你的开发过程。
遵循本文档中的贡献流程和规范,特别是"先提Issue,再提PR"的原则,可以帮助我们高效协作,减少冲突,保持代码库的整洁和可维护性。如果你对贡献流程有任何疑问或建议,请在Issues中提出。
感谢你对本项目的贡献!