Git简介
Git简介
前言:我不会讲Git的安装,以下的内容都是基于你已经安装好环境了
Git是什么
在项目开发的过程中不是一蹴而就的,需要经过不断的修改、增加、删除多个功能模块。每一次改动都是一个版本的迭代,如果这些不同的版本不进行相关的管理的话,会给开发团队带来很大的困难。Git作为一个优秀的版本控制工具,应运而生
- 版本控制工具应该具备的功能:
1.1 协同修改
多人并行不悖的修改服务器端的同一个文件
1.2 数据备份
不仅保存目录和文件的当前状态,还能保存每一个提交过的历史状态
1.3 版本管理
做到不保存重复数据
1.4 权限控制
对团队中参与开发的人员进行权限控制
对团队外开发贡献者的代码进行审核
1.5 历史记录
查看修改人、修改时间、修改内容、日志信息
将本地文件恢复到某一历史状态
1.6 分支管理
允许开发团队在工作过程中多条生产线同时推进任务,进一步提高效率
版本控制简介
- 版本控制是一种思想,它起初于工程设计领域中使用版本控制管理工程蓝图的设计过程,后在IT开发过程中也可以使用版本控制思想管理代码的版本迭代,版本控制思想的实现就是版本控制工具
- 版本控制工具分为集中式版本控制工具(CVC,SVN,VSS…)和分布式版本控制工具(Git…),其中分布式版本控制工具能够有效避免单点故障
Git的优势
- 大部分操作在本地完成,不需要联网
- 完整性保证
- 尽可能添加数据而不是删除和修改数据
- 分支操作十分快捷流畅
- 与Linux命令全面兼容
所以,会Linux的程序员们用起来更是得心应手,不会问题也不大,我就不会
Git的结构
工作区:就是你写代码的地方
暂存区:临时存储的地方
本地库:本地仓库,里面存储了各个历史版本
远程库:代码托管中心的仓库
中间的是相关的git命令,后面会一一讲到
Git和GitHub的关系
- 首先需要明确,Git是版本控制工具,GitHub是一个代码托管中心,也就是说你可以通过Git这个工具将自己项目的代码上传到代码托管中心进行托管。代码托管中心并不是唯一的,只不过Git&GitHub这一套体系使用得比较多而已
- 代码托管中心在局部网环境下,我们可以自己搭建GitLab服务器。在外部网环境下,我可以使用现成的一个国外的GitHub,一个国内的Gitee(码云),二者区别不大,GitHub会卡一点,你上传的数据在经过太平洋下面的电缆时被淹死了也说不定
- 无论是哪个代码托管中心,它们的任务都是对远程库进行维护
本地库和远程库的交互方式
为了方便大家理解,我例出一个场景,后面的例子都是基于这个场景的:
话说岳不群正在开发一个华山剑法的项目,无奈他天资欠缺,一个人只完成了些许剑法,这时,他想到了他的徒弟令狐冲,便邀请令狐冲加入自己的团队一同开发
- 团队内协同开发
这个岳不群又想在剑法中加入葵花宝典,于是给令狐冲下了命令,你你,给我弄出来,可是令狐冲他不会啊,于是他想到了自己的兄弟东方不败,但是东方不败隶属日月神教,无法加入他华山的团队
2.跨团队协作
Git命令行操作
在描述了交互方式之后就要进入到真正的命令行操作了
- 本地库初始化
命令:git init
执行命令后,你的项目中会出现一个名称为.git的文件,它默认是隐藏的
- 设置签名
签名类似设置用户名,就是用来区分不同开发人员的身份的,它分为项目级别和系统用户级别,项目级别仅仅在当前本地仓库范围内有效,系统用户级别登录当前操作系统的用户范围都有效,且项目级别优先于系统用户级别,二者都有,采用项目级别,二者都没有,不好意思,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 - 添加提交以及查看状态操作
命令: git status 查看状态
我在已初始化本地仓库的项目中
我创建一个txt文件并键入内容退出
添加提交(暂存区)
可以使用git rm --cached 文件名(从暂存区中撤销)
此时再来查看status的状态
可以很清楚的看到,changes to be commited,我相信大家的英语都比我好,可以提交的改变,可以这样理解吧,那我们提交吧
git commit -m “这次提交的描述,就是日志信息” 文件名
同样可以使用 git commit 文件名这种,但是这样就要进入Vim编辑器,然后在里面编辑日志信息,大家可以自己试一试
此时,我们再来查看status
若我们修改txt文本文件
查看status
描述很清楚,没有添加到暂存区
提交后
就又跟上面一样了
提交到本地库并查看修改
小结
状态查看操作
git status 查看工会区、暂存区的状态
添加操作
git add 文件名 将工作区的新建/修改添加到暂存区
提交操作
git commit -m “日志信息” 文件名 将暂存区的内容提交到本地库
查看历史记录的几种方式
你每提交一次,项目就会更新一个版本,那么如何查看这些更新的版本,我们使用命令git log
commit 后面一串是哈希算法生成的,用于区分版本的,在版本前进与后退也有很大作用,作者,日期就不说了,最下面的就是你自己添加的日志信息,但是,这样看起来很复杂,更改一旦多了之后,显示起来很麻烦,还要使用多屏显示,空格退页啊,b翻页啊,所以我们可以使用其他模式查看
git log --pretty=oneline 一行显示
git log --oneline 简洁一行显示
git reflog 指明了指针移动的次数
[email protected]{2} 意思就是到这个版本,指针需要移动2次
版本前进与后退的方式
在项目开发中,情况是瞬息万变的,可能刚刚提交的功能,下一秒就要删除这个功能,重新定义代码,
Git中支持的版本前进与后退就很好的满足了这个需求
文本文档中最后的一行是我在第二次提交是更改了,现在我不要了,我要回到只有前两行文字的时候
我们使用 git reflog查看
我们可以看到,当前的版本是1eb2056,添加的日志信息是change something(所以日志很重要),我们想要最后一行文字消失,只要版本回到del4f28版本也就是第一次提交的版本就行了
为此,我们使用命令: git reset --hard 索引值
我们还可以使用^和~符号来进行版本的更替,但是只能后退版本
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中任何一条记录都不可磨灭,所以只要回到文件没被删除的版本即可恢复被删除的文件
- 提交到本地库之后删除了
创建文本文件,提交到本地库
删除文件
查看状态,红色文字说明为提交的更改,就是记录(版本)没有生成
提交到暂存区,绿字说明要提交的更改
记录已经生成了,我们可以回退了
回退过去,删除文件就恢复了
- 添加到暂存区之后删除了
就是执行了rm 文件名 移除文件后,执行git add 文件名,但是没有执行git commit提交到本地库,此时直接使用git reset --hard HEAD就可恢复l ,图我就不截了,太重复了,可以自行测试
小结
前提:删除前,文件存在时的状态提交了
操作:git reset --hard [历史版本索引]
删除操作已经提交到本地库:指针指向历史记录
删除操作提交到了暂存区:指针位置用HEAD
比较文件
使用git diff命令
git diff [文件名] 将工作区的文件和暂存区的文件进行比较
git diff [本地库历史版本索引] [文件名] 将工作区的文件和本地库的某一历史版本比较
索引使用git reflog查看,别忘了
git diff 多个文件比较
分支管理
- 什么是分支
在版本控制过程中,使用多条线同时推进多个任务
- 分支的好处
并行推进多个功能的开发,提高效率
各个分支在开发过程中,相互独立,互不影响,如果某一个分支开发失败,直接删除此分支重新开发即可 - 分支操作
git branch -v 查看当前所有分支
git branch [名称] 创建某个分支
git checkout [分支名称] 切换到某个分支
在接受分支修改的分支上,执行
git merge 另一个分支名 合并分支,增加内容的修改
- 解决合并分支中产生的冲突
原因:两个分支(或多个)修改相同位置,但修改的内容却不同,合并的时候,Git拿不定注意,产生冲突
在master分支上修改第3行
提交到本地库
在hot_you分支上也修改第三行
提交到本地库
合并分支,产生冲突
这里显示正在合并,因为Git拿不定主意,所以需要手动操作
首先,vim 进入,可以看到冲突的表现,一些奇怪的符号
接下来调整文档,调整成你需要的效果,正经开发时,可能应该和另一个团员商议更改
保存退出
然后
我们可以看到,已经退出合并了,说明合并冲突解决了,注意这个git commit 后面不能加文件名
成功
Git原理
- 哈希
哈希是一个系列的加密算法,各个不同的哈希算法虽然加密强度不同,但是有几个特点:
a. 不管输入数据的数据量有多大,输入同一个哈希算法,得到的加密结果长度固定
b. 哈希算法确定,输入数据确定,输出数据能够保证不变
c. 哈希算法确定,输入数据有变化,输出数据一定有变化,而且通常变化很大
d. 哈希算法不可逆
Git底层采用的是SHA-1算法(哈希的一种)
Git就是靠这种机制来从根本上保证数据完整性的
- Git的文件管理机制
Git把数据看做是小型文件系统的一组快照,每次提交更新时Git都会对当前的全部文件制作一个快照并保存这个快照的索引,为了高效,如果文件没有修改,Git不再重新存储该文件,而是只保留一个链接指向之前存储的文件,所以Git的工作方式可以称之为快照流 - Git文件管理机制细节
Git的提交对象
提交对象及其父对象形成链条
- Git分支管理机制
分支的创建就是新建一个指针指向master指针指向的内容
分支的切换实际上就是变换HEAD的指向
版本的更替就是指针的移动
GitHub远程库操作
我就不截图演示了,GitHub卡,自行测试吧
要使用GitHub,首先你要注册一个GitHub的账号,这个,自己去注册就行了,我就说一说本地库与远程库的连接
- 默认本地库已经初始化完成
- GitHub上创建对应的远程库,名称自拟
- 执行git remote add origin [GitHub仓库地址] 这步相当于给仓库地址取了一个别名叫origin
- 使用 git remote -v 查看当前别名
- 推送到远程仓库 git push [仓库地址] [分支名]
git oush origin master - 克隆操作 git clone [远程仓库地址]
执行这一步相当于:
a. 完整的把远程库下载到本地
b. 创建了origin远程地址别名
c. 初始化了本地库 - 邀请某人加入团队(GitHub上操作即可,没什么说的)
- 远程库修改的拉取
git fetch origin master
git merge origin/master
或者直接执行
git pull origin master - 协同开发时冲突的解决
两个人修改了同一部分的代码,且一人先提交,导致后一个人提交的时候失败,发生冲突,这时,应该先拉取(git pull origin master),后面按照解决一般冲突的方法解决就行了
SSH免密登录
在执行推送到远程库的时候,需要输入自己GitHub的用户名和密码,这样有点不方便,我们可以使用SSH**来实现免密登录
- 进入当前用户的家目录(Git Bash中)
cd ~ - 删除.ssh目录
rm -r .ssh/ - 生成ssh
ssh-****** -t -C <你登录GitHub的邮箱>
若干回车 - 进入ssh目录
cd .ssh/ - 查看id_rsa.pub
cat id_rsa.pub
复制里面的内容 - GitHub上
- 添加SSH**别名
git remote add origin_ssh <ssh的地址>
git remote -v 查看是否成功添加
然后你执行推送的时候使用 git push origin_ssh master 就可以不用输入账号密码了
本文总结自尚硅谷的Git教程,想看完整视频学习的,B站搜索绯色之村,我的收藏里,Git教程可以观看
我的分享就到这里了,谢谢大家