版本控制
特点
分类
Git
Git命令
本地库操作
设置签名
本地库初始化
本地库基本操作
分支操作
分支基本概念
分支基本操作
Git原理
哈希Hash算法
Git版本保存机制
Git分支管理机制
Git远程仓库
远程库基本操作
SSH免密登录
Git工作流
集中式工作流
GitFlow工作流
分支种类
Forking工作流
协同修改: 多人可以并行修改服务器端的同一个文件
数据备份: 不仅保存目录和文件的当前状态,还可以保存每一个提交过的文件的历史状态
版本管理:
在保存每一个版本的文件信息时要做到不保存重复数据以节约存储空间
提高运行效率
SVN采用增量式更新
Git采用文件系统快照的方式
权限控制:
对团队中参与开发的人员进行权限控制
Git可以对团队外开发者贡献的代码进行审核
历史记录:
查看修改人,修改时间,修改内容,日志信息
将本地文件恢复到某一个历史状态
分支管理:
允许开发团队在工作过程中多条生产线同时推进以提高效率
集中式版本控制工具: SVN, CVS, VSS等.存在单点故障问题
分布式版本控制工具: Git, Mercurial, Bazaar, Darcs等. 避免单点故障问题
大部分操作在本地完成,不需要联网
完整性保证
尽可能添加数据而不是删除和修改数据
分支操作非常便捷
全面兼容Linux命令
作用: 区分不同开发人员的身份
注意: 这个设置的签名仅仅用于区分开发人员的身份,和登录代码托管中新的用户名,email地址没有任何关系
命令:
仓库级别: 仅在当前仓库范围内有效. 信息保存在 .git/config文件中
系统用户级别: 在当前登录操作系统的用户范围内有效. 信息保存在 ~/.gitconfig文件中
签名优先级:
就近原则.仓库级别优先于系统用户级别,当两者都存在时采用仓库级别的签名
如果只有系统用户级别的签名,就采用系统用户级别的签名为准
不允许不设置用户级别,一般情况下只要设置系统用户级别即可
Git命令: git init
注意点: .git目录中存放的是本地库相关的子目录和文件,不能随意修改和删除
状态查看: git status
查看工作区和暂存区的状态
添加: git add filename
将工作区新建或者修改的文件添加到暂存区
提交: git commit -m “commit messsage” filename
将暂存区的内容提交到本地库
查看历史记录:
git log
git log --pretty=oneline
git log --oneline
git reflog
版本回滚:
基于索引值操作: git reset --hard 版本索引值
使用^符号: 只能向后回滚版本
git reset --hard HEAD^
一个 ^ 表示后退一步
使用~符号: 只能向后回滚版本
git reset --hard HEAD~n
n表示后退n步
git reset --xx命令三个参数:
soft: 仅仅在本地库移动HEAD指针
mixed: 不仅仅在本地库移动HEAD指针,还会重置暂存区
hard: 不仅仅在本地库移动HEAD指针,还会重置暂存区,也会重置工作区
找回删除的文件:
条件: 删除前,文件存在的状态已经提交到了本地库
找回: 使用命令 git reset --hard [指针位置]
如果删除操作已经提交到本地库,则将指针位置指向历史记录
如果删除操作尚未提交到本地库,则将指针位置参数设置为HEAD
文件比较:
git diff [文件名] : 将工作区的文件和暂存区的文件进行比较
git diff [本地库中历史版本] [文件名] : 将工作区文件和本地库历史记录进行比较
分支: 在版本控制中,使用多条任务线同时推进多个任务,这样的任务线叫作分支
分支的特点:
并行推进多个功能的开发,可以提高开发效率
各个分支在开发的过程中,彼此是独立的,不会影响其余分支,有很好的容错性
创建分支: git branch [分支名称]
查看分支: git branch -v
切换分支: git checkout [分支名称]
合并分支:
切换到目的分支 : git checkout 目的分支名称
将源分支合并到目的分支 : git merge 源分支名称
分支冲突:
修改分支冲突的文件,删除特殊符号
使用命令 : git add [文件名]
使用命令 : git commit(不能有文件名)
哈希Hash是一个系列的算法,各个不同的哈希算法加密程度不尽相同,但是都有以下共同点:
不管输入的数据量多大,输入同一个哈希算法,得到的加密结果长度是固定的
哈希算法确定,输入数据确定,那么输出的数据也是确定的
哈希算法确定,输入数据有变化,那么输出的数据也一定会有变化,并且变化很大
哈希算法是不可逆的
Git底层采用的哈希算法的SHA-1算法
哈希Hash算法用于验证文件的原理:
将原始文件作为输入通过哈希算法SHA-1获得结果
将网络传输中的目标文件作为输入通过哈希算法SHA-1获得结果
比对两次的结果,如果一致则说明文件验证正确,如果不一致,说明目标文件有损坏
Git就是通过这样的机制从根本上保证数据完整性
在集中式版本控制工具中,文件管理是以文件变更列表的方式存储数据,保存的信息是一组基本文件和每个文件随时间逐步累积的差异.属于增量式版本控制,可以节约服务器存储空间
Git中文件管理机制:
Git将数据保存为一个小型系统的快照
在Git中,每次提交更新时 ,Git都会对当前的全部文件制作一个快照并保存这个快照的索引
如果文件没有修改 ,Git不会重新存储该文件,而是保留一个链接指向之前存储的文件
Git文件管理机制属于快照流版本控制
Git分支管理的本质是创建和移动指针
初始化本地目录 : git init
推送操作 : git push [远程仓库地址] [远程分支]
克隆操作 : git clone [远程仓库地址]
完整将代码下载到本地
创建origin远程地址别名
初始化本地库
拉取操作 : git pull [远程仓库名称] [远程分支]
解决协同开发合并冲突:
如果不是基于远程库中项目的最新版所做的修改,推送项目时,会引起冲突,不能推送,必须先拉取pull再推送push
跨团队协同开发:
团队外成员:
点击Fork
将项目clone到本地修改,然后push到远程仓库分支
点击Pull Request
点击New Pull Request
点击Create Pull Request
团队拥有者:
查看Pull Request,点击Commits和Files changed查看项目的修改内容
确认无误后,点击Merge pull request合并代码
填写操作的日志信息,点击Confirm merge
将远程库操作拉取到本地
进入用户的root目录 : cd ~
运行命令生成 .ssh密钥目录 : ssh-keygen -t rsa -C [邮箱地址]
进入 .ssh目录 : cd .ssh
查看id_rsa.pub文件 : cat id_rsa.pub
复制id_rsa.pub中的内容
登录GitHub, 进入Settings, 点击SSH and GPG keys
点击New SSH Key, 粘贴复制的内容,完成SSH密钥设置
在项目开发实践中,使用Git的方式
集中式工作流类似SVN工作方式,以中央仓库作为项目所有修改的单点实体,所有的修改都提交到master分支上
这种方式与SVN的区别只是在于拥有本地库,很多Git的特性都没有使用到,是效率最差的Git工作流
GitFlow工作流通过为功能开发,发布准备,和维护设立独立的分支,让发布迭代过程更加顺畅
严格的分支模型也为大型项目提供了非常必要的分支结构
主分支 : master
主要负责管理正在运行的生产环境代码,永远保持与正在运行的生产环境完全一致
Forking工作流是在GitFlow的基础上,充分利用了Git的Fork和Pull Request的功能来达到代码审核的目的,更适合安全可靠地管理大团队的开发者,能够接受不信任贡献者的提交