版本控制工具Git
1. 版本控制工具应该具备的功能
-
协同修改
多人并行不悖的修改服务器的同一文件。
-
数据备份
不仅保存目录和文件的当前状态,还可以保存文件的历史状态。
-
版本管理
版本管理文件的过程中不保存重复数据,以节约存储空间、提高运行效率。
SYN采用的是增量式管理的方式,Git采用文件系统快照的方式。
-
权限控制
- 对团队中参与开发的人员进行权限控制。
- 对团队外开发者贡献的代码进行审核——Git独有。
-
历史记录
- 查看修改人、时间、内容、日志信息。
- 讲本地文件恢复到某一状态。
-
分支管理
- 允许团队开发过程中多条生产线同时推进任务,提高效率。
2. Git简介
基本原理
哈希
哈希是一个系列的加密算法,各个不同的哈希算法虽然加密强度不同,但是有以下几个共同点:
- 不管输入数据的数据量有多大,输入同一个哈希算法,得到的加密结果长度固定。
- 哈希算法确定,输入数据确定,输出数据能够保证不变。
- 哈希算法确定,输入数据有变化,输出数据一定有变化,而且通常变化很大。
- 哈希算法不可逆。
哈希算法可以被用来验证文件,原理如下图所示:Git就是靠这种机制来从根本上保证数据完整性的。Git底层采用的是SHA-1算法。
集中式版本控制工具的文件管理机制
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N3dovhdZ-1602507866488)(H:\学习-笔记\笔记\picture\Git&GitHub_集中式版本控制工具的文件管理机制.png)]
以文件变更列表的方式存储信息。这类系统将它们保存的信息看作是一组基本文件和每个文件随时间逐步累积的差异。
Git的文件管理机制
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iaC1Le8N-1602507866491)(H:\学习-笔记\笔记\picture\Git&GitHub_Git的文件管理机制.png)]
Git把数据看作是小型文件系统的一组快照。每次提交更新时Git都会对当前的全部文件制作一个快照并保存这个快照的索引。为了高效,如果文件没有修改,Git不再重新存储该文件,而是只保留一个链接指向之前存储的文件。所以 Git 的工作方式可以称之为快照流。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TPOvTnU6-1602507866494)(H:\学习-笔记\笔记\picture\Git&GitHub_Git的提交对象.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SCMrRe7y-1602507866497)(H:\学习-笔记\笔记\picture\Git&GitHub_提交对象形成的链条.png)]
Git的优势
- 大部分操作在本地完成,不需要联网(分布式)。
- 安全性高,每个人都有完整的版本库。
- 完整性保证
- 尽可能添加数据而不是删除或修改数据。
- 分支操作非常快捷流畅。
- 与Linux命令全面兼容。
Git和代码托管中心
维护远程库
局域网:GitLab
外网:GitHub、码云
基础命令
本地库初始化
#本地库初始化
git init
注意:.git目录中存放的是本地库相关的子目录和文件,不要删除或修改
设置签名(用户名、Email地址)
作用:区分不同开发人员的身份(签名和远程库的账号无关)
#项目级别/仓库级别:仅在当前本地库范围有效(保存到config中)。
git config user.name XXX_pro`
git config user.email xxxx@xxx.com`
#系统用户的级别:登录当前操作系统用户范围,信息保存在当前目录~/gitconfig文件中
#项目优先于系统级别,不允许都没有
git config --global user.name XXX_glb`
git config --global user.email xxxx@xxx.com`
查看状态
#查看工作区、暂存区和本地库的状态
git status
添加操作
#将工作区的“新建/修改”添加到暂存区
git add [文件名]
提交操作
#将暂存区的内容提交到本地库
git commit -m "commit message" [文件名]
查看历史记录(日志)
git log
#将每一条日志显示到一行
git log --pretty=oneline
#只显示部分哈希值(也是一行)
git log --oneline
#只显示部分哈希值和移动指针的步数(也是一行)
git reflog
前进后退(恢复删除文件)
#基于索引值操作
git reset --hard [索引值]
#一个^号表示后退一步,~n号表示后退n步
git reset --hard HEAD^
git reset --hard HEAD~n
–soft 仅在本地库移动HEAD指针
–mixed 在本地库移动HEAD指针,重置暂存区
–hard 在本地库移动HEAD指针,重置暂存区、工作区
比较文件差异
#表示和暂存区比较
git diff [文件名]
#和本地库某一版本比较(事例为HEAD)
git diff HEAD [文件名]
#不带文件名
#比较当前工作区的所有文件
-号 表示删除的行
+号 表示增加的行
查看帮助文档
#查看文档
git help [具体命令]
多屏现实控制方式:空格向下翻页 b向上翻页 q退出
分支管理
在版本控制过程中,使用多条线同时推进多条任务。
分支的优势
- 并行开发,提高效率
- 任何开发失败不会对其他的分支有影响
习惯
hot_fix 修复bug的分支
feature_XXX 教程作者习惯分支命名(待考)
分支操作
#查看分支
git branch -v
#创建分支
git branch [分支名]
#切换分支
git check [分支名]
#合并分支,首先切换到接受修改的分支上
#被合并的分支名
git merge [分支名]
解决分支合并冲突
-
编辑文件,删除特殊符号
-
修改文件到满意的程度,保存退出
-
然后重新添加提交
3. GitHub
远程仓库的别名
#创建别名
git remote add [别名] [地址]
#查看已创建的别名
git remote -v
推送
推送是将本地库同步到远程库
git push [地址] [分支名]
克隆
-
完整的把远程库下载到本地
-
创建 origin 远程地址别名
-
初始化本地库
git clone [克隆地址]
团队成员邀请
点击仓库的设置中的成员输入想要邀请的成员的GitHub账号,并向该成员的发送邀请信息,该成员点击确定。
拉取
git fetch [远程库地址] [远程分支名]
git merge [远程库地址/远程分支名]
git pull [远程库地址] [远程分支名]
pull = fetch + merge
解决冲突
远程库的最新版所做的修改,不能推送,必须先拉取;拉取下来后如果进入冲突状态,则按照“分支冲突解决”操作解决即可。
跨团队协作
Fork ——》pull requests
SSH免密登录
cd .ssh
#进入当前用户的家目录
cd ~
#删除.ssh 目录
rm -rvf .ssh
#运行命令生成.ssh 密钥目录
ssh-keygen -t rsa -C [邮箱地址]
#进入.ssh 目录查看文件列表
cd .ssh
ls -lF
#查看 id_rsa.pub 文件内容
cat id_rsa.pub
#复制 id_rsa.pub 文件内容
#登录 GitHub,点击用户头像→Settings→SSH and GPG keys →New SSH Key→输入复制的密钥信息
#创建远程地址别名
git remote add origin_ssh [SSH登录的地址]