准备工作:明确权限与选择分支策略
团队协作前,先确认两件事:一是你有目标仓库的访问权限——如果是组织仓库,需要管理员分配「Write」及以上权限;如果是公开仓库,通过Fork获取个人副本即可。二是选对分支策略,直接影响协作效率:

分支策略 | 核心分支 | 适用场景 |
---|---|---|
GitHub Flow | main(生产)、feature(开发) | 快速迭代的小团队/初创项目 |
Git Flow | main(发布)、develop(开发)、feature(功能)、release(预发布)、hotfix(热修复) | 版本周期长的大项目 |
小团队建议用GitHub Flow——main分支保持可部署状态,所有开发都在feature分支完成,简单高效。
第一步:Fork仓库并克隆到本地
- Fork仓库:打开目标仓库页面,点击右上角「Fork」,将仓库复制到你的GitHub账号下(仅公开或有权限的私有仓库可用);
- 克隆到本地:复制fork后的仓库URL,在终端执行:
git clone https://github.com/你的用户名/目标仓库名.git cd 目标仓库名
- 添加上游仓库:为了同步原仓库的最新代码,执行:
git remote add upstream https://github.com/原仓库所有者/目标仓库名.git
验证远程仓库:
git remote -v
,会看到origin
(你的fork)和upstream
(原仓库)。
第二步:创建并切换开发分支
永远不要直接修改main分支!正确做法是创建 feature分支(或bugfix分支),命名要清晰:
# 创建并切换到feature分支(格式:feature/功能名 或 bugfix/问题号)
git checkout -b feature/login-validation
比如feature/payment-gateway
(开发支付功能)、bugfix/issue-45
(修复问题45),避免feature/test
这种模糊命名。
第三步:修改代码与本地提交
修改代码后,用Conventional Commits规范提交——能让提交信息更统一,格式为类型(范围): 描述
:
# 添加所有修改的文件
git add .
# 提交(示例:feat表示新功能,login是范围,描述清晰)
git commit -m "feat(login): 添加用户名和密码的非空验证"
常见类型:
– feat
:新功能;fix
:修复bug;docs
:文档修改;style
:代码风格调整;refactor
:重构代码。
第四步:同步上游并推送分支
推送前一定要同步原仓库的最新代码,避免PR冲突:
# 拉取原仓库的最新更新
git fetch upstream
# 合并到你的feature分支
git merge upstream/main
无冲突则推送分支到fork仓库:
# 第一次推送需绑定本地与远程分支
git push -u origin feature/login-validation
# 后续推送直接用
git push
第五步:发起Pull Request(PR)
- 打开fork仓库页面,点击「Pull Request」→「New Pull Request」;
- 选择原仓库的main分支作为
base
,你的feature分支作为compare
; - 填写PR信息(直接影响评审效率!):
- 标题:用Conventional Commits,比如“feat(login): 添加登录表单验证”;
- 描述:用模板说清“做了什么+解决的问题+测试情况”,示例:
## 功能说明 添加登录页面的表单验证,解决#123(登录时未验证空输入)问题。 ## 修改内容 1. src/login.js:新增validateForm函数,验证username和password的非空性; 2. tests/login.test.js:添加3个单元测试(空输入、无效邮箱、短密码); 3. README.md:更新登录功能的使用说明。 ## 测试情况 - 手动测试:覆盖所有验证场景,提示正确; - 自动化测试:单元测试通过率100%; - 无影响:未修改其他页面代码。
- 关联问题:用
#问题号
绑定GitHub Issues,比如解决#123
,问题会自动关闭。
第六步:PR评审与修改
PR发起后,团队会评审,常见操作:
– 评审者:可评论(“这里的正则能覆盖所有邮箱格式吗?”)、请求修改(“请添加密码强度验证”)或批准(“LGTM!”——Looks Good To Me);
– 作者:修改后直接push,PR会自动更新,无需重新发起。比如评审要求加密码强度验证,修改后执行:
git add src/login.js
git commit -m "feat(login): 添加密码强度验证(至少8位,含字母和数字)"
git push
第七步:解决PR冲突
如果同步上游后出现冲突(比如原仓库修改了同一个文件),需手动解决:
1. 切换到feature分支:git checkout feature/login-validation
;
2. 拉取上游最新代码:git fetch upstream
;
3. 合并到feature分支:git merge upstream/main
;
4. 打开冲突文件(比如src/login.js
),修改冲突部分:
// 冲突标记:<<<<<<< HEAD是你的代码,=======是原仓库代码,>>>>>>> upstream/main
<<<<<<< HEAD
function validateForm() {
return username !== '' && password !== '';
}
=======
function validateForm() {
return username.match(/^[a-zA-Z0-9]+@[a-zA-Z0-9]+.[a-zA-Z0-9]+$/) && password.length >= 8;
}
>>>>>>> upstream/main
5. 提交并推送:
git add src/login.js
git commit -m "fix: 解决与main分支的冲突"
git push
第八步:合并PR与清理分支
PR获得批准且无冲突后,维护者可合并:
1. 点击「Merge Pull Request」,选择合并方式:
– Create a merge commit:保留所有提交记录(适合大功能);
– Squash and merge:压缩成1条记录(适合小修改);
– Rebase and merge:保持线性历史(适合整洁的提交记录);
2. 合并后,删除远程feature分支(GitHub会提示「Delete branch」);
3. 本地清理:
# 切换回main分支
git checkout main
# 删除本地feature分支
git branch -d feature/login-validation
# 同步原仓库的最新合并
git pull upstream main
PR协作的实用技巧
- 评审效率:评审者重点看「功能正确性」「代码可读性」「性能影响」,比如“这个循环的时间复杂度是O(n²),有没有优化空间?”;
- PR描述:避免“随便改了点”,用模板让评审者快速get重点;
- 冲突预防:每天开工前同步上游代码(
git fetch upstream && git merge upstream/main
); - 分支清理:合并后的feature分支要及时删除,避免分支太多混乱。
原创文章,作者:,如若转载,请注明出处:https://zube.cn/archives/295