版本控制的起源
- 现在的软件项目通常是由一个研发小组共同分析,设计,编码,维护以及测试的
- 针对团队开发需要解决以下问题:
- 备份多个版本,费空间,费时间
- 难以恢复至以前正确版本
- 难以解决代码冲突困难
- 难以追溯问题代码的修改人和修改时间
- 无法进行权限控制
- 项目版本发布困难
- 源代码管理工具就是为了解决上述问题应运而生的
版本控制
- 是维护工程蓝图的标准做法,能追踪工程蓝图从诞生一直到定案的过程,是一种记录若干文件内容变化,以便将来查阅特定版本修订情况的系统
- 如果是团队开发,使用版本控制是强制性的
- 如果是单人开发,也强烈建议现在就开始使用版本控制
- 使用版本控制
- 不会对现有工作造成任何损害
- 不会增加工作量
- 添加新的功能拓展时,会变得更加容易
常见版本控制工具
- CVS开启版本控制之门
- SVN集中式版本控制之王者
- 又称subversion,是CVS的接班人,是一款
集中式
源代码管理工具,曾经是绝大多数开源软件的代码管理工具,前几年在国内软件企业使用最为普遍
- 又称subversion,是CVS的接班人,是一款
- GIT分布式版本控制之伟大作品
- 一款
分布式
源代码管理工具,目前国内企业几乎都已经从SVN到GIT的转换
- 一款
- 分布式与集中式最大的区别
- 在集中式下,开发者只能将代码提交到服务器,在分布式下,开发者可以在本地提交
- 在集中式下,只有远程服务器上有代码数据库,在分布式下,每个开发者机器上都有一个代码数据库
Git和SVN的简单对比
- 速度
- 在很多情况下,git的速度远远比SVN快
- 结构
- SVN是集中式管理,git是分布式管理
- 其他
- SVN使用分支比较笨拙,git可以轻松拥有无限个分支
- SVN必须联网才能正常工作,git支持本地版本控制工作
- 旧版本的SVN会在每一个目录置放一个.svn,git只会在根目录拥有一个.git
Git简介
- GIT是一款自由和开源的
分布式
版本控制系统,用于敏捷高效
地处理任何或小或大的项目 - 在世界上所有的分布式版本控制工具中,git是最快,最简单,最流行的,是Linux之父李纳斯的第二个伟大作品
Git工作原理
-
工作区(Working Directory): 仓库文件夹里面,除了
.git目录
以外的内容 -
版本库(Repository): .git目录,用于储存记录版本信息
- 版本库中的暂缓区(stage)
- 版本库中的分支(master): git自动创建的第一个分支
- 版本库中的HEAD指针: 用于指向当前分支
GIT单人开发
准备工作(只做一次)
- 创建一个工作区
- 在工作区中打开git终端
- 通过git init指令,初始化版本库
- 通过git config user.name "姓名" / git config user.email "邮箱"设置用户名和邮箱
- 通过git config -l查看设置情况
开发阶段
- 编写代码
- 通过git add 文件名 / git add .添加到版本库的暂缓区中
- 通过git commit -m"说明"将暂缓区的文件添加到HEAD指针指向的分支中(默认只有一个分支,master分支,也称之为主分支)
注意点
- 不是写一句代码就add commit一次,应该是完成一个功能后在add commit
- commit时-m注释一定要认真编写,与当前提交内容保存一致
单人使用Git管理项目好处
- 可以通过git status查看哪些文件没有被管理,修改了哪些文件,红色(没有被管理或者被修改了),绿色(在暂缓区)
- 可以通过git diff查看具体修改了哪些代码
- 可以通过git log / git reflog查看项目演变历史
- 可以通过git reset --hard 版本号在任意版本之间切换
- 无需备份多个文件,每次commit提交Git会自动备份
多人开发
在远程服务器上创建一个共享版本库
- 项目负责人打开远程的服务器,然后创建一个工作区
- 在远程服务器上打开工作区,在工作区中打开Git终端工具
- 在Git终端工具中输入 git init --bare
- 经过以上几步,就代表远程服务器上的共享版本库已经创建好了
开发人员下载远程版本库
- 开发人员在自己的电脑上打开Git终端工具
- 从远程服务器上下载当前项目的共享版本库 git clone 远程服务器共享版本库的地址 (和单人开发使用Git的区别:单人开发是自己创建版本库,而多人开发是从远程服务器下载版本库)
开发阶段(和单人开发一样)
- 设置用户名和邮箱
- 编写代码
- git add . 添加到暂缓区
- git commit -m 添加到HEAD指针指向的分支
- 注意点
- commit是将编写好的代码提交到本地的版本库,所以其他的开发人员是拿不到我们提交的代码的
- 如果想让其他开发人员也能拿到我们提交的代码,还必须将编写好的代码提交到远程的服务器
- 通过 git push 将代码提交到远程的服务器
- 其他开发人员只需要通过 git pull 就可以拿到更新的代码了
多人开发使用Git注意点
- 不能将不能运行的代码提交到本地和远程服务器
- 如果服务器上有其他开发人员的更新内容,那么我们不能直接通过push将我们的代码提交到服务器
- 如果服务器上有其他开发人员更新的内容,我们必须先将其他开发人员更新的内容更新到本地之后才能通过push提交我们的内容
- 如果我们更新的内容和其他同事更新的内容有冲突(修改了同一文件的同一行代码),这个时候需要我们自己手动修改冲突,修改完冲突后才能将代码提交到远程服务器
- 只要开发完了一个功能就要立即提交代码,因为在企业中谁后提交谁就负责解决冲突,谁的工作量就会变大
Git分支使用
如何查看有多少个分支
- 通过git branch指令就可以查看当前的版本库中有多少个分支
- 如果当前的版本库是空的,无法查看
- 如果通过git branch指令查看当前的版本库中有多少个分支,输出的内容中哪一个分支前面有*号就代表当前的HEAD指针指向哪一个分支,我们提交的代码就会提交到指向的分支中
如何创建一个分支
- 通过git branch 分支名称 来创建一个新的分支
- 在哪个分支中创建了新的分支,那么创建出来的新的分支就会继承当前分支的所有状态
- 例如
- 在master分支中做了两个操作,然后在master分支中创建了Dev分支,那么创建出来的Dev分支就会继承master分支中的这两个操作
- 一旦分支被创建出来之后,分支就是独立的,分支之间不会相互影响
如何切换分支
- 通过git switch 分支名称 来修改HEAD指针的指向
- 只要HEAD指针的指向发生了改变,那么commit的代码就会发生改变
- HEAD指针指向谁commit提交的代码就提交到哪个分支中
如何合并分支
- 可以通过git merge 分支名称 来合并分支
- 例如
- 在master分支中执行 git merge Dev就代表需要将Dev分支中的代码都合并到master分支中
- 在Dev分支中执行 git merge master就代表需要将master分支中的代码都合并到Dev分支中
如何删除分支
- 通过git branch -d 分支名称 来删除本地的分支
- 通过git push origin --delete 分支名称 来删除远程服务器的分支
Gitflow工作流程
准备阶段
- 初始化远程工作区和共享版本库
- 项目经理初始化项目,并在master定制标记
- 将master分支提交到远程服务器
- 项目经理基于master分支创建Develop分支
- 项目经理将新建的分支提交到远程的服务器
- 项目经理给开发人员分配工作
开发阶段
- 开发人员基于develop分支创建功能分支
- 开发人员在自己的分支上add commit push
- 开发完成告诉项目经理,由项目经理审核代码并合并到develop分支
准备上线阶段
- 项目经理基于develop分支创建release分支
- 测试人员获取release分支代码进行测试
- 发现bug由开发人员基于release分支创建bugfix分支进行修复
- 开发人员修复完成后重新合并到release分支
- 项目经理将测试和修复完所有bug的最终代码合并到master分支和develop分支
正式上线阶段
- 项目经理给master分支制定标记
- 项目经理将标记提交到远程服务器
- 项目完成上线
上线之后
- 项目上线后如果出现了紧急bug
- 基于master分支创建hotfix分支,在该分支上修复bug
- 修复完成后重新合并到master分支和develop分支
- 项目经理在master分支定制标记
网友评论