针对 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 结束后删除
本地和远程仓库的临时分支
结果
,本地仓库与上游仓库一致
,远程仓库滞后
(除非在未开发阶段将本地仓库推送到远程仓库,方能保持远程仓库与本地仓库一致)