背景
如果在GitHub上看到了一个有趣的项目,想要参与开发,我们一般需要遵照一定的流程。这里记录一下一般的项目合作开发流程。
当然这里的流程不仅适用于GitHub,也适用于其他的代码托管平台,如GitLab等。
前置条件
- 已经安装了Git
- 已经注册了GitHub账号
Git设置
-
设置用户名和邮箱
设置用户名和邮箱有两种模式。
-
如果你只用一个GitHub账号,可以设置全局用户名和邮箱。
1 2
git config --global user.name "Your Name" git config --global user.email "Your Email"
-
如果你有多个GitHub账号,可以给每个Git仓库分别设置用户名和邮箱。
1 2 3
cd /path/to/your/repo git config user.name "Your Name" git config user.email "Your Email"
-
-
登录凭证管理
在上一步设置好用户名和邮箱后,在克隆仓库以及每次
git push
时,都需要输入GitHub的用户名和密码,这样很麻烦。可以使用凭证管理器来保存用户名和密码。-
Windows
如果你安装的Git版本号高于
2.29
,那么Git中已经集成了对GitHub OAuth的支持。当你第一次通过HTTPS方式克隆一个GitHub私有仓库时,Git会提示你使用浏览器登录GitHub,并授权Git访问你的GitHub账号。之后,Git会自动保存你的GitHub凭证,不需要再次输入用户名和密码。 -
macOS
你需要安装
Git Credential Manager
。可以在终端中运行以下命令:1
brew install --cask git-credential-manager
安装完成后,当你第一次通过HTTPS方式克隆一个GitHub私有仓库时,Git会提示你使用浏览器登录GitHub,并授权Git访问你的GitHub账号。之后,Git会自动保存你的GitHub凭证,不需要再次输入用户名和密码。
-
GitHub合作开发流程
GitHub网页上的操作 —— Fork
-
打开你想要参与开发的项目的GitHub页面,点击右上角的
Fork
按钮,将项目fork到自己的GitHub账号下。 我们把原项目称为原始仓库
,把自己fork过来的项目称为Fork仓库
。 -
在自己的GitHub账号下,找到fork过来的项目(即
Fork仓库
),点击Clone or download
按钮,复制项目的URL。
本地操作 —— Clone
-
在本地的终端中,切换到你想要存放项目的目录,运行以下命令,将项目克隆到本地。
1
git clone https://github.com/your-username/project-name.git
这里的
your-username
是你的GitHub用户名,project-name
是项目的名字。 -
进入项目目录,运行以下命令,将
原始仓库
添加为远程仓库。1
git remote add upstream https://github.com/authors-usename/project-name.git
这里的
authors-username
是原始仓库
的作者的GitHub用户名,project-name
是项目的名字。然后运行以下命令,查看远程仓库的情况。
1
git remote -v
如果一切正常,你会看到类似以下的输出:
1 2 3 4
origin https://github.com/your-username/project-name.git (fetch) origin https://github.com/your-username/project-name.git (push) upstream https://github.com/authors-username/project-name.git (fetch) upstream https://github.com/authors-username/project-name.git (push)
这里的
origin
是你的Fork仓库
,upstream
是原始仓库
。
本地开发
-
在本地的终端中,切换到项目目录,运行以下命令,创建一个新的分支。
1
git checkout -b new-branch-name
这里的
new-branch-name
是你的新分支的名字,它可以是你要添加的新功能的名字,也可以是你要修复的bug的名字。 -
在本地的终端中,进行开发,修改代码/添加新功能/修复bug。然后运行以下命令,将修改的文件添加到暂存区以及提交到本地仓库。
1 2
git add . git commit -m "Your commit message"
也可以把本地仓库的修改推送到
Fork仓库
。1
git push origin new-branch-name
-
重复第2步的操作,直到你的新功能/bug修复完成。
-
现在我们已经可以创建Pull Request了,但在创建Pull Request之前,为了确保我们的新代码在合并进
原始仓库
时不产生冲突,我们最好拉取原始仓库
的main
分支的最新代码,然后可以在本地合并main
分支的最新代码到自己的new-branch-name
分支。1 2 3 4
git checkout main git pull upstream main git checkout new-branch-name git merge main
在做这一步时,如果从你开始开发新功能到现在,
原始仓库
的main
分支有新的提交,那么你的new-branch-name
分支可能会产生冲突。你需要解决这些冲突。 解决冲突后,运行以下命令,将修改的文件添加到暂存区以及提交到本地仓库。1 2
git add . git commit -m "Your commit message"
然后再次运行以下命令,将修改的文件推送到
Fork仓库
。1
git push origin new-branch-name
这样,你的
new-branch-name
分支向原始仓库
的main
分支合并时就不会产生冲突了。
GitHub网页上的操作 —— Pull Request
-
打开你的
Fork仓库
的GitHub页面,点击New pull request
按钮,创建一个新的Pull Request
。注意如果原始仓库
提供了Pull Request
模板,你需要按照原始仓库
的Pull Request
模板填写Pull Request
的标题和内容。 -
等待
原始仓库
的作者审核你的Pull Request
,如果有需要,你需要根据原始仓库
的作者的反馈进行修改。 -
如果
原始仓库
的作者接受了你的Pull Request
,恭喜你,你的代码将会被合并到原始仓库
中。
本地操作 —— 更新本地仓库
-
在本地的终端中,切换到
main
分支,运行以下命令,将原始仓库
的main
分支的最新代码拉取到本地。1 2
git checkout main git pull upstream main
你也可以先使用
git fetch upstream main
命令,查看原始仓库
的main
分支的最新代码,然后再使用git merge upstream/main
命令,将原始仓库
的main
分支的最新代码合并到本地的main
分支。1 2 3
git fetch upstream main git checkout main git merge upstream/main
这样,你本地的
main
分支就和原始仓库
的main
分支保持了同步。 -
然后你可以把本地的
main
分支推送到Fork仓库
。1
git push origin main
-
(可选)如果你的
new-branch-name
分支已经被合并到原始仓库
的main
分支,你可以删除new-branch-name
分支。1
git branch -d new-branch-name
你也可以删除
new-branch-name
分支的远程分支。1
git push origin --delete new-branch-name
这样,你就完成了在Github上和别人合作添加一个新功能/修复一个bug的工作。
继续开发新功能/修复新bug
如果需要继续添加新功能/修复新bug,可以先将自己Fork仓库
的main
分支与原始仓库
的main
分支同步,确保你从项目最新的版本开始工作:
```bash
git checkout main
git pull upstream main
git push origin main
```
然后,你可以在main
分支上创建一个新的分支,继续开发新功能/修复新bug。
```bash
git checkout -b another-new-branch-name
```
后面的操作就和本地开发之后的一样了。