本文记录一次完整的开源项目贡献流程,以
username/reponame为例,适用于大多数 GitHub 开源项目。
一、Fork 项目
假设要给:
https://github.com/username/reponame
贡献代码。
进入项目主页,点击右上角:
Fork
进入 Create a new fork 页面。
Fork 设置
推荐:
Owner:
自己的 GitHub 账号
Repository name:
reponame
Description:
可选,例如:
Add Simplified Chinese localization
☑ Copy the main branch only
然后点击:
Create fork
Fork 完成后,会得到自己的仓库:
https://github.com/自己的用户名/reponame
二、如果本地已经有项目,不需要重新 Clone
如果之前已经执行过:
git clone https://github.com/username/reponame.git
并且已经在本地完成了修改,不要重新 Clone。
可以直接修改 Git 远程仓库配置。
先查看:
git remote -v
三、设置 origin 和 upstream
推荐使用两个远程仓库:
origin
↓
自己的 Fork
upstream
↓
原作者仓库
例如:
origin
https://github.com/自己的用户名/reponame.git
upstream
https://github.com/username/reponame.git
如果原来的 origin 指向作者仓库,可以修改:
git remote set-url origin https://github.com/自己的用户名/reponame.git
然后添加原作者仓库:
git remote add upstream https://github.com/username/reponame.git
检查:
git remote -v
最终应该类似:
origin https://github.com/自己的用户名/reponame.git (fetch)
origin https://github.com/自己的用户名/reponame.git (push)
upstream https://github.com/username/reponame.git (fetch)
upstream https://github.com/username/reponame.git (push)
两者的作用
origin
↓
自己的 Fork
↓
可以 push
upstream
↓
原作者仓库
↓
用于获取原项目最新代码
四、检查本地修改
进入项目目录:
cd \reponame
检查:
git status
例如:
On branch main
Changes not staged for commit:
modified: package.json
modified: src/main/index.js
...
确认自己的修改还存在。
不要随便使用
git reset --hard,否则可能丢失本地修改。
五、创建自己的功能分支
不要直接在 main 分支上开发。
创建一个专门用于 PR 的分支:
git checkout -b feat/chinese-localization
检查:
git status
应该看到:
On branch feat/chinese-localization
六、检查修改内容
查看修改了哪些文件:
git diff --stat
查看具体修改:
git diff
这一步非常重要。
可以检查:
- 是否只有自己想提交的修改
- 有没有误修改其他文件
- 有没有调试代码
- 有没有版本号变化
- 有没有不应该提交的文件
- 有没有
package-lock.json等无关修改
七、撤销不需要提交的文件
如果某个文件与本次 PR 无关,例如:
package-lock.json
可以恢复:
git restore package-lock.json
然后再次检查:
git diff --stat
例如最终只保留:
src/main/index.js
src/renderer/index.html
src/renderer/src/components/AddItemForm.jsx
src/renderer/src/components/ItemList.jsx
src/renderer/src/components/SettingsDrawer.jsx
八、添加到暂存区
确认修改无误后:
git add .
检查:
git status
此时应该看到:
Changes to be committed:
modified: ...
九、检查真正准备提交的内容
推荐再检查一次:
git diff --cached
或者查看统计:
git diff --cached --stat
注意:
git diff
查看的是还没有加入暂存区的修改。
而:
git diff --cached
查看的是这次 commit 真正准备提交的内容。
十、创建 Commit
例如本次是简体中文本地化:
git commit -m "Add Simplified Chinese localization"
Commit 信息应该尽量简单、清楚。
例如:
Add Simplified Chinese localization
十一、Push 到自己的 Fork
将分支推送到自己的 GitHub 仓库:
git push -u origin feat/chinese-localization
这里的:
origin
是自己的 Fork,而不是作者的仓库。
十二、创建 Pull Request
Push 成功后,进入自己的 GitHub 仓库:
自己的用户名/reponame
GitHub 通常会出现:
Compare & pull request
点击它。
十三、确认 PR 的方向
这是非常重要的一步。
应该是:
base repository:
username/reponame
base:
main
head repository:
自己的用户名/reponame
compare:
feat/chinese-localization
也就是:
自己的分支
↓
自己的 Fork
↓
Pull Request
↓
原作者仓库
↓
usrname/reponame
千万不要反过来。
十四、填写 PR 标题
例如:
Add Simplified Chinese localization
十五、填写 PR 描述
可以使用:
## What this does
This PR adds Simplified Chinese localization to todometer.
- Translated user-facing UI text into Simplified Chinese
- Translated menus, settings, buttons, notifications, and other interface text
- Kept the existing functionality unchanged
- Tested the localized application on Windows
## Relevant issue
No related issue.
如果还提供了 Windows 测试,可以写:
I also built and tested a Windows installer for the localized version.
十六、是否勾选 Allow edits by maintainers
创建 PR 页面通常会看到:
☑ Allow edits by maintainers
可以保持勾选。
这样项目维护者如果需要直接修改你的 PR,会更加方便。
十七、提交 Pull Request
确认:
base:
username/reponame:main
head:
自己的用户名/reponame:feat/chinese-localization
确认标题和描述没有问题后:
Create pull request
点击即可。
十八、PR 创建成功后的状态
创建成功后会看到类似:
Add Simplified Chinese localization #200
状态:
Open
例如:
自己的用户名 wants to merge 1 commit into
username:main
from
自己的用户名:feat/chinese-localization
这说明 PR 已经成功提交给原作者。
十九、PR 创建后需要做什么?
通常不用继续操作。
等待作者 Review 即可。
可能出现几种情况。
1. 作者批准
可能出现:
Approved
然后作者可以合并。
2. 作者要求修改
可能出现:
Changes requested
这时候继续修改本地:
git checkout feat/chinese-localization
修改代码后:
git add .
git commit -m "Refine Chinese localization"
git push
因为还是同一个:
feat/chinese-localization
分支,所以 GitHub 上原来的 PR 会自动更新。
不需要重新创建 PR。
3. 作者直接合并
最终可能显示:
Merged
这表示你的代码已经进入原项目。
4. 作者关闭 PR
PR 也可能:
Closed
但:
Closed
不一定代表合并。
需要看具体页面是否显示:
Merged
二十、一个完整的命令流程
以后给其他 GitHub 项目贡献代码,可以直接参考:
# 1. 查看远程仓库
git remote -v
# 2. 如果需要,设置自己的 Fork
git remote set-url origin https://github.com/自己的用户名/项目名.git
# 3. 添加原作者仓库
git remote add upstream https://github.com/username/项目名.git
# 4. 查看状态
git status
# 5. 创建功能分支
git checkout -b feat/功能名称
# 6. 修改代码
# 7. 查看修改
git diff
git diff --stat
# 8. 撤销不需要提交的文件
git restore 文件名
# 9. 添加修改
git add .
# 10. 查看真正准备提交的内容
git diff --cached
git diff --cached --stat
# 11. 创建 commit
git commit -m "Add xxx"
# 12. 推送到自己的 Fork
git push -u origin feat/功能名称
然后:
GitHub
↓
自己的 Fork
↓
Compare & pull request
↓
确认 base / head
↓
填写标题
↓
填写 PR 描述
↓
Create pull request
↓
等待 Review
二十一、推荐的远程仓库结构
以后参与开源项目,可以尽量保持这种结构:
你的电脑
│
├── origin
│ └── 你的 GitHub Fork
│
└── upstream
└── 原作者 GitHub 仓库
例如:
本地项目
│
├── origin ──────→ 自己的用户名/reponame
│
└── upstream ────→ username/reponame
开发的时候:
main
↓
feat/chinese-localization
↓
commit
↓
push origin
↓
Pull Request
↓
username/reponame
这样可以安全地参与其他人的开源项目,而不会直接修改原作者的仓库。










