git是一个版本控制工具,目前常用的版本控制工具有集中式版本控制工具代表SVN和分布式版本控制工具git
版本控制工具出现的原因,项目需要进行迭代,团队需要进行协作开发
版本控制工具跟普通文件管理系统的差距就是他不仅可以管理文件还可以对文件内容进行监控管理
版本控制工具的优势:
- 协同开发:允许多人对同一个文件进行修改,并保留各自的修改内容
- 数据备份:使用版本控制工具对文件进行一次提交和保存都会有历史记录,每个历史记录保留着当时的文件状态,提交者,提交时间,修改了什么内容
- 版本管理:不会允许提交重复的文件数据,SVN对文件内容采用的是增量式管理,而git采用的是文件快照(如果文件没有修改就会通过指针指向之前的文件,在该版本中只是保存了一个地址指向未修改的文件,修改后就会产生一个新的)的形式
- 权限控制:对团队中不同的人员进行权限分配,git还可以对团队外人员贡献的代码进行审核,SVN没有审核功能
- 分支管理
版本控制是一个思想,最早是从工程设计发明的,后来被计算机开发所借鉴,一个工程是不能一次性就设计完美,而是需要进行不断的修改迭代
git和svn的优劣势:svn只有一份文件存储在服务器上,开发人员需要从服务器下载到本地然后把自己的修改提交的服务器才能完成开发过程,是一个集中式的管理过程,而git是一个分布式的管理,服务器上依然有一份代码,开发人员也需要从服务器下载下来但是可以本地就完成开发任务,最后大家一起上传合并。这样就解决了一个问题,万一服务器挂了,使用git进行版本控制依然可以在本地完成开发,而svn就不能,这就是svn单点故障缺陷。git可以在本地就完成版本控制
git的历史
- git使用的是linux内核,早期linux是开源的内核,很多开发者都会对linux进行代码贡献,最早是由linux的创始人Linus 托马斯把这些代码进行手动合并,可是后代系统越来越庞大,一个人根本没有办法去完成这么大的工作量,急需一个版本控制工具来对这些贡献的代码进行合并,这个时候一家叫bitMove的公司出于人道主义精神提交了一个免费的版本控制工具给linux使用,但是要求不能进行**,但是linux代码的贡献者都是社区大佬,不仅去**了还被这个bitMove公司发现了,bitMove公司就把这个免费版本给收回了,不给用了,linus 托马斯没办法,版本控制工具用肯定是要使用的,于是就自己使用c语言自己开发了git
- 2008年github代码托管服务器上线了
git优势
- git不需要联网,在本地就可以进行版本控制,本地库拥有所有的版本提交历史
- 兼容linux命令
- 完整性保存,每次提交都有hash加密,每个的hash值都是不一样的
- 分支操作流畅
git版本控制工具区分
git本地库(自己pc上)和远程库(代码托管服务器上如github,码云,gitlab)进行交互场景
1.团队内部协作
2.跨团队协作
git命令行操作
- 在一个文件夹打开git bash
- 输入git init对本地库进行初始化
- 每个pc上都有git签名配置,配置用户名和邮箱,这个用户名和邮箱只是为了用来区分用户没有实际作用,跟登录github这些代码托管中心的账户无任何关系,git签名有全局配置和项目配置,优先级是就近原则,
- 项目配置命令:git config user.name "name" git config user.email "[email protected]"
- 全局配置命令:git config --global user.name "name" git config global user.email "[email protected]"
- 查看命令:git config --global user.name git config --global user.email
git常用命令
- git status
查看工作区和暂存区的状态,文件没有提交到暂存区git就不会进行追踪,在工作区会有丢失的风险,git命令提示一般会飘红
- git add 文件名
把文件从工作区存入暂存区
- git rm --cached 文件名
把文件从暂存区移出到工作区
- git commit 文件名或者git commit -m "提交"
把暂存区的文件存到本地库
- git help 某个命令
用来查看命令文档
- git diff 文件名
用来比较文件修改的差异,比较的是工作区和暂存区某个文件进行比较
- git diff 某个历史记录(可以是HEAD^也可以是历史记录的hash值) 文件名
用来比较文件修改的差异,比较的是工作区和某个版本的某个文件进行比较
- git diff
用来比较文件修改的差异,比较的是工作区和暂存区的文件进行比较,不跟文件名参数,所有差异的文件都会列出
-
1
-
1
git的一些标识
- HEAD
在版本控制过程中指向当前所在的版本
- hash值
每一个版本都有一个独一无二的hash用指向该版本的一些信息,比如提交时间,提交者,提交时的备注
- 1
- 1
- 1
linux操作常识
- vim是linux自带的文本编辑器,使用vim打开文件后,敲i键就可以进行编辑,按esc出现命令操作,w保存编辑的内容,q退出vim编辑器
- linux多屏控制,空格向下翻页,b向上翻页,q退出
git版本前进后退,本质操作的是HEAD的指向,HEAD一般是指向当前版本
有3种方法
- 基于索引值操作(推荐):git reset --hard 索引值
- 用^只能后退,,一个^表示后退一个版本,按个数后退版本:git reset --hard HEAD^
- 用~也是只能后退用于解决后退多个版本:git reset --hard HEAD~3
- 备注:其实除了--hard还有其他几个参数比如soft和mixed他们的作用就是修改的重置的地方有区别比如工作区和暂存区,本地库之间的重置差异,推荐--hard
git找回删除的文件,提交到版本库后删除的文件找回
- 新增一个文件然后git add 和 git commit提交到本地库
- 然后删除文件,使用git add 和 git commit 把删除记录提交到本地库
- 这样就是完整的删除操作
- 找回原理就是把本地库的版本回退到之前的版本也就是操作HEAD指针
- 另一种场景就是我们提交到暂存区并没有提交到本地库,这个时候文件被删除想要找回,也是版本回退,回退到当前版本就行git reset --hard HEAD 利用的就是--hard参数的效果他会刷新本地库、暂存区、工作区
- 备注:因此需要找回一个文件的前提就是删除操作记录是否提交到本地库或者暂存区,找回原理就是依据的HEAD指针调整
git是以行为单位对我们的文件进行管理的
修改的每一个记录都会删除该行然后新增一行
git分支操作,及常用命令
- 一个git仓库创建好了就会自带一个master分支,被称为主分支
- 创建分支命令git branch 分支名
- git branch -v查看当前所有的分支和个分支所在的本地库版本
- 切换当前所在分支命令git checkout 分支名
- 在哪个分支上新建一个分支就会把该分支所有内容添加到新创建的分支上,历史记录也会保持一致,一般开发一个新功能都会新建一个新的分支,开发完成之后把分支合并到之前的分支上,这样才是一个完整的开发过程
- 合并分支的命令,把开发好功能的A分支合并到B分支上,操作步骤
- 切换到B分支上git checkout B
- 执行merge命令git merge A
- git合并冲突解决
- 冲突产生原因:多个分支同时推进时修改了同一个文件的同一个位置,这个时候git就不知道听谁的修改,就会产生冲突
- 冲突表现
- 解决冲突的步骤:打开冲突的文件,把文件修改到自己满意的程度,保存,使用git add 文件名提交到暂存区,然后使用git commit -m "提交日志" 提交到本地库,注意此处commit不需要文件名,比较特殊,这个commit其实就是你确认修改的解决冲突的标志告诉git程序你已经解决好了冲突
- 1
- 1
git基本原理解析-哈希
哈希是一种加密算法,种类比较多,比如MD5、SHA-1
git采用的是SHA-1
每一个commit版本都会有一个哈希值,这个哈希值是又多个文件的哈希值进行加密得到的,内部原理类型如下:首先对版本里面的所有的文件进行哈希加密得到一个哈希值,每个文件的哈希值是不一样的,如果文件没有发生修改改变,他的哈希值就会是之前的哈希值,不会再次进行加密而是引用之前得到的,然后把这些哈希值挂到一棵树上,然后把这棵树进行哈希得到每次的commit哈希值
哈希特征:
- 使用同一种哈希加密算法处理的数据得到的加密结果长度是一定的
- 同一个数据加密后的加密结果是一样的
- 不可逆(文件加密是不可逆的,字符串加密可逆)
- 加密应用场景:文件校验,文件下载会有丢失,通过加密算法加密校验可以检测出文件是否有差异
git分支管理机制
通过指针进行切换和管理,新建分支和所做的修改都是通过指针进行切换,这样比svn的复制一份数据快的多