05 - Fork 与开源协作
本章目标:掌握 Fork 工作流,学会参与开源项目贡献代码。
一、Fork 是什么?
Fork 是"复制别人的仓库到你的账号下",然后在你的副本上修改,再通过 PR 贡献回去。
原始仓库(upstream)
github.com/original-owner/project
│
│ 点击 "Fork"
▼
你的 Fork(origin)
github.com/your-name/project
│
│ git clone + 修改 + push
▼
创建 PR → 贡献回原始仓库
为什么需要 Fork?
1. 你没有原始仓库的写入权限
2. Fork 让你有一个可以自由修改的副本
3. 修改完后可以通过 PR 贡献回去
4. 这是开源社区的标准协作方式
二、实战:Fork 一个项目
2.1 找一个练习项目
推荐找 "good first issue" 标签的项目:
https://github.com/topics/good-first-issue
或者直接 Fork 你自己的仓库来练习:
https://github.com/your-name/my-git-practice
2.2 Fork 操作
1. 打开要 Fork 的仓库页面
2. 点击右上角 "Fork" 按钮
3. 选择你的账号
4. 点击 "Create fork"
5. 等待几秒钟,Fork 完成
2.3 克隆 Fork 的仓库
bash
# 克隆你 Fork 的仓库(不是原始仓库!)
git clone git@github.com:your-name/project.git
cd project
# 添加原始仓库为 upstream
git remote add upstream git@github.com:original-owner/project.git
# 验证远程仓库
git remote -v
# origin git@github.com:your-name/project.git (fetch)
# origin git@github.com:your-name/project.git (push)
# upstream git@github.com:original-owner/project.git (fetch)
# upstream git@github.com:original-owner/project.git (push)
三、Fork 工作流完整流程
3.1 同步 upstream 的最新代码
bash
# 从 upstream 拉取最新代码
git fetch upstream
# 切到 main 分支
git checkout main
# 合并 upstream 的 main
git merge upstream/main
# 推送到你的 origin
git push origin main
3.2 创建功能分支
bash
# 从最新的 main 创建功能分支
git checkout -b feature/fix-typo
# 修改代码...
# 修复了一个拼写错误
# 提交
git add .
git commit -m "docs: fix typo in README"
# 推送到你的 origin
git push -u origin feature/fix-typo
3.3 创建 PR 到原始仓库
1. 打开你 Fork 的仓库页面(github.com/your-name/project)
2. 点击 "Compare & pull request"
3. 确保:
- base repository: original-owner/project
- base: main
- head repository: your-name/project
- compare: feature/fix-typo
4. 填写 PR 描述
5. 点击 "Create pull request"
3.4 PR 描述规范
markdown
## 改动说明
- 修复了 README 中的一个拼写错误
## 关联 Issue
- 无
## 测试
- 无代码改动,仅文档修改
四、保持 Fork 同步
4.1 手动同步
bash
# 拉取 upstream 的最新代码
git fetch upstream
# 合并到你的 main
git checkout main
git merge upstream/main
# 推送到你的 origin
git push origin main
4.2 自动同步(推荐)
在 GitHub 上设置自动同步:
1. 打开你 Fork 的仓库
2. Settings → General → 被动设置区域
3. 找到 "Sync fork" 部分
4. 点击 "Update branch"
或者用 GitHub Actions 自动同步:
yaml
# .github/workflows/sync.yml
name: Sync Fork
on:
schedule:
- cron: '0 0 * * *' # 每天自动同步
workflow_dispatch: # 或手动触发
jobs:
sync:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Sync upstream
run: |
git remote add upstream https://github.com/original-owner/project.git
git fetch upstream
git merge upstream/main
git push origin main
五、开源贡献礼仪
5.1 贡献前
□ 阅读项目的 CONTRIBUTING.md
□ 阅读项目的 README.md
□ 了解项目的代码风格
□ 检查是否已有相关的 Issue 或 PR
□ 对于大的改动,先开 Issue 讨论
5.2 Commit 规范
bash
# 大多数开源项目使用 Conventional Commits
git commit -m "fix: correct typo in documentation"
git commit -m "feat: add new search functionality"
git commit -m "docs: update installation guide"
5.3 PR 描述
markdown
## What
- 简要描述你做了什么
## Why
- 为什么要做这个改动
## How
- 如何实现的(如果改动复杂)
## Related
- Closes #123
- Related to #456
5.4 Review 礼仪
作为贡献者:
- 及时响应 Review 评论
- 对事不对人
- 虚心接受建议
作为 Reviewer:
- 给出建设性意见
- 肯定做得好的地方
- 尊重贡献者的时间
六、实战:贡献一个 README 改进
让我们实际操作一次完整的开源贡献流程。
步骤
bash
# 1. Fork 一个项目(你自己的仓库练习)
# 2. 克隆并添加 upstream
git clone git@github.com:your-name/my-git-practice.git
cd my-git-practice
git remote add upstream git@github.com:your-name/my-git-practice.git
# 3. 创建功能分支
git checkout -b docs/improve-readme
# 4. 修改 README.md
cat > README.md << 'EOF'
# My Git Practice 🎯
> 企业级 Git 实战练习仓库
## 🚀 快速开始
```bash
git clone git@github.com:your-name/my-git-practice.git
cd my-git-practice
📚 目录
🤝 贡献
欢迎贡献!请阅读 <CONTRIBUTING.md>。
📄 License
MIT License
EOF
5. 提交并推送
git add README.md
git commit -m "docs: improve README with quick start guide"
git push -u origin docs/improve-readme
6. 在 GitHub 上创建 PR
7. 等待 Review(自己给自己 Review)
8. 合并 PR
---
## 七、找到好的第一个 Issue
### 7.1 搜索 good first issue
在 GitHub 上搜索:
label:"good first issue" language:javascript stars:>100
或者访问:
https://github.com/topics/good-first-issue
### 7.2 推荐的入门项目
-
documentation 项目(改文档最容易)
-
translation 项目(翻译)
-
bug fix(修复简单的 Bug)
-
tests(添加测试用例)
八、练习清单
完成以下操作:
- Fork 你自己的仓库
- 克隆 Fork 并添加 upstream
- 创建功能分支并修改代码
- 创建 PR 到原始仓库
- 合并 PR 并删除分支
- 同步 upstream 的最新代码到你的 Fork
上一章:[04-GitHub Actions自动化实战](04-GitHub Actions自动化实战.md)
下一章:[06-GitHub Pages部署网站](06-GitHub Pages部署网站.md)