GitHub Fork 与 Pull Request(PR)提交流程

本文记录一次完整的开源项目贡献流程,以 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

这样可以安全地参与其他人的开源项目,而不会直接修改原作者的仓库。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇