GitHub 多人队伍合作详细教程
文章目录
- 开发规范
- 分支管理
- Commit message
- 任务划分
- 初始状态
- 场景一:队员与主仓版本保持同步
- 场景二:队员开发特定功能模块
- 场景三:队员提交 PR,请求与主仓合并
- 场景四:合并时出现冲突
- 场景五:版本回退
本文将分场景详细讲述如何通过 GitHub 实现多人队伍协同开发
示例中所使用的仓库是 shink/cooperation-test,欢迎加入,一起熟练 Git 的使用
开发规范
分支管理
为了规范开发、保持 commit 历史、方便后期维护,Git 的分支管理是必不可少的工作
分支管理示例:
main
分支:- 主分支,最终的、稳定的、经过测试没有 bug 的、可部署于生产环境的分支
- 只能由
release
和hotfix
分支合并,任何情况下都不能直接修改代码
dev
分支:- 主要开发分支,贯穿于整个项目的生命周期
- 始终保持最新版本,功能模块开发任务交给
feature
分支,测试任务交给release
分支
hotfix
分支:- 热修复分支,当
main
分支部署到生产环境后发生紧急状况,需要及时处理时,该分支负责热修复,即在保证应用不下线的条件下,对 bug 进行紧急修复 - 该分支以
main
分支为基线,修复 bug 后,合并到main
分支部署上线,同时也合并到dev
分支保持最新进度 - 命名规则:
hotfix/NAME
或hotfix-NAME
- 热修复分支,当
feature
分支:- 功能模块开发分支,对应于一个特定的功能模块
- 该分支以
dev
分支为基线,完成开发工作后再合并到dev
分支 - 命名规则:
feature/NAME
或feature-NAME
release
分支:- 预发布分支,在发布正式版本前进行全面测试和修复
- 该分支以
dev
分支为基线进行全面测试,若发生 bug 则可直接在该分支修复并提交 - 经过测试没有问题之后,合并到
main
分支部署上线,同时也合并到dev
分支保持最新进度 - 命名规则:
release/NAME
或release-NAME
分支名称 | 分支职责 | 基线分支 | 合并分支 |
---|---|---|---|
main
|
主分支 | - | - |
dev
|
开发分支 | main | - |
hotfix
|
热修复分支 | main | main, dev |
feature
|
功能模块开发分支 | dev | dev |
release
|
预发布分支 | dev | main, dev |
总结:
main
分支和dev
分支都贯穿于整个项目的生命周期hotfix
、feature
、release
分支都是临时分支,分别负责热修复、功能模块开发、预发布
下图很好地展示了在时间轴上各分支的职责划分情况
Commit message
每次 commit 到本地库时,必须添加 commit message,以对本次提交做出说明
在团队合作时,commit message 的书写格式也应当遵守相应规范,清晰明了的 commit message 有利于快速定位提交、自动生成 change log 文档
下图是 Angular 规范
具体的规范说明可参考阮一峰老师的博客:Commit message 和 Change log 编写指南
任务划分
团队合作中,合理的划分任务有助于项目顺利开展
下面以一个二人队伍为例(队长 A 和队员 B),多人队伍的话其他队员操作同队员 B
队长 A 的任务:
- 统一规范,包括命名规范、文档规范等
- review 代码,维护 issue 和 PR,管理
main
分支和dev
分支 - 承担部分开发任务
队员 B 的任务:
- 承担主要开发任务,完成系统功能
初始状态
以队长 A 的仓库为基准,首先队员 B Fork 队长 A 的项目仓库
假设仓库初始状态为:main
分支和 dev
分支下分别只有 README.md
文件
┌── main: README.md│└── dev: README.md
开始时首先 clone 远程仓库到本地
git clone https://github.com/user/repo.git
clone 完之后,可以看到本地仓库中只有 main
分支
git branch* main
通过下列命令查看所有分支
git branch -a* mainremotes/origin/HEAD -> origin/mainremotes/origin/devremotes/origin/main
可以看到远程仓库中虽然有 dev
分支,但是本地仓库中并没有分支与远程仓库的 dev
分支关联
通过下列命令在本地仓库中创建并切换到 dev
分支
git checkout -b dev origin/dev
此时,在本地分支中就可以看到 dev
分支了
git branch* devmain
场景一:队员与主仓版本保持同步
在开始工作前,须先拉取当前当前分支的最新版本,保证代码是最新版本
以队员 B 为例:
添加主仓的远程仓库地址
git remote add upstream https://github.com/captain_a/project.git
查看当前仓库所连接的远程仓库
git remote -v
此时,当前仓库所连接的远程仓库为:
origin https://github.com/member_b/project.git (fetch)
origin https://github.com/member_b/project.git (push)
upstream https://github.com/captain_a/project.git (fetch)
upstream https://github.com/captain_a/project.git (push)
切换到 dev
分支
git checkout dev
获取 upstream 的最新内容
git fetch upstream dev
合并
git merge upstream/dev
至此,dev
分支就包含最新版本代码了(main
分支同理)
场景二:队员开发特定功能模块
在开发阶段,应当尽量避免发生冲突,同时保持 commit 历史的干净整洁,善用
git rebase
命令可以保证 commit 历史更加清爽,rebase 的同时还是可以 squash,将逻辑相似的多个 commit 合并到一个 commit,并附上描述性更强的 commit message, 这样 commit 历史就会非常清晰、一目了然了
以队员 B 开发登录模块为例
在本地创建 feature/login_module
分支,首先切换到 dev
分支
git checkout dev
以 dev
分支为基线,创建 feature/login_module
分支,并切换到该分支
git checkout -b feature/login_module
查看各分支情况
git branch -vdev 333e2b6 Init README.md
* feature/login_module 333e2b6 Init README.mdmain 333e2b6 Init README.md
将该分支 push 到远程仓库
git push origin feature/login_module:feature/login_module
假设队员 B 完成了开发任务,创建了 login_module.txt
文件
echo "login module finished" > login_module.txt
add 到暂存区
git add login_module.txt
commit 到本地库
git commit -m "login module finished"
push 到远程仓库
git push origin feature/login_module
在 GitHub 页面可以看到提交成功了
场景三:队员提交 PR,请求与主仓合并
队员 B 已经在自己的仓库中完成了功能模块的开发,但并没有合并到队长 A 的仓库中,因此队长 A 目前还无法看到队员 B 所做的工作
队员可以提交 PR,即 Pull Request,请求与主仓进行合并
在提交 PR 时,PR 中尽量只包含一个 commit
此时,队员 B 可以选择先将 feature
分支合并到 dev
分支,再提交 PR,请求合并到主仓的 dev
分支,即
member_b:dev -> captain_a:dev
也可以请求将 feature
分支合并到主仓的 dev
分支,即
member_b:feature -> captain_a:dev
还可以请求将 feature
分支合并到主仓的 feature
分支,即
member_b:feature -> captain_a:feature
这主要取决于主仓是否需要保存临时分支,以及谁负责解决冲突
下面以第一种情况进行演示,即队员 B 先将 feature
分支合并到 dev
分支,再提交 PR,请求合并到主仓的 dev
分支
首先切换到 dev
分支
git checkout dev
合并 feature
分支
git merge feature --no-ff
merge 时推荐加上
--no-ff
选项,避免feature
分支扰乱dev
分支的 commit 历史
若加上了 --no-ff
选项,会自动创建一个 merge 的 commit 记录
输入 commit 信息后,按 Ctrl + O
将 commit 信息保存到 MERGE_MSG
文件中,Ctrl + X
退出
push 到远程仓库
git push origin dev
可以看到清爽的 commit 历史:
接下来就是提交 PR 阶段了
首先队员 B 在自己的 GitHub 仓库中点击 New pull request
按钮创建 PR
选择分支,然后点击 Create pull request
按钮
填写 title 和 comment后,点击 Create pull request
按钮即可提交 PR
接下来,队长 A 需要打开该 PR 并 review 代码,如果没有问题并且没有冲突则可允许 merge
其中,Merge pull resquest 有三个选项:
Create a merge commit
:表示把这个 PR 作为一个分支合并,并保留分支上的所有提交记录Squash and merge
:表示只为这次合并保留一个提交记录Rebase and merge
:找到两个分支共同的祖先,然后在当前分支上合并从共同祖先到现在的所有 commit
三个选项的不同点:
Create a merge commit
:不能保持 main 分支干净,但是保留了所有的 commit history,当 PR 中 commit 次数较多时不推荐此方式Squash and merge
:也可以保持 main 分支干净,但是 main 中 author 都是 maintainer,而不是原 authorRebase and merge
:可以尽可能保持 main 分支干净整洁,并且易于识别 author
这里选择 Rebase and merge
merge 完成后该 PR 就自动 closed 了,合并工作完成
队长更新本地仓库,在 dev
分支下,拉取最新代码
git pull origin dev
此时,主仓中的 commit 历史如图所示:
场景四:合并时出现冲突
冲突产生有两种情况:
- 两个分支都修改了同一文件(不管什么地方)
- 两个分支都修改了同一文件的名称
对于产生的冲突,需要手动修改冲突代码
解决冲突之后,还需要 add 并 commit
git add CONFLICT_FILEgit commit -m "fix conflict"
场景五:版本回退
有时候当前版本可能有许多 bug,不得不重新从头开始工作,这时候就需要先回退到上一版本
git reset
命令可以将当前 branch 回退到之前某一个 commit 节点
回退到上一版本
git reset HEAD^
其中,HEAD^
表示上一个版本,HEAD^^
表示上上个版本,HEAD~100
表示前 100 个版本
另外,还可以使用以下命令回退到指定版本
git reset 版本号
版本号可以通过以下命令查看
git log --oneline
另外,git reset
还有三个选项:
--soft
: 仅回退本地库中的内容,相当于撤销git commit
--mixed
: (默认方式)同时回退本地库和暂存区内容,相当于进一步撤销git add
--hard
: 同时回退本地库、暂存区和工作区内容,相当于进一步撤销本地仓库文件夹中的改动
注意:回退版本后,日志中就会删除回退前版本的 commit 记录,如果想查看回退前的版本记录,可以使用如下命令查看
git reflog
GitHub 多人队伍合作详细教程相关推荐
- GitHub+Hexo 搭建个人网站详细教程
原文链接 GitHub+Hexo 搭建个人网站详细教程 前言: 随着互联网浪潮的翻腾,国内外涌现出越来越多优秀的社交网站让用户分享信息更加便捷.然后,如果你是一个不甘寂寞的程序猿(媛),是否也想要搭建 ...
- 最新hexo+github搭建个人博客详细教程
最新hexo+github搭建个人博客详细教程 这是作者自己利用hexo+github搭建博客的完整过程,对自己搭建过程中踩过的坑做一个简单记录. 本人博客最终展示效果:https://huanyay ...
- github多人协作开发项目教程,2021新版。
文章目录 github多人协作开发项目教程 文章目录 文章目录 一. 必要理论知识 二. 进行实操 1. 管理者方面 2. 成员方面 三. 总结 一. 必要理论知识 github合作开发,在实操之前, ...
- GitHub-Hexo-搭建个人博客史上最详细教程
GitHub+Hexo 搭建个人网站详细教程 更多精彩内容欢迎访问我的个人博客皮皮猪:http://www.zhsh666.xyz或者http://www.zh66.club期待您的光临哦!我是皮皮猪 ...
- 【转载】GitHub详细教程
1 Git详细教程 1.1 Git简介 1.1.1 Git是何方神圣? Git是用C语言开发的分布版本控制系统.版本控制系统可以保留一个文件集合的历史记录,并能回滚文件集合到另一个状态(历史记录状态) ...
- Github详细教程
文章目录 一.参考教程汇总 二.Git详细教程 2.1 工作区/暂存区/版本库的概念 2.2 Git创建仓库的两种方式 2.3 Git删除仓库 2.4 SSH Key的配置方法 三.常用命令 3.1 ...
- GitHub 详细教程
GitHub发现开源项目,提高工作效率 本文是<learn-github-from-zero>读书笔记,做了一些简洁化修改. 主要内容是GitHub页面介绍.Git Bash基础命 ...
- Github + Hexo 搭建个人博客超详细教程
Github + Hexo 搭建个人博客超详细教程 本文目录 generated with DocToc 网站搭建 本文目录 1.安装node.js 2.添加国内镜像 3.安装Git 4.注册Gith ...
- 从Git的下载到使用github详细教程
本篇主要针对git初学者,主要内容是从Git的下载安装到使用github的详细教程. 有些朋友可能使用过SVN,Git和SVN类似,是一种版本控制系统,一般软件从业者应该比较熟悉,但是如果是非软件从业 ...
最新文章
- 那些财务眼中的SAP
- 本程序主要实现了一个方阵的求逆与实现了逆矩阵和原矩阵的乘积为单位矩阵
- 怎样用计算机算分数乘分数,《分数乘分数》教案.pdf
- Unity3D 4.x 使用Mecanim实现动画控制
- lambda python_Python | Lambda和filter()与示例
- mvc上传图片(上传和预览)webuploader
- 最简单判断系统大小端
- NLP学习—22.Transformer的代码实现
- Kubernetes安装部署
- c语言中32位整数用谁标识,int占几个字节
- VMware虚拟机通过光盘PE安装GHOSTxp
- U盘PE安装原版Win10系统
- 区块链学习笔记12——BTC思考
- 脑机接口的过去、现在与未来
- s20赛季服务器维护,王者荣耀S20赛季什么时候结束 S20赛季具体结束日期
- 常用SEISMIC BINARY数据的读取
- 【代码审计】--- php代码审计方法
- 如何解决网站文字禁止复制?插件:Enable Copy v1.15
- 来 给朕手写一个OOM异常的栗子
- SDL2常用函数结构分析:SDL_TextureSDL_CreateTextureSDL_UpdateTexture
热门文章
- 获取微信公众号未群发文章的永久URL链接
- 【历史上的今天】1 月 4 日:Linux 2.4 内核发布;创世区块诞生;苹果开放 Macintosh 系统授权
- RFID之linux下利用PN532对M1卡(饭卡,
- geotrust与comodo性能及价格对照
- 用python编写一段代码,实现数据对调
- 华为上半年营收增长30%!美国对华为禁令宣告彻底破产
- vba便捷使用 -- 修改没有母版的 ppt
- js 打印倒立三角形
- 电影业的双十一来了!马云终于照顾到单身狗了!
- 正当防卫4无法启动程序因为计算机中丢失,正当防卫4计算机丢失api-ms-win-core解决方法...