针对 GitHub 中多人协作的仓库的开发流程的详细说明 ⑅︎◡̈︎*
背景
对于一个多人协作的公共仓库而言,正确的开发流程能够保证本地仓库和上游仓库(公共仓库)保持同步,由于我之前在往一个 Apache 项目提交 PR 的过程中出现了几次提交和同步的问题,因此在此做一些记录。
前提
由于本文内容针对多人协作的 公共仓库 进行说明,因此默认你此时满足:
- 已将
GitHub的公共仓库fork到自己的GitHub上 - 在本地已
clone或者下载上述任一仓库 - 在本地仓库配置
远程仓库 origin为 GitHub 上自己的仓库 - 在本地仓库配置
上游仓库 upstream为 GitHub 上的公共仓库 - 上述所有仓库的
主分支/默认分支均为master
本文的阐述建立在以上五点基础之上。
开发流程
每次需要进行代码改动的时候,严格按照以下步骤进行操作:
- 切换到本地仓库的主分支
- 拉取上游仓库代码(同步)
- 创建并切换到一个临时分支
- 代码修改
- 提交代码到远程仓库的临时分支
- 提交 PR (在 GitHub 进行)
- 合并 PR 后本地仓库切换到主分支
- 删除本地仓库和远程仓库的临时分支
A. 创建临时分支
$ git checkout master # 在本地仓库的目录下切换到默认分支/主分支
$ git pull upstream master # 同步上游仓库的最新内容到本地仓库
$ git checkout -b caymanhktemp
# 创建一个临时 branch ,名字是 caymanhktemp ,并切换到该临时分支
ps. git checkout -b caymanhktemp 命令相当于执行以下两步:
$ git branch caymanhktemp # 创建分支
$ git checkout caymanhktemp # 切换分支
使用该流程的原因:
远程仓库向上游仓库提交 PR ( Pull Request ) 的时候,PR 会按照 squash 的方式进行 merge ,如果不创建新的分支,远程仓库和上游仓库的提交记录将不能保持同步。
远程仓库的
commit数量会在第一次fork上游仓库之后累积,在远程仓库中会显示该仓库相对于上游仓库超前了 n 个 commits,并一直显示在每一次提交的 PR 信息中,严重影响上游仓库的管理员对于 PR 的审核。
我正是在这个地方出现了问题!因此中途出现多次重新下载上游仓库并进行配置,十分影响开发体验!
B. 提交修改内容
$ git add -A
$ git commit -m 'commit log'
$ git push origin caymanhktemp # 提交到远程仓库的临时分支 caymanhktemp 下
C. 提交 PR
在 GitHub 的远程仓库下的临时分支 caymanhktemp 推送 PR 到 上游仓库的 master 分支。
D. 删除临时分支
$ git checkout master # 在本地仓库的目录下切换到默认分支/主分支
$ git branch -D caymanhktemp # 强制删除本地的临时分支 caymanhktemp
$ git push origin --delete caymanhktemp # 删除远程仓库对应的临时分支 caymanhktemp
ps. 在第二步中使用的是 git branch -D caymanhktemp 而不是 -d ,其原因是使用 -d 时 Git 会检查本地仓库的 caymanhktemp 分支是否与上游仓库的 master 分支完全同步,由于在我们的开发过程中,其他人也会对公共仓库(上游仓库)进行代码提交,因此难以保证 caymanhktemp 与上游仓库的 master 保持同步(同时我们也不需要保证其同步)。-D 指令是 --delete --force 的简写,因此能够强制删除本地仓库的临时分支。
删除临时分支这一步非常重要!只有每次在完成 PR 的 merge 后都把临时分支删除了,才能够避免本地仓库和远程仓库的分支数量越攒越多,也能保证下次创建临时分支的时候仍旧使用该分支名 caymanhktemp 。
总结
总的来说,多人协作仓库的开发流程有以下几个特点:
开发前,保持本地仓库的主分支与上游仓库的主分支同步开发时,所有的开发工作都在本地仓库的临时分支下进行开发时,修改内容push到远程仓库对应的临时分支下开发时,提交远程仓库对应的临时分支到上游仓库的主分支下等待 merge开发后,merge 结束后删除本地和远程仓库的临时分支结果,本地仓库与上游仓库一致,远程仓库滞后(除非在未开发阶段将本地仓库推送到远程仓库,方能保持远程仓库与本地仓库一致)