前言
Github是程序员最爱的网站,你能在上面找到各种好玩有趣的项目,如果你想要为一个项目提交代码改进,看这篇就没错了。
本文使用fork-feature-branching workflow,以私人仓库Gitea为例,Gitea是如Github一样的git服务器,一般是私人搭建的。
准备条件
- git服务器对应的用户账号(Github/Gitee/Gitea)
- 电脑端git工具
- 本地配置好全局git用户名和邮箱
- (可选)配置服务端和本地连接的SSH密钥
克隆仓库代码
-
打开你要贡献代码的仓库
如:mrlan/Kidney
-
点击右上角fork(派生)

-
在自己的仓库列表中就会有一个一模一样的仓库
注意左上角,此时已经变成了{你的用户名}/{仓库名}
这个是你复制的一份完整的仓库,包括了原仓库提交历史,你对这个仓库拥有读写权限,而原仓库你是理论上没有写权限的。

-
建立本地的仓库
在你想要放代码的地方执行
git clone {your repository url}
新建分支
你当前默认是在master分支,你需要创建一个分支来进行修改操作,并且使用一个易懂的名字。
如可以用
feature.2021090601代表2021年9月6号的第一版功能更新分支。或者Bug256-xxx表示序号为256的bug的修复分支。一个好的分支名是规范,就像好的代码编写习惯一样。
- 从master新建分支
git checkout master
git checkout -b feature.2021090601
-
修改你的代码
-
提交修改
git add * 或者 git add .
- commit修改到本地
git commit -m "此次提交的注释"
- push此修改到你的远程仓库
git push origin feature.2021090601
后面的是你的分支名
origin是你远程仓库的名字,git clone时会自动把你clone的地址设置为origin
过程中需要输入你的Git服务器的账户名和密码,如果你使用clone地址的是SSH地址,并且本机和服务器配置过SSH密钥则不需要输入密码。
创建Pull Request
现在你已经把你的代码改动推到自己的fork的仓库里了,但是还没有提交给仓库原拥有者,需要在你的Git服务器上操作。
- 打开你的仓库地址,点击创建和并请求(New Pull Request)

- 选择合并的分支
右边选择你刚上传的分支,左边选择目标分支,即原仓库的master
我这边没有修改分支里的代码,所以看不到改动,正常能看到修改了什么文件。

- 填写标题和概述
一个好的PR标题要一目了然,概述要清晰明确。
你做了什么功能,修改了什么bug,有没有大的改动需要注意的点。
- 点击提交
点击下方绿色的创建合并请求的按钮,即创建完成,这时你会跳转到原仓库的PR详情页中,看到你提交的PR。
- 等待Review
如果仓库持有人或者审核人表明了欠缺的点,需要再次修改的话,还是可以在本地进行修改再提交到远端,会自动同步到这个PR中。
如:
git add *
git commit -m "Change ****"
git push origin feature.2021090601
这样过后能再PR详情页中看到你的改动,所以不用再次提交PR,Reviewer也能看到你的提交,提交记录是以一次commit为最小单位显示的。
- 合并
如果代码没有问题,Reviewer会合并这次PR,你的分支里的内容会被合并到master分支。如:以下是一个正常合并的PR。

其他
为其他分支创建PR
实际上你可以从任意的分支中创建分支,然后再推到原仓库的这个任意分支上,只不过更新master分支是一个最常见的操作。
更新你的远端仓库
你fork后的仓库是不会跟着原仓库进行同步更新的,长期提交PR的话可能会导致冲突,需要更新你的远端仓库。
- 使用PR更新
即在你的远端仓库上开PR,更新由中央仓库master分支指向你的仓库的master分支,这样需要你自己处理这个PR,点击合并之后你的master分支就更新了,不过这样会多一些提交。

- 借助本地更新
思路:从远端fetch代码,合并本地master,再推到自己的远程仓库。
# 建立upstream仓库 即你fork的原仓库
git checkout master
git remote add upstream {你fork原仓库的地址}
git fetch upstream
git merge upstream/master master
git push origin master
#其中 git fetch 和 merge可以合并为一句
git pull upstream master
Good。
为什么标题用Gitee而正文用Gitea呢?
因为Github和Gitee是国内程序员最主要使用的公共git服务器。
除此之外还有Gitea、Gitlab等非公开git服务器,和Github及Gitee相比,优势体现私密性和访问速率。
PullRequest流程在这些Git服务器上都适用,是一个通用操作。可以直接参考这篇文章去GIthub上贡献自己的代码