Git简介


前言:我不会讲Git的安装,以下的内容都是基于你已经安装好环境了

Git是什么

在项目开发的过程中不是一蹴而就的,需要经过不断的修改、增加、删除多个功能模块。每一次改动都是一个版本的迭代,如果这些不同的版本不进行相关的管理的话,会给开发团队带来很大的困难。Git作为一个优秀的版本控制工具,应运而生

  1. 版本控制工具应该具备的功能:
    1.1 协同修改
    多人并行不悖的修改服务器端的同一个文件
    1.2 数据备份
    不仅保存目录和文件的当前状态,还能保存每一个提交过的历史状态
    1.3 版本管理
    做到不保存重复数据
    1.4 权限控制
    对团队中参与开发的人员进行权限控制
    对团队外开发贡献者的代码进行审核
    1.5 历史记录
    查看修改人、修改时间、修改内容、日志信息
    将本地文件恢复到某一历史状态
    1.6 分支管理
    允许开发团队在工作过程中多条生产线同时推进任务,进一步提高效率

版本控制简介

  1. 版本控制是一种思想,它起初于工程设计领域中使用版本控制管理工程蓝图的设计过程,后在IT开发过程中也可以使用版本控制思想管理代码的版本迭代,版本控制思想的实现就是版本控制工具
  2. 版本控制工具分为集中式版本控制工具(CVC,SVN,VSS…)和分布式版本控制工具(Git…),其中分布式版本控制工具能够有效避免单点故障

Git的优势

  1. 大部分操作在本地完成,不需要联网
  2. 完整性保证
  3. 尽可能添加数据而不是删除和修改数据
  4. 分支操作十分快捷流畅
  5. 与Linux命令全面兼容

所以,会Linux的程序员们用起来更是得心应手,不会问题也不大,我就不会

Git的结构

git add
git commit
git /push/pull/clone
工作区
暂存区
本地库
远程库

工作区:就是你写代码的地方
暂存区:临时存储的地方
本地库:本地仓库,里面存储了各个历史版本
远程库:代码托管中心的仓库
中间的是相关的git命令,后面会一一讲到

Git和GitHub的关系

  1. 首先需要明确,Git是版本控制工具,GitHub是一个代码托管中心,也就是说你可以通过Git这个工具将自己项目的代码上传到代码托管中心进行托管。代码托管中心并不是唯一的,只不过Git&GitHub这一套体系使用得比较多而已
  2. 代码托管中心在局部网环境下,我们可以自己搭建GitLab服务器。在外部网环境下,我可以使用现成的一个国外的GitHub,一个国内的Gitee(码云),二者区别不大,GitHub会卡一点,你上传的数据在经过太平洋下面的电缆时被淹死了也说不定
  3. 无论是哪个代码托管中心,它们的任务都是对远程库进行维护

本地库和远程库的交互方式

为了方便大家理解,我例出一个场景,后面的例子都是基于这个场景的:
话说岳不群正在开发一个华山剑法的项目,无奈他天资欠缺,一个人只完成了些许剑法,这时,他想到了他的徒弟令狐冲,便邀请令狐冲加入自己的团队一同开发

  1. 团队内协同开发
push推送
pull被拉取
clone克隆
加入团队后push
岳不群的本地库
远程库
令狐冲的本地库

这个岳不群又想在剑法中加入葵花宝典,于是给令狐冲下了命令,你你,给我弄出来,可是令狐冲他不会啊,于是他想到了自己的兄弟东方不败,但是东方不败隶属日月神教,无法加入他华山的团队

2.跨团队协作

fork
clone克隆
push
pull request,岳不群审核通过后
pull拉取
pull拉取
远程库
东方不败的远程库
东方不败的本地库
岳不群的本地库
令狐冲的本地库

Git命令行操作

在描述了交互方式之后就要进入到真正的命令行操作了

  1. 本地库初始化
    命令:git init
    执行命令后,你的项目中会出现一个名称为.git的文件,它默认是隐藏的
    Git简介
  2. 设置签名
    签名类似设置用户名,就是用来区分不同开发人员的身份的,它分为项目级别和系统用户级别,项目级别仅仅在当前本地仓库范围内有效,系统用户级别登录当前操作系统的用户范围都有效,且项目级别优先于系统用户级别,二者都有,采用项目级别,二者都没有,不好意思,Git不允许,一般使用一个系统用户级别就行了
    命令
    项目级别:git config user.name = xxx
    git config user.email = [email protected](不推荐使用网易邮箱,有时候收不到github的邮件)
    系统用户级别:git config --global user.name = xxx
    git config --global user.email = [email protected]
    项目级别的信息保存在当前目录中.git/config文件中,Git Bash中使用cat .git/config可进行查看
    系统用户的在C:/users/你的电脑名称/.gitconfig文件中可以查看,Git Bash中使用 cd ~,cat .gitconfig
  3. 添加提交以及查看状态操作
    命令: git status 查看状态
    我在已初始化本地仓库的项目中
    Git简介
    我创建一个txt文件并键入内容退出
    Git简介
    添加提交(暂存区)
    Git简介
    可以使用git rm --cached 文件名(从暂存区中撤销)
    此时再来查看status的状态
    Git简介
    可以很清楚的看到,changes to be commited,我相信大家的英语都比我好,可以提交的改变,可以这样理解吧,那我们提交吧
    Git简介
    git commit -m “这次提交的描述,就是日志信息” 文件名
    同样可以使用 git commit 文件名这种,但是这样就要进入Vim编辑器,然后在里面编辑日志信息,大家可以自己试一试
    此时,我们再来查看status
    Git简介
    若我们修改txt文本文件
    Git简介
    查看status
    Git简介
    描述很清楚,没有添加到暂存区
    提交后
    Git简介
    就又跟上面一样了
    提交到本地库并查看修改
    Git简介
    小结
    状态查看操作
    git status 查看工会区、暂存区的状态
    添加操作
    git add 文件名 将工作区的新建/修改添加到暂存区
    提交操作
    git commit -m “日志信息” 文件名 将暂存区的内容提交到本地库

查看历史记录的几种方式

你每提交一次,项目就会更新一个版本,那么如何查看这些更新的版本,我们使用命令git log
Git简介
commit 后面一串是哈希算法生成的,用于区分版本的,在版本前进与后退也有很大作用,作者,日期就不说了,最下面的就是你自己添加的日志信息,但是,这样看起来很复杂,更改一旦多了之后,显示起来很麻烦,还要使用多屏显示,空格退页啊,b翻页啊,所以我们可以使用其他模式查看
git log --pretty=oneline 一行显示
Git简介
git log --oneline 简洁一行显示
Git简介
git reflog 指明了指针移动的次数
Git简介
[email protected]{2} 意思就是到这个版本,指针需要移动2次

版本前进与后退的方式

在项目开发中,情况是瞬息万变的,可能刚刚提交的功能,下一秒就要删除这个功能,重新定义代码,
Git中支持的版本前进与后退就很好的满足了这个需求
文本文档中最后的一行是我在第二次提交是更改了,现在我不要了,我要回到只有前两行文字的时候
Git简介
我们使用 git reflog查看
Git简介
我们可以看到,当前的版本是1eb2056,添加的日志信息是change something(所以日志很重要),我们想要最后一行文字消失,只要版本回到del4f28版本也就是第一次提交的版本就行了
为此,我们使用命令: git reset --hard 索引值
Git简介
Git简介
我们还可以使用^和~符号来进行版本的更替,但是只能后退版本
git reset --hard HEAD^ 表示后退一个版本
git reset --hard HEAD^^ 表示后退两个版本
git reset --hard HEAD~3 表示后退3个版本

我们不止可以使用hard参数,还可以使用soft和mixed,它们的区别在于:
–soft 仅仅在本地库移动HEAD指针
–mixed 在本地库移动指针,重置暂存区
–hard 在本地库移动指针,重置暂存区和工作区
常用hard
你可以使用git help reset 查看文档获得更多信息,我就不贴图了,全英文,头疼

删除文件找回

删除文件找回的原理也是版本的更替,因为git中任何一条记录都不可磨灭,所以只要回到文件没被删除的版本即可恢复被删除的文件

  1. 提交到本地库之后删除了
    创建文本文件,提交到本地库
    Git简介
    Git简介
    删除文件
    Git简介
    查看状态,红色文字说明为提交的更改,就是记录(版本)没有生成
    Git简介
    提交到暂存区,绿字说明要提交的更改
    Git简介
    记录已经生成了,我们可以回退了
    Git简介
    回退过去,删除文件就恢复了
    Git简介
  2. 添加到暂存区之后删除了
    就是执行了rm 文件名 移除文件后,执行git add 文件名,但是没有执行git commit提交到本地库,此时直接使用git reset --hard HEAD就可恢复l ,图我就不截了,太重复了,可以自行测试

小结
前提:删除前,文件存在时的状态提交了
操作:git reset --hard [历史版本索引]
删除操作已经提交到本地库:指针指向历史记录
删除操作提交到了暂存区:指针位置用HEAD

比较文件

使用git diff命令
git diff [文件名] 将工作区的文件和暂存区的文件进行比较
Git简介
git diff [本地库历史版本索引] [文件名] 将工作区的文件和本地库的某一历史版本比较
索引使用git reflog查看,别忘了
Git简介
git diff 多个文件比较
Git简介

分支管理

  1. 什么是分支
    在版本控制过程中,使用多条线同时推进多个任务
版本前进
bug
版本前进
版本前进
clone
开发完成
合并
clone
推进
完成
合并
master1.0
版本2.0
修复分支hot_fix
版本3.0
版本4.0
新功能A
完成新功能
新功能B
继续完善
完成功能
  1. 分支的好处
    并行推进多个功能的开发,提高效率
    各个分支在开发过程中,相互独立,互不影响,如果某一个分支开发失败,直接删除此分支重新开发即可
  2. 分支操作
    git branch -v 查看当前所有分支
    Git简介
    git branch [名称] 创建某个分支
    Git简介
    git checkout [分支名称] 切换到某个分支
    Git简介
    在接受分支修改的分支上,执行
    git merge 另一个分支名 合并分支,增加内容的修改
    Git简介
    Git简介
  3. 解决合并分支中产生的冲突
    原因:两个分支(或多个)修改相同位置,但修改的内容却不同,合并的时候,Git拿不定注意,产生冲突
    在master分支上修改第3行
    Git简介
    提交到本地库
    Git简介
    在hot_you分支上也修改第三行
    Git简介
    提交到本地库
    Git简介
    合并分支,产生冲突
    Git简介
    这里显示正在合并,因为Git拿不定主意,所以需要手动操作
    首先,vim 进入,可以看到冲突的表现,一些奇怪的符号
    Git简介
    接下来调整文档,调整成你需要的效果,正经开发时,可能应该和另一个团员商议更改
    Git简介
    保存退出
    然后
    Git简介
    我们可以看到,已经退出合并了,说明合并冲突解决了,注意这个git commit 后面不能加文件名
    成功
    Git简介

Git原理

  1. 哈希
    哈希是一个系列的加密算法,各个不同的哈希算法虽然加密强度不同,但是有几个特点:
    a. 不管输入数据的数据量有多大,输入同一个哈希算法,得到的加密结果长度固定
    b. 哈希算法确定,输入数据确定,输出数据能够保证不变
    c. 哈希算法确定,输入数据有变化,输出数据一定有变化,而且通常变化很大
    d. 哈希算法不可逆
    Git底层采用的是SHA-1算法(哈希的一种)
SHA-1
网络传输
SHA-1
比对
不一致
原始文件
Hash值
目标文件
Hash值
目标文件损坏

Git就是靠这种机制来从根本上保证数据完整性的

  1. Git的文件管理机制
    Git把数据看做是小型文件系统的一组快照,每次提交更新时Git都会对当前的全部文件制作一个快照并保存这个快照的索引,为了高效,如果文件没有修改,Git不再重新存储该文件,而是只保留一个链接指向之前存储的文件,所以Git的工作方式可以称之为快照流
  2. Git文件管理机制细节
    Git的提交对象
98ca9 commit size tree 92ec2
92ec2 tree size blob 5b1d3 blob 911e7 blob cba8a
5b1d3 blob size
911e7 blob size
cba8a blob size

提交对象及其父对象形成链条

98ca9 commit size tree 92ec2
34ac2 commit size parent 98ac9 tree ...
f30ab commit size parent 34ac2 tree...
  1. Git分支管理机制
    分支的创建就是新建一个指针指向master指针指向的内容
    分支的切换实际上就是变换HEAD的指向
    版本的更替就是指针的移动
98ca9
34ac2
f30ab
master
HEAD

GitHub远程库操作

我就不截图演示了,GitHub卡,自行测试吧
要使用GitHub,首先你要注册一个GitHub的账号,这个,自己去注册就行了,我就说一说本地库与远程库的连接

  1. 默认本地库已经初始化完成
  2. GitHub上创建对应的远程库,名称自拟
  3. 执行git remote add origin [GitHub仓库地址] 这步相当于给仓库地址取了一个别名叫origin
  4. 使用 git remote -v 查看当前别名
  5. 推送到远程仓库 git push [仓库地址] [分支名]
    git oush origin master
  6. 克隆操作 git clone [远程仓库地址]
    执行这一步相当于:
    a. 完整的把远程库下载到本地
    b. 创建了origin远程地址别名
    c. 初始化了本地库
  7. 邀请某人加入团队(GitHub上操作即可,没什么说的)
  8. 远程库修改的拉取
    git fetch origin master
    git merge origin/master
    或者直接执行
    git pull origin master
  9. 协同开发时冲突的解决
    两个人修改了同一部分的代码,且一人先提交,导致后一个人提交的时候失败,发生冲突,这时,应该先拉取(git pull origin master),后面按照解决一般冲突的方法解决就行了

SSH免密登录

在执行推送到远程库的时候,需要输入自己GitHub的用户名和密码,这样有点不方便,我们可以使用SSH**来实现免密登录

  1. 进入当前用户的家目录(Git Bash中)
    cd ~
  2. 删除.ssh目录
    rm -r .ssh/
  3. 生成ssh
    ssh-****** -t -C <你登录GitHub的邮箱>
    若干回车
  4. 进入ssh目录
    cd .ssh/
  5. 查看id_rsa.pub
    cat id_rsa.pub
    复制里面的内容
  6. GitHub上
    Git简介
  7. 添加SSH**别名
    git remote add origin_ssh <ssh的地址>
    Git简介
    git remote -v 查看是否成功添加
    然后你执行推送的时候使用 git push origin_ssh master 就可以不用输入账号密码了
    本文总结自尚硅谷的Git教程,想看完整视频学习的,B站搜索绯色之村,我的收藏里,Git教程可以观看
    我的分享就到这里了,谢谢大家