前言

近期在搞毕设,学了制作仿 ChatGPT 对话界面,想着找找还有没有其他实现的方法,在 GitHub 上搜相关项目的时候,找到一个自己觉得可以 PR 的项目,遂记录本人第一次 PR 过程。

PR流程

在网上找了很多关于 PR 的教程,大概可以分为以下几个步骤:

  1. 先 Fork 别人的项目到自己的仓库里
  2. clone 到本地进行修改,修改的时候不会影响到别人的仓库,可以放心修改
  3. 修改完后,push 回自己的仓库
  4. 如果一切就绪,那么就可以提交 PR 请求
  5. 当作者认同你的修改,那么他就会将你的代码合并到 master 上,然后自己也会成为这个项目的 contributor。

正式开始

Fork 项目

首先 Fork 打算提交 PR 的项目到自己仓库里。

image-20250517171934590

image-20250517172134744

Clone 到本地进行修改

在本地电脑找了个方便修改项目的地方,打开 Git Bash 或者命令行,用以下命令在本地克隆项目的代码库:

1
git clone <repository-url>

这样就能在本地拥有项目的代码了。

创建分支

在本地创建一个新的分支来进行开发工作。

PS:虽然第一个 PR 从 main 提交完全没有问题,但是如果需要同时提交2个 PR ,新建分支更好工作。

1
git checkout -b <branch-name>

这个命令是在本地创建一个新的分支,并且切换到这个分支。

可以在这个新分支上进行代码修改和开发。

更新本地代码

在每一次写代码之前,都需要确认本地分支的代码是最新的,不然提交的时候有别人先提交会冲突。

更新本地 main 代码:

1
2
3
4
5
6
7
git fetch upstream
git checkout main
git rebase upstream/main

# 更新分支的
git checkout <branch-name>
git rebase main

这里因为我使用的是命令行进行 git clone ,然后使用 git bash 进行更新本地 main ,出现了以下情况。其原因是:Git 在本地仓库配置中找不到远程仓库信息。

1
2
3
4
5
6
$ git fetch upstream
fatal: 'upstream' does not appear to be a git repository
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

这时候先查看配置的远程仓库名称以及它们对应的抓取 (fetch) 和推送 (push) URL

1
2
3
$ git remote -v
origin https://github.com/iFoxQvQ/cloud-web.git (fetch)
origin https://github.com/iFoxQvQ/cloud-web.git (push)

再手动添加 upstream 远程仓库

1
$ git remote add upstream https://github.com/iFoxQvQ/cloud-web.git

此时进行更新就没有问题了。

解决问题参考的帖子:GitHub - Git 错误 - Stack Overflow

1
2
3
$ git fetch upstream
From https://github.com/iFoxQvQ/cloud-web
* [new branch] main -> upstream/main

写代码

写代码写代码写代码

Commit 和 Push

写完代码后,使用以下命令将代码提交到远程仓库:

1
2
3
git add .
git commit -s -m "Commit message"
git push origin <branch-name>

代码提交到远程仓库后,可以在 GitHub 上创建一个新的 PR 了。

打开自己 Fork 的仓库页面,在页面上方选择 “ Pull requests ” ,然后点击 “ New pull request ” 按钮。

image-20250517191246380

image-20250517191335436

选择修改的分支来进行提交。

image-20250517191549648

然后进行修改 PR 标题和描述内容。完成后点击 Create pull request 按钮。

image-20250517191503435

这样就可以创建一个新的PR了,然后就是等作者同意合并了。

可能会遇到的问题

reviewers 提出修改意见

提交 PR 很多时候会因为各种各样的问题不会被马上合入,Reviewers 会提出修改意见。这时可以返回去继续根据意见修改代码,然后通过执行和第一次 Commit 一样步骤的命令,GitHub 会自动把新增的 Commits 全部追加到一个未合入 PR 里去。

PR 产生冲突

每次写代码前应更新本地代码,尽量避免这种情况。但有时候 PR 被阻塞了一段时间,可能别人修改了一行代码,被抢先合入,这时候 PR 就出现冲突了。

现在本地执行:

1
2
3
4
5
6
# 先切回到 main 分支
git checkout main
# 拉取上游代码
git fetch upstream
# 更新本地 main
git rebase --hard upstream/main

本地的 main 分支就和远程的代码完全一致了,然后将 main 分支代码合入自己的分支,同时解决冲突。

1
2
git checkout <branch-name>
git rebase main

冲突部分内容一般会像以下这样:

1
2
3
4
5
6
7
1 <<<<<<< HEAD
2 Text 1.
3 Text 2 changed by me.
4 =======
5 Text 1 changed by other.
6 Text 2.
7 >>>>>>> from upstream/master

将其修改为你认为最好的结果。例如以下三种:

1
2
1 Text 1 changed by other.
2 Text 2 changed by me.
1
2
1 Text 1 changed by other.
2 Text 2.
1
2
1 Text 1.
2 Text 2 changed by me.

然后保存文件,再进行第一次 PR 操作即可。

1
2
3
git add .
git commit -s -m "Commit message"
git push origin <branch-name>

这里我推荐一个练习自己解决 PR 冲突的课程,自己看后觉得挺不错的。

使用 GitHub 上的合并冲突解决解决竞争性提交 - Training | Microsoft Learn

修改少量代码

记起之前部署 my-neuro 项目的时候遇到的 bug ,在评论区也看到很多人遇到这个问题,当时忘记 PR 了。

直接在原仓库找到想要修改的文件,然后选择修改。

image-20250518155921188

修改完毕后提交修改

image-20250518155955414

image-20250518160037074

这样节省了很多时间,不需要去 clone 原项目。