1. Fork 仓库初始设置
1.1 在 GitHub 上 Fork 仓库
- 访问目标仓库页面
- 点击右上角的 "Fork" 按钮
- 选择你的账户作为目标位置
1.2 克隆分叉仓库到本地
bash
# 克隆你的分叉仓库(使用 SSH 推荐)
git clone git@github.com:你的用户名/项目名.git
# 进入项目目录
cd 项目名
1.3 添加上游仓库
bash
# 添加上游原始仓库
git remote add upstream git@github.com:原始仓库/项目名.git
# 验证远程仓库配置
git remote -v
# 应该显示:
# origin git@github.com:你的用户名/项目名.git (fetch)
# origin git@github.com:你的用户名/项目名.git (push)
# upstream git@github.com:原始仓库/项目名.git (fetch)
# upstream git@github.com:原始仓库/项目名.git (push)
2. 开发工作流程
2.1 同步最新代码
在开始新功能开发前,确保本地代码是最新的:
bash
# 切换到主分支
git checkout main
# 方法一:使用 git pull upstream main(推荐,更简洁)
git pull upstream main
# 方法二:使用 fetch + merge(效果相同)
git fetch upstream
git merge upstream/main
# 推送到你的分叉仓库
git push origin main
git pull upstream main 说明:
- 这个命令相当于
git fetch upstream+git merge upstream/main的组合 - 从上游仓库的 main 分支拉取最新更改并合并到当前分支
- 更简洁,一步完成同步操作
2.2 创建功能分支
永远不要在 main 分支直接开发!
bash
# 创建并切换到新功能分支
git checkout -b feature/你的功能名称
# 或者创建修复分支
git checkout -b fix/问题描述
分支命名规范:
feature/功能描述- 新功能开发fix/问题描述- bug 修复docs/文档更新- 文档修改test/测试相关- 测试代码
2.3 进行开发工作
bash
# 编写代码,进行修改...
# 添加更改到暂存区
git add .
# 提交更改
git commit -m "feat: 添加新功能描述
- 详细描述更改内容
- 修复了某某问题
- 优化了某某性能"
# 或者分多次提交
git add 文件1.js 文件2.js
git commit -m "feat: 添加核心功能"
git add 文档.md
git commit -m "docs: 更新使用文档"
提交信息规范:
feat:- 新功能fix:- bug 修复docs:- 文档更新style:- 代码格式调整refactor:- 重构代码test:- 测试相关chore:- 构建过程或辅助工具变动
2.4 推送到分叉仓库
bash
# 首次推送需要设置上游分支
git push -u origin feature/你的功能名称
# 后续推送只需
git push
3. 同步更新流程
3.1 定期同步上游更改
在开发过程中,定期同步避免冲突:
bash
# 保存当前工作(如果有未提交的更改)
git stash
# 切换到主分支获取更新
git checkout main
# 使用 git pull upstream main 同步主分支
git pull upstream main
# 推送到你的分叉仓库
git push origin main
# 切换回功能分支
git checkout feature/你的功能名称
# 合并主分支更新到功能分支
git merge main
# 恢复暂存的工作(如果有)
git stash pop
3.2 在功能分支直接同步上游更改
bash
# 在功能分支上直接同步上游(推荐)
git checkout feature/你的功能名称
# 直接拉取上游最新更改到当前功能分支
git pull upstream main
# 或者使用 rebase 方式
git pull --rebase upstream main
# 推送到分叉仓库(rebase 后需要强制推送)
git push origin feature/你的功能名称 --force-with-lease
3.3 使用 rebase 保持整洁历史(可选)
bash
# 在功能分支上
git fetch upstream
git rebase upstream/main
# 如果遇到冲突,解决后继续
git add .
git rebase --continue
# 强制推送到分叉仓库(因为历史被重写了)
git push origin feature/你的功能名称 --force-with-lease
4. 创建 Pull Request
4.1 在 GitHub 上创建 PR
- 访问你的分叉仓库页面
- 点击 "Pull requests" → "New pull request"
- 选择正确的分支:
- base repository: 原始仓库/main
- head repository: 你的仓库/feature/你的功能名称
- 填写 PR 标题和描述
- 点击 "Create pull request"
4.2 PR 描述模板
markdown
## 变更描述
简要描述这个 PR 做了什么更改
## 相关 Issue
修复 #Issue编号 或 关联 #Issue编号
## 变更类型
- [ ] Bug 修复
- [ ] 新功能
- [ ] 代码重构
- [ ] 文档更新
- [ ] 其他(请描述)
## 检查清单
- [ ] 代码遵循项目规范
- [ ] 已添加/更新测试用例
- [ ] 所有测试通过
- [ ] 已更新相关文档
- [ ] 代码已自我审查
## 测试结果
描述如何测试这些更改
## 截图(如适用)
5. PR 审查和更新
5.1 根据反馈更新代码
bash
# 在功能分支上继续开发
git checkout feature/你的功能名称
# 进行要求的修改
git add .
git commit -m "fix: 根据审查反馈修复问题"
# 推送到分叉仓库(PR 会自动更新)
git push origin feature/你的功能名称
5.2 合并上游最新更改
如果 PR 期间上游有更新:
bash
git checkout feature/你的功能名称
# 使用 git pull upstream main 同步最新更改
git pull upstream main
# 解决可能的冲突
# git add .
# git commit -m "merge: 同步上游更新"
git push origin feature/你的功能名称
6. PR 合并后的清理
6.1 删除远程分支
bash
# 在 GitHub 上合并 PR 后,删除远程功能分支
git push origin --delete feature/你的功能名称
6.2 更新本地仓库
bash
# 切换到主分支
git checkout main
# 使用 git pull upstream main 获取最新更改(包括合并的 PR)
git pull upstream main
# 推送到你的分叉仓库
git push origin main
# 删除本地功能分支
git branch -d feature/你的功能名称
# 清理已删除的远程分支跟踪
git fetch --prune
7. 实用脚本和别名
7.1 同步分叉仓库脚本
创建 sync-fork.sh:
bash
#!/bin/bash
echo "开始同步分叉仓库..."
# 保存当前分支
current_branch=$(git branch --show-current)
# 切换到主分支并使用 git pull upstream main 同步
git checkout main
echo "同步主分支..."
git pull upstream main
git push origin main
# 如果有未完成的特性分支,也同步一下
if [ "$current_branch" != "main" ]; then
echo "更新特性分支 $current_branch..."
git checkout "$current_branch"
git pull upstream main
git push origin "$current_branch"
else
git checkout "$current_branch"
fi
echo "同步完成!"
7.2 Git 别名配置
在 ~/.gitconfig 中添加:
ini
[alias]
# 同步分叉仓库 - 使用 git pull upstream main
sync = "!git checkout main && git pull upstream main && git push origin main"
# 同步当前分支
sync-branch = "!git pull upstream main && git push origin HEAD"
# 创建特性分支并切换
feature = "!git checkout -b feature/$1"
# 显示简洁日志
lg = log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit
# 清理已合并的分支
cleanup = "!git branch --merged main | grep -v 'main' | xargs -n 1 git branch -d"
8. git pull upstream main 详细说明
8.1 命令分解
bash
git pull upstream main
这个命令实际上执行了两个操作:
git fetch upstream main- 从上游仓库获取 main 分支的最新提交git merge FETCH_HEAD- 将获取的更改合并到当前分支
8.2 使用场景对比
| 场景 | 推荐命令 | 说明 |
|---|---|---|
| 同步主分支 | git pull upstream main |
最简洁,一步完成 |
| 需要查看更改再合并 | git fetch upstream + git merge upstream/main |
可以先检查再合并 |
| 保持线性历史 | git pull --rebase upstream main |
避免合并提交,历史更清晰 |
| 功能分支同步 | git pull upstream main |
直接合并上游更新到功能分支 |
8.3 处理冲突
当 git pull upstream main 出现冲突时:
bash
# 执行 pull 时出现冲突
git pull upstream main
# 自动合并失败,修复冲突...
# 查看冲突文件
git status
# 手动解决冲突后
git add 冲突文件
# 完成合并
git commit
# 或者如果使用 rebase
git pull --rebase upstream main
# 解决冲突后
git add .
git rebase --continue
9. 最佳实践总结
- 定期同步 :每天开始工作前使用
git pull upstream main同步 - 分支策略:每个功能/修复使用独立分支
- 提交规范:使用清晰的提交信息
- 及时推送:定期推送到远程备份工作
- 小步提交:频繁提交,每个提交解决一个问题
- 测试验证:在提交 PR 前确保代码质量
- 及时清理:合并后删除已不再需要的分支
- 优先使用
git pull upstream main:比 fetch + merge 更简洁
10. 常见问题解决
10.1 git pull upstream main 冲突解决
bash
# 出现冲突时
git status # 查看冲突文件
# 手动解决冲突后
git add .
git commit -m "merge: 同步上游更新并解决冲突"
# 或者中止合并
git merge --abort
10.2 误操作恢复
bash
# 撤销最后一次提交(保留更改)
git reset --soft HEAD~1
# 撤销最后一次提交(丢弃更改)
git reset --hard HEAD~1
# 恢复特定文件
git checkout -- 文件名
# 撤销 pull 操作
git reset --hard ORIG_HEAD
这个完整流程将帮助你高效地使用 Git Fork 进行协作开发,特别是使用 git pull upstream main 来简化同步操作!