目录
介绍
最好用的分布式版本控制系统
个人开发需要不断改进和版本迭代,团队内部需要协作,这样就需要版本控制工具来满足
集中式与分布式的区别
简介
除了git还有svn、cvs这样的版本控制系统,
git为分布式版本控制系统,svn和csv是集中式版本控制系统
集中式版本控制系统
介绍
-
集中式的版本控制系统每次在写代码时都需要从服务器中拉取一份下来,并且如果服务器丢失了,那么所有的就都丢失了,你本机客户端仅保存当前的版本信息
-
换句话说,集中式就是把代码放在一个服务器上集中管理,你的所有回滚等操作都需要服务器的支持
版本号
-
集中式它们都有一个主版本号,所有的版本迭代都以这个版本号为主
分布式版本控制系统
介绍
-
每个人的电脑都是服务器,当你从主仓库拉取一份代码下来后,你的电脑就是服务器,无需担心主仓库被删或者找不到的情况
-
你可以自由在本地回滚,提交,当你想把自己的代码提交到主仓库时,只需要合并推送到主仓库就可以了,同时你可以把自己的代码新建一份仓库分享给其它人
版本号
-
分布式因为每个客户端都是服务器,git没有固定的版本号,但是有一个由哈希算法算出的id,用来回滚用的
-
同时也有一个master仓库,这个仓库是一切分支仓库的主仓库,我们可以推送提交到master并合并到主仓库上,主仓库的版本号会迭代一次
-
我们客户端上的git版本号无论迭代多少次,都跟master无关,只有合并时,master才会迭代一次
Git功能特点
特点
-
记录文件的所有历史变化
-
随时可恢复到任何一个历史状态
-
多人协作开发或修改
-
错误恢复
-
多功能并行开发
-
可以离线工作,每个计算机都是一个完整的仓库
-
完整性保证,通过hash来保证传输时一致性
-
尽可能添加数据,而不是删除或修改数据
具备功能
协同修改
-
多人并行不悖的修改服务器端的同一个文件
-
举例:A修改了文件,B同时也在修改文件,但是两个人修改内容不容,最终文件内容如何规定
数据备份
-
不仅保存目录和文件的当前状态,还能够保存每一个提交过的历史状态,每个状态版本的文件都可以获取到
版本管理
-
在保存每一个版本的文件信息的时候要做到不保存重复数据,以节约存储空间,提高运行效率。这方面 SVN 采用的是增量式管理的方式,而 Git 采取了文件系统快照的方式
权限控制
-
对团队中参与开发的人员进行权限控制。
-
对团队外开发者贡献的代码进行审核——Git 独有
历史记录
-
查看修改人、修改时间、修改内容、日志信息
-
将本地文件恢复到某一个历史状态
分支管理
-
允许开发团队在工作过程中多条生产线同时推进任务,进一步提高效率
git安装教程
1.安装到一个非中文没有空格的目录下
2.建议使用VIM编辑器
3.环境变量设置
4.使用默认值
5.行末换行符转换方式,使用默认值
6.执行Git命令的默认终端,使用默认值
7.文件系统缓存
8.执行安装
9.运行方式选择
Git本地结构
结构示意图
区域名词解释
-
工作区:就是我们写代码的地方
-
暂存区:使我们打算提交的代码还没有提交的代码,后面可以撤回也可以提交。就是临时存储的一个地方
-
本地库:我们提交后的数据,里面存储的就是每个历史版本数据
工作流程
-
通过git add从工作区添加到暂存区
-
从暂存区到本地库通过git commit命令
代码托管中心
介绍
-
代码托管中心的任务:维护远程库
局域网环境下
-
GitLab 服务器
外网环境下
-
GitHub
-
码云
本地库和远程库及相关操作
团队内部协作
-
提交代码者:通过push将代码从本地库推送到远程库
-
克隆代码者:通过clone将代码从远程库克隆到本地库中,有创建本地库并进行初始化操作
-
提交代码者不是远程库的创建者,那么需要加入团队添加相应的权限push代码到远程库中
-
pull这个操作我感觉是覆盖原来代码这个意思
跨团队协作
-
不同团队,对远程库进行获取通过fork命令,现在这个拉取的远程库是属于另外团队的
-
另一个团队通过clone下载,然后push推送进行更新代码到自己远程库中
-
现在问题是另一个团队将代码修改,如何同步到原来团队远程库代码
-
发起pull request请求,进行审核,若没有问题进行merge合并操作,这样原来远程库中就有另一个团队修改后的代码了
-
最后本地库进行pull操作的拉取
Git命令号行操作
本地库初始化
-
先创建一个文件夹,然后在该文件夹下在git bash命令下,执行git init,初始化本地库
注意:.git 目录中存放的是本地库相关的子目录和文件,不要删除,也不要胡 乱修改
设置签名
形式:
-
包含:用户名,email地址
-
作用:主要是标识开发人员的身份
-
区分:上面这个用户名和git登录用户名密码没有关系
设置签名命令:
-
项目级别/仓库级别:仅在当前本地库范围内有效
-
设置签名命令:
-
设置用户名:git config user.name tom_pro
-
设置邮箱:git config user.email [email protected]
-
-
信息保存位置:./.git/config 文件
-
-
系统用户级别:登录当前操作系统的用户范围
-
git config --global user.name tom_glb
-
git config --global [email protected]
-
信息保存位置:~/.gitconfig 文件
-
-
级别优先级
-
就近原则:项目级别优先于系统用户级别,二者都有时采用项目级别的签名
-
如果只有系统用户级别的签名,就以系统用户级别的签名为准
-
二者都没有不允许
-
基本命令
帮助命令/git help [具体命令]
-
进行跳转到本地的一个页面
状态查看/git status
可以查看工作区、暂存区的状态
-
on branch master 在主分支上
-
no commits yet 现在还没有任何提交,因为是新创建的
-
nothing to commit 没有什么可提交的,因为暂存区什么都没有,后面的提示是创建文件放入暂存区吧
按照提示新创建了一个文件
-
区别是发现了一个未追踪的文件,就是让你用git add命令将文件放到暂存区中
执行添加操作
再来确定状态,变绿了
-
里面提示怎么撤回命令
-
使用撤回命令,是将暂存区的文件进行删除,删除的不是工作区的内容
从暂存区提交到本地库
-
使用git commit
第五行暂时理解为版本号以及我们输入的字符以及一个文件发生更改,里面加入三行文字
-
编辑里面内容
第一行的文字我们自己手打上去的,应该是用来标识的吧
-
最终状态
-
如果我们对文件进行了修改,然后再判断一下状态
下面会提示要么覆盖,要么取消更改
-
然后我们进行覆盖操作
-
进行提交,直接输入消息,不需要进入文本编辑器进行编辑了
-
判断状态
添加/git add
-
将工作区的“新建/修改”添加到暂存区
-
添加到暂存区的话,可以进行撤销,你添加到本地库的话就没有办法撤回了
提交/git commit
-
将暂存区的内容提交到本地库
-
命令:git commit -m "commit message" [file name]
-
如果不加中间的双引号内容,需要进文本编辑器中加入提交信息,用来标识提交的文件
-
查看历史记录/git log
-
下图能看出来提交了两次
-
历史记录太多,空格键翻页
-
b 向上翻页 q 退出
-
能看到每次操作的内容
-
以pretty显示一行日志
-
哈希值只显示一部分
-
移动到当前版本需要多少步
版本变更/git reset --hard [局部索引值]
-
指针概念
基于指针概念,可以通过head指针进行版本的前进后退
可以看到后面显示的内容为每次操作进行了怎样的操作
-
基于索引值前进和后退
-
先看一下当前文件内容
-
版本的变更
-
查看文件
-
-
使用^符号:只能后退
-
git reset --hard HEAD^
-
注:一个^表示后退一步,n 个表示后退 n 步
-
-
使用~符号:只能后退
-
git reset --hard HEAD~n
-
注:表示后退 n 步
-
reset 命令的三个参数对比
-
--soft 参数
仅仅在本地库移动 HEAD 指针
就是改动了本地库文件
-
--mixed 参数
在本地库移动 HEAD 指针
重置暂存区
改动了本地库和暂存区文件
-
--hard 参数
在本地库移动 HEAD 指针
重置暂存区
重置工作区
全部文件内容都改动了
删除文件/git reset --hard [指针位置]
-
通常指的是提交到本地库之后进行删除
-
工作区删除文件,直接rm 文件名
-
删除操作
-
下面操作相当于本地库记录了文件的删除
-
git只会增加版本,他不会对任何一个版本进行删除
-
-
文件回复,就是变更版本
比较文件差异/git diff
-
git diff [文件名]
-
将工作区中的文件和暂存区进行比较
-
-
git diff [本地库中历史版本] [文件名]
-
将工作区中的文件和本地库历史记录比较
-
-
不带文件名比较多个文件
Git分支管理
什么是分支
-
在版本控制过程中,使用多条线同时推进多个任务
分支工作模式
-
初始化阶段的时候,会自动生成主干,master
-
如果其中一个分支做一个功能,另外一个分支做另外一个功能,其中一个分支不想再做了,直接删除分支就可以,对于其他分支不产生任何影响,方便试错
-
如果写的代码不一定有保证,肯定也是不能在主干进行开发的,写在分支可以方便尝试
-
彼此分支以及功能互不干扰,彼此能够推进这个任务,避免其中一个分支等待另一个分支完成任务进行开发
-
如果某一个功能开发完,会合并回主干,对主干的版本也是一个升级
-
如果主干升级版本的时候出现bug,会生成一个分支进行修复hot_fix,热修复,即项目不停进行修复,修复完毕在合并回主干
分支的好处
-
同时并行推进多个功能开发,提高开发效率
-
各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任 何影响。失败的分支删除重新开始即可
分支操作
-
创建分支
-
git branch [分支名]
-
-
查看分支
-
git branch -v
-
目前只有master这一个分支,就在这个分支上
-
-
切换分支
-
git checkout [分支名]
-
切换分支后,在分支上进行对文件的修改
-
同样add和commit提交到本地库
-
-
合并分支
-
第一步:切换到接受修改的分支(被合并,增加新内容)上 git checkout [被合并分支名]
-
第二步:执行 merge 命令
-
git merge [有新内容分支名]
-
-
在master上面指定分支进行合并
-
下面可以看到分支进行的修改主干上能够看到
-
解决冲突
-
当主线更新了内容,分支也更新了内容,进行合并的时候到底会按照哪一版的更新
-
第一步:编辑文件,删除特殊符号
第二步:把文件修改到满意的程度,保存退出
第三步:git add [文件名]
第四步:git commit -m "日志信息"
注意:此时 commit 一定不能带具体文件名
-
最终结果如下
-
按照提示解决冲突
Git基本原理
哈希
-
哈希是一个系列的加密算法,各个不同的哈希算法虽然加密强度不同,但是有以下
-
几个共同点:
-
①不管输入数据的数据量有多大,输入同一个哈希算法,得到的加密结果长度固定。
-
②哈希算法确定,输入数据确定,输出数据能够保证不变
-
③哈希算法确定,输入数据有变化,输出数据一定有变化,而且通常变化很大
-
④哈希算法不可逆
-
Git 底层采用的是 SHA-1 算法。
-
哈希算法可以被用来验证文件。原理如下图所示:
-
-
Git 就是靠这种机制来从根本上保证数据完整性的
Git 保存版本的机制
-
Git 的文件管理机制
-
Git 把数据看作是小型文件系统的一组快照。每次提交更新时 Git 都会对当前 的全部文件制作一个快照并保存这个快照的索引。为了高效,如果文件没有修改, Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。所以 Git 的 工作方式可以称之为快照流
-
-
Git 文件管理机制细节
-
Git 的“提交对象”
-
提交对象及其父对象形成的链条
-
GitHub
创建远程仓库
本地库的修改推送至远程
git remote -v 查看当前所有远程地址别名
git remote add [别名] [远程地址]
-
本地仓库需要有文件
-
远程仓库地址进行简化操作
-
git push origin master 就是把主干文件推送到远程仓库
本地clone
还有.git文件,表明已经初始化好了
clone这个操作有三个效果
-
完整的把远程库下载到本地
-
创建 origin 远程地址别名
-
初始化本地库
团队成员邀请
-
“岳不群”其他方式把邀请链接发送给“令狐冲”,“令狐冲”登录自己的 GitHub 账号,访问邀请链接
Git 工作流
概念
-
在项目开发过程中使用 Git 的方式
GitFlow工作流
分支实战
-
新员工肯定现在分支上进行添加功能
Idea中使用git
详细操作
地址:Git在IDEA中的使用(详细图文全解)_一直在努力的小渣渣-CSDN博客_git idea
常用操作
创建分支
-
依次选择CVS->Git->branches
-
然后选择新建分支
-
输入新分支名称,例如dev
-
然后选择OK
-
可以看到左下角显示已经切换到新建的dev分支了
-
我们再看看Github上是否有新分支dev
-
啊???为什么Github上没有新建的dev分支?原因是我们再本地新建dev分支这个修改还没有提交并推送到远程仓库
-
好了,现在我们再本地进行提交修改并提交到远程仓库
-
CVS->Git->commit files,然后确认信息
-
然后推送到远程仓库,CVS->Git->push
-
然后我们再看Github上的分支信息,就可以看见dev分支了
推送分支
-
对于远程库来说还是新建的分支
-
推送修改的过程也很简单,依次点击VCS->Git->Push
-
接下来确认要推送的修改
-
然后等一会儿就好了。最后可以到对应的github仓库上验证一下是否推送成功了。
拉取操作
-
依次点击CVS->Git->pull就可以进行拉取远程库内容了