在 GitHub 中向开源项目提交 PR 的过程

本文主要对在 GitHub 中向开源项目提交 PR(Pull Request)的过程进行一些总结。
概述
我们在使用开源项目的过程中,发现一个新的需求,但是开源项目不支持,这时我们就可以在开源项目的基础上实现这个需求,向开源项目提交 PR,让开源项目考虑后续版本是否接纳该需求。提交 PR 是参与开源项目,为开源项目做贡献的起点。
提交 PR 的过程包括:fork 开源项目到自己的 Github 账户下,clone 项目到自己的本地仓库,建立本地仓库到远程仓库的 remote 链接,新建本地分支,修改代码,提交代码到自己的 Github 远程仓库,新建 PR。
详细步骤
下面我们就逐一进行详细说明(忽略申请 Github 账号、添加 ssh 公钥等过程)。
以向https://github.com/Wechat-Group/WxJava提交 PR 为例。
我的 Github 地址:https://github.com/huagetai
fork 开源项目

进去后,点出 fork,稍等片刻,此项目便会出现在自己的仓库中

进到自己 fork 的项目中,就能看到 Clone 按钮,如下,复制这个 https 链接。

通过上面的步骤,已经将远程仓库建好
clone 项目
需要将自己 fork 的远程仓库 clone 到本地,此处省略安装本地 github 的过程,进入本地项目 wokspace,执行一下 git clone https://github.com/huagetai/WxJava.git(使用上一步的 https 链接),等待命令完成。

上面的命令完成后,当前目录下会多一个目录,我 clone 的是WxJava,所以会多一个WxJava目录,进到WxJava目录中,试试跑一下 git status 试试,会提示现在是 develop 分支。

remote 远程
用 git remote -v 命令,可以看到此时只与自己的远程仓库建立了连接

还需要与上游建立连接,这里上游指的是一开始 fork 的那个项目源,以本文WxJava为例,执行如下命令:
git remote add upstream https://github.com/Wechat-Group/WxJava
再用 git remote -v 可以看到:

接下来就能创建分支了。
创建本地分支
接着上面的运行命令:git checkout -b WxJava-B1,这个命令的意思是创建一个叫 flink-fs 的分支,运行这个命令后 bash 将自动切换到新的分支下了

修改代码
自行修改代码哈
提交修改的代码到本地分支,推送本地分支到 Github 远程仓库
可以先使用 git status 来查看有哪些文件被修改了
然后再 git add ***.java 将要提交的文件都加上
然后再 git commit -m "modify XX",需要注意的是 git commit 只是把修改的代码提交到当前分支(当前分支是WxJava-B1,而不是 develop),”modify XX”是本次提交的简单说明
然后再 git push origin WxJava-B1,这一步才是将当前分支推送到自己的远程仓库。
这时,在自己的远程仓库便能看刚才 push 上去的分支了。

新建 PR
点击 New pull request,

需要注意的是 compare 处选择刚才提交上来的分支

然后点 Create pull request
写好名字,写好说明,提交,就 OK 啦。

关于 check 不通过的问题
github 有代码自己编译和 check 机制,在你提交 pr 的时候,项目可能已经有了比较大的变更(每天都有世界各地的 coder 提 pr),而你没有将分支保持与项目同步,所以有可能会导致 check 失败,pr 被无视。
还记得我们在自己本地有一个WxJava develop 分支,然后又拉了一个WxJava-B1 分支,然后在WxJava-B1 上进行修改,提交的也是WxJava-B1,然后又想起了之前有一步是“与上游建立连接”,说到你可能已经知道了 develop 的作用–用于远程代码同步。
所以每次提交 pr 前,都要先从做代码同步。过程如下:
先 fetch,执行:git fetch upstream
再 rebase,执行:git rebase upstream/develop
再 push develop,执行:git push origin develop
push 完后,远程仓库便可看到你的 branch 版本和 develop 分支一致了,否则这个位置会显示与 develop 相差了多少次 commit。
做完这些操作,就可以回到之前的详细过程来操作了。
评论