1.简介
1.1 版本控制工具应具备的功能
-
协同修改
- 多人并行不悖的修改服务器端的同一个文件
-
数据备份
- 不仅保存目录和文件的当前状态,还能够保存每一个提交过的历史状态
-
版本管理
- 在保存每个版本的文件信息的时候要做到不保存重复数据,节约存储空间,提高运行效率,SVN采用的是增量式管理方式,Git采用的是快照的方式
-
权限控制
- 对开发团队进行权限控制
- 对团队外的贡献者的提供的代码进行审核(这个功能是Git独有)
-
历史记录
- 查看修改人。修改时间,日志信息
- 将本地文件恢复到某一个历史状态
-
分支管理
- 允许开发团队在工作过程中多条生产线同时推进任务,进一步提高效率
1.2 git的优势
-
大部分操作在本地完成,不需要联网
-
完整性保证
-
尽可能添加数据而不是删除或修改数据
-
分支操作非常快捷流畅
-
与Linux命令全面兼容
1.3 git的结构
-
工作区–写代码
-
暂存区–临时存储(git add)
-
本地库–历史版本(git commit)
1.4 git和代码托管中心
代码托管中心的任务:维护远程库
- 局域网环境下
- gitLab服务器
- 外网环境下
- GitHub
- 码云
2.Git命令行操作
2.1 本地库
-
本地库初始化
- 命令:git add
- 注意:.git 目录中存放的是本地库相关的子目录和文件,不要删除,也不要胡乱修改。
-
设置签名
-
形式:
用户名:tom Email地址:helen@qq.com
-
作用:区分不同开发人员的身份
-
辨析:这里设置的签名和登录远程库(代码托管中心)的账号,密码没有任何关系
-
命令
- 项目级别/仓库级别:仅在当前本地范围内有效、
- git config user.name tom_pro
- git config user.email helen_pro@qq.com
- 信息保存位置:.git 中的 config
- 系统用户级别:登录当前操作系统的用户范围
- git config -global user.name tom_glb
- git config -global user.email helen_glb@qq.com
- 信息保存位置:~/.getconfig
- 级别优先级
- 就近原则:项目级别优先于系统用户级别,二者都有时采用项目级别的签名
- 如果只有系统用户级别的签名,就以系统用户级别的签名为准
- 二者都没有不允许
- 项目级别/仓库级别:仅在当前本地范围内有效、
-
2.2 常用命令
```
-- 状态查看,查看工作区/暂存区状态
git status
-- 将aaa.txt文件存入暂存区,将工作区的“新建/修改”提交到暂存区
git add xxx.txt
-- 将aaa.txt移出暂存区
git --caches aaa.txt
-- 将aaa.txt提交至本地库
git commit aaa.txt
-- 将aaa.txt提交至本地库(带提交原因)
git -m "commot message" aaa.txt
-- 查看历史
git log
```
commit b09caedf31d82a27cd166b81a0b86266e8506133
Merge: bb973b1 891ece1
Author: caihaoran <caihaoran@qianxin.com>
Date: Fri Jul 23 15:03:51 2021 +0800
Merge branch 'certificate' into uat
```
git log --pretty=online
git log --online
git reflog
······
71dc3ec (HEAD -> CloudCheck) HEAD@{0}: commit: 云查云鉴定代码提交
9cf78b1 (tag: 1012_uat_certificate, origin/master, origin/HEAD, origin/CloudCheck, master) HEAD@{1}: checkout: moving from nightly to CloudCheck
······
Head@{移动到当前版本需要多少步}
2.3 历史版本
本质:
HEAD指针指向
方式:
71dc3ec (HEAD -> CloudCheck) HEAD@{0}: commit: 云查云鉴定代码提交
9cf78b1 (tag: 1012_uat_certificate, origin/master, origin/HEAD, origin/CloudCheck, master) HEAD@{1}: checkout: moving from nightly to CloudCheck
792c619 (nightly) HEAD@{2}: reset: moving to HEAD
792c619 (nightly) HEAD@{3}: checkout: moving from CloudCheck to nightly
9cf78b1 (tag: 1012_uat_certificate, origin/master, origin/HEAD, origin/CloudCheck, master) HEAD@{4}: reset: moving to HEAD
9cf78b1 (tag: 1012_uat_certificate, origin/master, origin/HEAD, origin/CloudCheck, master) HEAD@{5}: checkout: moving from CloudCheck to CloudCheck
9cf78b1 (tag: 1012_uat_certificate, origin/master, origin/HEAD, origin/CloudCheck, master) HEAD@{6}: branch: Reset to origin/CloudCheck
9cf78b1 (tag: 1012_uat_certificate, origin/master, origin/HEAD, origin/CloudCheck, master) HEAD@{7}: checkout: moving from master to CloudCheck
9cf78b1 (tag: 1012_uat_certificate, origin/master, origin/HEAD, origin/CloudCheck, master) HEAD@{8}: clone: from https://git-biz.qianxin-inc.cn/situation/situation-cloud/situation-competency-center.git/
-
基于索引值操作
– 版本回退/前进
git reset --hard 9cf78b1
-
基于^符号:只能后退
– 往后退一步
git reset --hard HEAD^
– 往后退三步
git reset --hard HEAD^^^
注:一个^符号表示后退一步,n个代表后退n步
-
基于~符号:只能后退
– 后退三步
git reset --hard HEAD~3
2.4 reset命令的三个参数对比
-
hard
- 在本地库移动HEAD指针
- 重置暂存区
- 重置工作区
-
soft
- 仅仅在本地库移动指针
-
mixed
- 在本地库移动HEAD指针
- 重置暂存区
2.5 删除文件并找回
-
前提:删除前,文件存在时的状态提交到本地库
-
操作:git reset --hard [指针位置]
- 删除操作已经提交到本地库:指针位置指向历史记录
- 删除操作尚未提交到本地库:指针位置指向HEAD
2.6 比较文件
– 将工作区和暂存区进行比较
git diff [文件名]
– 将工作区和本地库历史进行比较
git diff [本地库历史版本] [文件名]
– 不带文件名比较当前工作区中所有文件
3 分支管理
3.1 分支的好处
-
同事并行推进多个功能开发,提高开发效率
-
各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响,失败的分支删除重新开始即可
3.2 分支的操作
-
创建分支
git branch [分支名]
-
查看分支
git branch -v
-
切换分支
git checkout [分支名]
-
合并分支
-
第一步:切换到接受修改的分支(被合并,增加新内容)上
git checkout [被合并分支名]
-
第二步:执行merge命令
git merge [有新内容分支名]
-
-
解决冲突
-
冲突的表现:
在有冲突的文件中生成冲突版本内容
-
冲突的解决:
-
第一步:编辑文件,删除特殊符号
-
第二步:git add [文件名]
-
第三步:git commit -m “日志信息”
注:此时提交不能带文件名
-
-
4.git的原理
4.1 哈希
哈希是一个系列的加密算法,各个不同的哈希算法虽然加密强度不同,但是有以下几个共同点:
-
不管输入的数据量有多大,输出同一个哈希算法,得到的加密结果长度固定;
-
哈希算法确定,输入数据确定,输出数据能够保证不变;
-
哈希算法确定,输入数据有变化,输出数据一定有变化,而且通常变化很大;
-
哈希算法不可逆;
-
哈希算法中不区分英文大小写。
Git底层采用的时SHA-1算法。
4.2 Git保存版本的机制
Git 更像是把数据看作是对小型文件系统的一组快照。 每次你提交更新,或在 Git 中保存项目状态时,它主要对当时的全部文件制作一个快照并保存这个快照的索引。 为了高效,如果文件没有修改,Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。 Git 对待数据更像是一个 快照流。
5.远程库
5.1 创建远程库
登录github新建repository
5.2 在本地创建远程库地址别名
-- 查看远程库地址
git remote -v
-- 指定远程库
git remote add origin [https://xxxxxxxx.git]
5.3 推送
-- 将本地master推送到远程库master
git push origin master
5.4 克隆操作
-
命令
- git clone [https://xxxxxxxx.git]
-
效果
- 完整的把远程库下载到本地
- 创建origin远程地址别名
- 初始化本地库
5.5 邀请团队成员
-
管理员页面添加发送邀请
-
成员同意
5.6 远程库修改的拉取
-
pull =fetch+merge
- git fetch [远程库地址别名] [远程分支名]
- git merge [远程库地址别名] [远程分支名]
-
git pull [远程库地址别名] [远程分支名]
5.7 解决冲突
-
要点
- 如果不是基于github远程库的最新版所做的修改,不能推送,必须先拉取
- 拉取下来后如果进入冲突状态,则按照“分支冲突解决”操作解决即可
5.8 跨团队协作
- Fork (用协作的的账号去点击Fork)
- 本地修改,然后推送到远程
- Pull Requests -->new Pull Request --> Create Pull Request
- 原团队管理员:Pull Requests -->点击查看详情,审核代码–>merge pull request
- 将远程库拉取到本地
5.9 SSH免密操作
-
进入当前用户的home目录
$cd~
-
删除.ssh目录
$rm -rvf.ssh
-
运行命令生成ssh密钥目录
$ ssh-keygen -t rsa -C helen@qq.com
-
进入.ssh目录查看文件列表
$ cd .ssh
$ls -lF
-
查看id_rsa.pub文件内容
$ cat id_rsa.pub
-
复制id_rsa.pub文件内容,登录GitHub,点击用户头像 --> Setting --> SSH and GPG keys
-
new SSH Key
-
输入复制的密钥信息
-
回到GitBash创建远程地址别名