目录
版本控制系统
1. 本地版本控制
2. 集中版本控制
版本库是集中放在中央服务器的,工作时用自己电脑从中央服务器得到最新的版本,工作完成后推送到中央服务器,必须联网,对网络带宽要求较高。一个服务器,容易出现单点故障,代表解决方案:SVN
3. 分布式版本控制
所有版本信息仓库全部同步到本地的每个用户,可以在本地查看所有历史版本,可以离线在本地提交,只需在连网时push到相应的服务器或其他用户那里。只要有一个用户的设备没问题,就可以恢复所有的数据,不会因为服务器损坏或者网络问题,造成不能工作的情况,但增加了本地存储空间的占用。
Git概述
1. 为什么需要Git
Git是分布式版本控制系统,没有中央服务器,每个人的电脑就是一个完整的版本库。
Git可以:
- 追踪和记载一个或多个文件的历史记录,帮助你管理不同的版本,随时回退到任意时刻;
- 并行协同开发,自动合并分支代码,代替人工解决机械重复的动作,提高工作效率
2. Git文件管理机制
Git的工作方式可以称之为快照流。Git把数据看作是小型文件系统的一组快照,每次提交更新时Git都会对当前的全部文件制作一个快照并保存这个快照的索引。为了高效,如果文件没有修改,Git不再重新存储该文件,而是保留一个链接(指针)指向之前存储的文件。
文件版本管理就相当于一个链条,在链条基础上,创建分支,即创建指针,切换分支,即切换指针指向的位置,这就是Git如此高效顺滑的奥秘了吧。
那么,Git是如何识别文件版本的差异?
Git使用哈希函数(SHA-1算法)来识别文件版本差异以及验证文件的完整性。
每个文件都会哈希得到一个哈希值,全部目录文件与其对应的哈希值构成树对象,树对象包含每一个文件,以及文件的哈希值,同时自己也生成一个哈希值,提交对象里面包含树对象,提交对象也生成自己的哈希值(类似比特币内部管理交易的工作机制)
每一个快照,都往前指向父节点,各个版本之间形成历史记录,就是通过各个版本间的父子关系建立的联系。
3. Git工作流程
Git有四个工作区域:
Workspace
工作区,平时存放代码的地方
Index(Stage)
暂存区,临时存放改动,事实上是一个文件,保存即将提交到文件列表的信息
Repository
本地仓库,安全存放数据的位置,存放所有提交的版本的数据。其中HEAD指向最新放入仓库的版本
Remote
远程仓库,托管代码的服务器,可以简单的认为是项目组中的一台电脑用于远程数据交换
本地搭建项目:
常用命令:
// 项目初始化,本地搭建项目
git init
//查看所有文件状态(Tracked /Untracked)
git status
//查看指定文件状态
git status [filename]
// 添加所有文件到暂存区
git add.
// 添加指定文件到暂存区
git add [filename]
//提交暂存区的内容到本地仓库
git commit -m"日志信息"
//查看修改日志
git log
// 克隆远程仓库到本地
git clone [url]
SSH公钥
设置本机绑定SSH公钥,实现免密码登录,安全连接
//生成SSH公钥
ssh-keygen -t rsa
生成SSH密钥在.pub文件中
Git 分支
Git 分支管理机制
各个分支在开发过程中,彼此独立,不会对其他分支有任何影响;
同时并行推进多个功能开发以及bug修复,提高开发效率
相关命令:
// 列出所有本地分支
git branch
// 列出所有远程分支
git branch -r
// 新建一个分支,但依然停留在当前分支
git branch [branch-name]
// 新建一个分支,并切换到该分支
git checkout -b [branch]
// 切换到该分支
git checkout [分支名]
// 合并指定分支到当前分支
git merge [branch]
// 删除分支
git branch -d [branch-name]
// 删除远程分支
git push origin --delete [branch-name]
git branch -dr [remote/branch]
大致流程:
- 初始化本地库后会有master分支,HEAD指针指向master,新建一个testing分支时,相当于新建一个指针指向同一个文件版本
- 切换分支,将HEAD指针指向testing分支支
- 提交只会影响testing分支,不会影响master分支
- 切换回master,将HEAD指针重新指向回master,效率高,只是移动一个指针,不涉及文件复制,master提交,分别指向不同的版本,形成分叉
- 分别进行不同分支的迭代
分支冲突问题
当修改了同一文件中的同一位置,Git 自动合并分支时无法选择版本,发生冲突
文件内部显示冲突:(HEAD指向当前分支状态)
解决:
分辨分支内容,删掉特殊符号,商讨修改文件
编辑文件,删除特殊符号
把文件修改到满意的程度,保存退出
git add [filename]
git commit “日志信息”(不带具体文件名)
Git 工作流----Gitflow
master分支
:主干,上线的代码是以master分支为准的
hotfix分支
: 生命周期短,及时线上解决master的bug,尽快合并回主干
release
:预发布分支
develop分支
:作为开发过程中的基准
feature_goldstyle 和 feature_game分支
:需要开发的新功能 ,不直接在master进行开发,创建新的分支进行代码迭代,之后将多个分支开发过程中做的修改合并回develop。
实际开发过程中可以选择性减少分支