怎么提Issue与PR
https://www.cnblogs.com/daniel-hutao/p/open-a-pr-in-github.html
https://blog.csdn.net/qq_47733361/article/details/133907433
虽然经常使用github拉开源项目学习,也开源过一些自己写的程序,但是还未实际参与过开源社区😂。
我在了解学习 隐语 的过程中,看到一处文档笔误。然后前两天在隐语群里,也正好看到过一个招募贡献者的帖子。突然就想着是不是自己可以参加一下,因为我对参与开源项目、社区很感兴趣,由此开始第一次提PR。
1.提Issue
1.1 相关知识概念
什么是提issue,Issue(字面意思 “议题”)是项目的「问题跟踪工具」。我认为它是一个反馈问题/提需求 的工具。主要用于记录和解决项目的“待办事项”。
核心用途(什么时候提issue):
- 反馈 Bug:比如你用某个开源工具时,发现 “点击按钮没反应”“数据计算错误”,就可以提 Issue 告诉维护者 “哪里出了问题、怎么复现”。
- 提出需求:比如你希望项目增加新功能(“能否加一个导出 Excel 的按钮?”),或优化现有体验(“希望加载速度再快一点”),用 Issue 描述需求细节。
- 讨论疑问:比如你看项目文档没懂某个功能的用法,或对代码设计有疑问,提 Issue 跟维护者 / 社区讨论。
- 任务跟踪:团队内部用 Issue 分配任务,记录进度和阻塞点。
作用还是多多的。
特点:
- 不涉及代码提交:Issue 里可以附截图、日志,但不用写代码。
- 有生命周期:从 “新建(Open)”→“讨论”→“解决(Closed)”/“关闭(Wontfix,如需求不采纳)”。
- 可关联其他内容:比如后续用 PR 修复了某个 Bug,可以在 PR 中关联对应的 Issue(如写 “Fixes #123”,PR 合并后会自动关闭 #123 这个 Issue)。
放在这里,我们发现了一个文档错误,所以我们可以提issue告知,维护者或者自己去修改这个问题。
1.2 实操:
在github项目这找到 issue,就可以新建一个issue。
这里我们选择分类,选择第一个(报告bug)
然后就有一个 issue 模版,咱们就按照模版提供的格式,去填写对应信息即可。然后最后提交,就完成了提issue。
这个是我提的隐语的issue:
- https://github.com/secretflow/secretflow/issues/1953
- https://github.com/secretflow/secretpad-frontend/issues/44
2.提PR
完成提issue后,我们可以考虑自己去解决这个issue,也可以等待项目维护者或者其他开发者的回复。
如果你想要自己来解决,并且需要修改源码 那么就需要提PR
2.1相关知识概念
PR 是 Pull Request(拉取请求) 的缩写。本质是 “代码层面的贡献请求”:你修改了代码,希望把自己的代码 “合并到项目的主分支”,就需要提 PR 让维护者审核。
核心用途(什么时候提PR):
-
给开源项目贡献代码:比如你看到某个项目的 Issue 里有个 Bug 没人修,你本地改好后,提 PR 把修复代码 “推给” 原项目,请求维护者 “拉取” 你的代码合并进去。
-
团队内部代码审核:比如你完成了 “登录模块重构”,把代码推到自己的分支(如
feature/login-refactor
),然后提 PR 到团队的主分支(如develop
),让同事审核代码(看有没有 Bug、风格是否规范),审核通过后再合并。
提PR的核心流程(以github为例子)
- Fork 仓库:如果是外部贡献者,先把原项目 “复制” 到自己的账号下(比如把
github.com/原作者/项目
Fork 到github.com/你的账号/项目
)。 - 本地修改代码:Clone 自己 Fork 的仓库到本地,在分支上改代码(如修复 Bug、加功能),然后
commit
+push
到自己的远程仓库。 - 创建 PR:在 GitHub 上,进入原项目页面,点击 “New Pull Request”,选择 “你的仓库分支 → 原项目目标分支”,填写 “修改了什么、为什么改”,提交 PR。在自己fork的仓库其实可以看到
compare& pull request
,这也是一个创建PR的入口 - 审核与合并:原项目维护者查看你的代码,有问题会提 “审核意见”(如 “这里逻辑有漏洞,需要改”),你修改后再推送代码(会自动更新 PR);审核通过后,维护者点击 “Merge”,你的代码就合并到原项目了。
2.2 实操
1)在github上选择你想要提交PR的项目,先fork到自己的账号下。
2)git clone 下拉自己账号下的 项目仓库
这里下拉完成后,注意检查下自己的git的邮箱,看其是否与github邮箱一致,这一块是要尽量保持一致的,否则提交的PR审查时可能出现问题(比如如果需要CIA签名时,可能绑定不对人)
3)可以开心的修改代码了
编写代码时,注意代码规范。开源项目一般有明确自己的代码规范要求
4)修改好之后,可以提交代码到一个新建分支,并推送
git commit 信息也需要规范,一般是类似这种:
fix:修复 xxxx
docs:修改文档 xxxx
你可以看下历史提交的commit是什么格式的,然后参照下。
feat
:新功能(feature),表示增加了新的功能特性。
fix
:修补 bug ,说明此次提交是对程序中存在的错误进行修复。
docs
:文档(documentation),如果只是对文档进行了更新,比如修改 README.md 文件、API 文档等,就使用这个类型 。
style
:格式(不影响代码运行的变动),例如修改了代码的缩进、空格、分号等格式问题,没有改变代码逻辑。
refactor
:重构(即不是新增功能,也不是修复 bug),比如对代码结构进行优化、函数拆分等,代码的功能没有发生变化,只是代码的内部实现方式改变了 。
test
:增加或修改测试用例,当提交是为了补充测试代码或者修改已有测试代码时使用。
chore
:构建过程或辅助工具的变动,比如更新依赖包版本、修改构建脚本等,不直接影响产品功能。
revert
:回退到之前的提交版本 ,表示撤销了之前的某次提交。
分支名好像没有比较强制的规范,因为这个分支也只是在你fork的仓库。
5)在github页面创建PR
一般不同开源项目可能有不同的规范,创建的时候会有模版,按照模版写即可。
隐语我最近提的PR(可供参考):
- https://github.com/secretflow/secretflow/pull/1962
- https://github.com/secretflow/secretpad-frontend/pull/45
6)很多开源项目要求首次PR时,签署CLA
CLA是贡献者许可协议,主要是明确知识产权,将你写的代码的知识产权授予给项目。
不同开源项目好像有不同的签署方式。隐语项目的签署方式是在PR的评论区,评论一句话即可:
I have read the CLA Document and I hereby sign the CLA
7)项目维护者会去审核你的代码,如果没有问题的话,你的代码就会被合并到项目中。
如果审核人员提出了代码修改意见,可以继续修改代码,然后重新push
3.问题记录
1)git clone 的是原项目的地址,想要切换到自己fork到仓库
git remote -v
git remote set-url origin https://github.com/kongxiaoran/secretpad-frontend.git
2)修改当前项目的git邮箱
git config user.email "12541**59@qq.com"
3)将多次 git commit 合并成一个
比如你本地提交过多次,但是希望自己PR那只有一条提交记录(目的是让提交历史更清晰、规范),可以使用这个方法。
先看下你提交过的记录
(base) kxr@kxrdeMacBook-Pro secretpad-frontend % git log -3
commit 4edc26931e80da9a945a529b9b7d3e628d4e574e (HEAD -> fix-prompt-error)
Author: kongxr <12541**59@qq.com>
Date: Mon Oct 13 10:59:42 2025 +0800fix: 修复训练流删除不成功时的提示内容错误commit 953c4f123de674f07aa02c09fdf4e0908660fdae (origin/fix-prompt-error)
Author: kongxr <12541**59@qq.com>
Date: Mon Oct 13 10:23:11 2025 +0800fix: 修复训练流删除不成功时的提示内容错误commit 17935690c12d305681f6d5f92f42baa16a136c1d (tag: v0.12.0b0, origin/main, origin/HEAD, main)
Merge: 9fb2e87 a09c0fa
Author: Rouni Yin <46579290+yinrouni@users.noreply.github.com>
Date: Thu Dec 19 17:53:31 2024 +0800Merge pull request #38 from secretflow/release/v0.12.0repo-sync-2024-12-19
比如这里我将最近2条commit进行合并,就使用命令:
git rebase -i HEAD~2
Git 会自动打开默认编辑器(如 Vim),显示最近 2 次提交的列表,类似如下:
你可以修改每行开头的命令(如 pick
改为 fixup
),实现对提交的处理。
# 下面是注释说明,解释每个命令的含义
# Commands:
# p, pick <commit> = 使用该提交
# r, reword <commit> = 使用该提交,但修改提交信息
# e, edit <commit> = 使用该提交,但暂停变基过程,允许修改提交内容
# s, squash <commit> = 将该提交合并到前一个提交,保留提交信息
# f, fixup <commit> = 将该提交合并到前一个提交,丢弃该提交的信息
# x, exec <command> = 执行 shell 命令
# d, drop <commit> = 删除该提交
若想合并两次提交:将第二个提交的 pick
改为 或 fixup
。如果合并超过两个,也是一样的,将那些提交都改成 fixup(最近一次提交用 pick即可)
使用 :wq
保存
这时候再用 git log -2
看下,你就发现合并了。
(base) kxr@kxrdeMacBook-Pro secretpad-frontend % git log -2
commit ca5c62ec517976488cb76d0cc87b98810d7de1d7 (HEAD -> fix-prompt-error)
Author: kongxr <12541**59@qq.com>
Date: Mon Oct 13 10:23:11 2025 +0800fix: 修复训练流删除不成功时的提示内容错误commit 17935690c12d305681f6d5f92f42baa16a136c1d (tag: v0.12.0b0, origin/main, origin/HEAD, main)
Merge: 9fb2e87 a09c0fa
Author: Rouni Yin <46579290+yinrouni@users.noreply.github.com>
Date: Thu Dec 19 17:53:31 2024 +0800Merge pull request #38 from secretflow/release/v0.12.0repo-sync-2024-12-19
最后强制推送到远程仓库:
git push --force
如果这个你fork仓库的分支是多人合作,请注意强制推送的风险。