迈入开源世界的第一步:GitHub PR
前言
近期在搞毕设,学了制作仿 ChatGPT 对话界面,想着找找还有没有其他实现的方法,在 GitHub 上搜相关项目的时候,找到一个自己觉得可以 PR 的项目,遂记录本人第一次 PR 过程。
PR流程
在网上找了很多关于 PR 的教程,大概可以分为以下几个步骤:
- 先 Fork 别人的项目到自己的仓库里
- clone 到本地进行修改,修改的时候不会影响到别人的仓库,可以放心修改
- 修改完后,push 回自己的仓库
- 如果一切就绪,那么就可以提交 PR 请求
- 当作者认同你的修改,那么他就会将你的代码合并到 master 上,然后自己也会成为这个项目的 contributor。
正式开始
Fork 项目
首先 Fork 打算提交 PR 的项目到自己仓库里。
Clone 到本地进行修改
在本地电脑找了个方便修改项目的地方,打开 Git Bash 或者命令行,用以下命令在本地克隆项目的代码库:
1 | git clone <repository-url> |
这样就能在本地拥有项目的代码了。
创建分支
在本地创建一个新的分支来进行开发工作。
PS:虽然第一个 PR 从 main 提交完全没有问题,但是如果需要同时提交2个 PR ,新建分支更好工作。
1 | git checkout -b <branch-name> |
这个命令是在本地创建一个新的分支,并且切换到这个分支。
可以在这个新分支上进行代码修改和开发。
更新本地代码
在每一次写代码之前,都需要确认本地分支的代码是最新的,不然提交的时候有别人先提交会冲突。
更新本地 main 代码:
1 | git fetch upstream |
这里因为我使用的是命令行进行 git clone ,然后使用 git bash 进行更新本地 main ,出现了以下情况。其原因是:Git 在本地仓库配置中找不到远程仓库信息。
1 | $ git fetch upstream |
这时候先查看配置的远程仓库名称以及它们对应的抓取 (fetch) 和推送 (push) URL
1 | $ git remote -v |
再手动添加 upstream 远程仓库
1 | $ git remote add upstream https://github.com/iFoxQvQ/cloud-web.git |
此时进行更新就没有问题了。
解决问题参考的帖子:GitHub - Git 错误 - Stack Overflow
1 | $ git fetch upstream |
写代码
写代码写代码写代码
Commit 和 Push
写完代码后,使用以下命令将代码提交到远程仓库:
1 | git add . |
代码提交到远程仓库后,可以在 GitHub 上创建一个新的 PR 了。
打开自己 Fork 的仓库页面,在页面上方选择 “ Pull requests ” ,然后点击 “ New pull request ” 按钮。
选择修改的分支来进行提交。
然后进行修改 PR 标题和描述内容。完成后点击 Create pull request 按钮。
这样就可以创建一个新的PR了,然后就是等作者同意合并了。
可能会遇到的问题
reviewers 提出修改意见
提交 PR 很多时候会因为各种各样的问题不会被马上合入,Reviewers 会提出修改意见。这时可以返回去继续根据意见修改代码,然后通过执行和第一次 Commit 一样步骤的命令,GitHub 会自动把新增的 Commits 全部追加到一个未合入 PR 里去。
PR 产生冲突
每次写代码前应更新本地代码,尽量避免这种情况。但有时候 PR 被阻塞了一段时间,可能别人修改了一行代码,被抢先合入,这时候 PR 就出现冲突了。
现在本地执行:
1 | # 先切回到 main 分支 |
本地的 main 分支就和远程的代码完全一致了,然后将 main 分支代码合入自己的分支,同时解决冲突。
1 | git checkout <branch-name> |
冲突部分内容一般会像以下这样:
1 | 1 <<<<<<< HEAD |
将其修改为你认为最好的结果。例如以下三种:
1 | 1 Text 1 changed by other. |
1 | 1 Text 1 changed by other. |
1 | 1 Text 1. |
然后保存文件,再进行第一次 PR 操作即可。
1 | git add . |
这里我推荐一个练习自己解决 PR 冲突的课程,自己看后觉得挺不错的。
使用 GitHub 上的合并冲突解决解决竞争性提交 - Training | Microsoft Learn
修改少量代码
记起之前部署 my-neuro 项目的时候遇到的 bug ,在评论区也看到很多人遇到这个问题,当时忘记 PR 了。
直接在原仓库找到想要修改的文件,然后选择修改。
修改完毕后提交修改
这样节省了很多时间,不需要去 clone 原项目。