一、Git简介
什么是Git?
Git是世界上最先进的分布式版本控制系统。
二、集中式(SVN)VS分布式(GIT)
集中式版本控制系统:版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。中央服务器就好比是一个图书馆,你要改一本书,必须先从图书馆借出来,然后回到家自己改,改完了,再放回图书馆。如下图示意:
集中式版本控制系统的缺点是:必须联网才能工作,如果在局域网内还好,带宽够大,速度够快,可如果在互联网上,遇到网速慢的话,可能提交一个10M的文件就需要5分钟,效率低下。
分布式版本控制系统:分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。既然每个人电脑上都有一个完整的版本库,那多个人如何协作呢?比方说你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。如下图示意:
三、Git安装
Git的下载地址:https://pan.baidu.com/s/1r-XCZtqA8qgdEKbPWo6rTA
密码: y4k3
四、Git入门
1:基本配置
我们本地仓库中的代码最终是要上传到GitHub中,而在上传的时候,必须要指定我们的信息,包括用户名和邮箱地址!方便团队或者项目组中其他人员知道是谁修改或者上传了代码!
所以我们首先要设置用户名和邮箱地址!
1.1设置用户名和邮箱
安装成功之后,右键点击桌面空白位置===》Git Bash Here
git config --global user.name 用户名
git config --global user.email 邮箱地址
git config --list 展示自己信息列表
1.2修改用户信息
vim ~/.gitconfig
在这个文件中也可以,新增name和email
1.3删除用户信息
git config --global --unset user.name 删除用户名
git config --global --unset user.email 删除邮箱
如果有多个用户,想删除指定的用户可以使用:
git config --global --unset user.name 用户名
2.基本操作
2.1创建本地仓库
git init
2.2创建并编辑文件
vim gitDemo.txt
进入如下界面:
进入默认是命令模式并不能输入字如果想输入按a、i都可以切换到输入模式
输入完成后按esc键退出编辑模式然后按ZZ(大写)或者:wq!保存并强制退出返回git界面
2.3将文件新增到暂存区
我们刚才创建的gitDemo.txt文件虽然在我们的仓库目录下,但是并没有被仓库所管理!
需要使用git add让文件被仓库管理(进入暂存区)
2.4将文件提交到历史仓库
2.5对文件进行修改
以下两种方式自己选择:
此时,我们对修改的文件有两种处理方式!
确实需要修改,那么我们使用git add将文件放进暂存区
如果是误修改,我们可以将文件回滚到之前的版本
2.6对比文件差异
2.6.1撤销修改
这里的撤销指的是,我们修改的文件还没有被提交到暂存区!
之后,还有一种方式是===》已经提交到了暂存区之后怎么撤销?
3.工作区,暂存区,历史仓库
3.1基本介绍
我们使用了git init初始化git仓库之后,在文件夹中会多出一个.git隐藏文件夹!
这个.git隐藏文件夹就是git的版本库repository。
我们创建的myRepertory文件夹就是工作区 working directory。
暂存区:暂存区可以理解为一个虚拟工作区,这个虚拟工作区会跟踪工作区的文件变化(增删改等操作)。这个工作区的位于.git文件夹下的index目录下
3.2注意点
当需要对工作区的修改提交到版本库前,暂存区会与工作区进行差异比较,如果工作区与暂存区的文件不一致,那么需要同步工作区的修改到暂存区,然后才可以提交到版本库;
暂存区可以说是工作区和版本库的桥梁,我们对文件的修改可以先放在暂存区中,如果后悔了不仅可以非常方便撤销,而且不会影响到现有的版本库;
只要我们使用过git add,那么文件就会被跟踪,暂存区跟踪记录了工作区的文件名和文件状态(在index文件中会记录修改时间,文件大小等信息);
下次我们对文件进行修改的时候,会比较时间戳来判断文件是否被修改,在执行git status时,首先会到.git/index下查看被跟踪的工作区文件的时间戳,如果发现自上次执行git add(执行git add可以让工作区的文件被跟踪)以来,文件的时间戳发生了变化,那么判断文件发生了改动,于是会与暂存区的原始文件与工作区中的该文件进行差异比较,如果发现两个文件内容不一致,那么就给出差异信息。
3.3实例演示
3.4查询历史提交记录
1. git log
2. git log --pretty=oneline
也可以查询某个指定文件的提交历史
3.git reflog
4.git log和git reflog的区别
01.Git log查询的是commit id,作者以及提交时间和提交信息但是不包括之前删除的历史记录
02.git reflog查询的是简洁的commit id和提交信息也会包含之前删除的历史记录
5.回退历史版本
git reset 版本ID
6.撤销修改
这里的修改,就是我们的文件已经到达了暂存区了,需要把修改的文件还原到工作区!
7.误删除工作区的文件
8.真正删除文件
五、远程仓库
使用GitHub时,国内的用户经常遇到的问题是访问速度太慢,有时候还会出现无法连接的情况(原因你懂的)。
如果我们希望体验Git飞一般的速度,可以使用国内的Git托管服务——码云(gitee.com)。
和GitHub相比,码云也提供免费的Git仓库。此外,还集成了代码质量检测、项目演示等功能。对于团队协作开发,码云还提供了项目管理、代码托管、文档管理的服务,5人以下小团队免费。
5.1 创建ssh公钥
打开gitbash:ssh-keygen -t rsa -C "[email protected]"
其中,请将[email protected]替换成自己在码云上注册的邮箱。
找到位于上图:/c/Users/用户名/.ssh/id_rsa.pub的公钥文件。
编辑其内容,将内容复制到码云上:
5.2 添加远程仓库
目前,在码云上的这个test1仓库还是空的,Git告诉我们,可以从这个仓库克隆出新的仓库,也可以把一个已有的本地仓库与之关联,然后,把本地仓库的内容推送到远程仓库。
5.3 将本地仓库中的内容推送到远程仓库
步骤1、关联本地仓库+远程仓库
在gitbash中运行:git remote add origin 远程仓库地址。
步骤2、将本地库master分支同步到远程仓库,根据提示输入用户名密码:
命令:git push -u origin master
遇到的问题1:error: src refspec master does not match any.
解决办法:将文件新增或提交。
遇到的问题2:
解决办法:git pull --rebase origin master(取回远程主机上的master分支,合并后推送)
再次执行git push -u origin master
查看远程仓库
从现在起,只要本地做了提交,就可以通过命令:git push origin master 把本地master分支的最新修改推送到码云上。
5.4 从远程库上克隆
将我们在码云上构建的工程克隆到本地上。
切换到d:\gitclone目录下,查看
六、分支管理
分支就是科幻电影里面的平行宇宙,当你正在电脑前努力学习Git的时候,另一个你正在另一个平行宇宙里努力学习SVN。
如果两个平行宇宙互不干扰,那对现在的你也没啥影响。不过,在某个时间点,两个平行宇宙合并了,结果,你既学会了Git又学会了SVN!
分支在实际中有什么用呢?假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。
现在有了分支,就不用怕了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。
6.1 创建分支和合并分支
在版本回退中,你已经知道,每次提交,Git都会把它串成一条时间线。这条时间线就是一个分支。截止到目前,在Git中只有一条分支,即master分支。HEAD指针严格来说不是指向提交,而是指向master,而master才是指向提交的,所以HEAD指向的是当前的分支。
每次提交,master都会沿当前时间线向前移动一步。这样随着你不停的提交,master分支也会越来越长。
当我们创建新的分支,例如dev时,Git新建了一个指针叫dev,指向master做相同的提交,再把HEAD指向dev,就表示当前分支在dev上。
你看,Git创建一个分支很快,因为除了增加一个dev指针,改改HEAD的指向,工作区的文件都没有任何变化!
不过,从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变:
假如我们在dev上的工作完成了,就可以把dev合并到master上。Git怎么合并呢?最简单的方法,就是直接把master指向dev的当前提交,就完成了合并:
合并完分支后,甚至可以删除dev分支。删除dev分支就是把dev指针给删掉,删掉后,我们就剩下了一条master分支:
下面完成对应的分支案例:
使用:git checkout -b dev 创建并切换到dev分支
使用git branch查看当前分支
编辑a.txt,适当添加内容
现在dev分支的工作任务结束,切换到master分支。使用cat语句查看发现 没有刚刚在dev分支上操作的内容。
现在,我们把dev分支的工作成果合并到master分支上。
合并完成后,就可以放心的移除dev分支了。
查看内容如下:
6.2 解决冲突
创建新的分支如下,进行全新的分支案例。
修改a.txt文件的最后一行内容如下:
在test1分支上提交
切换到master分支
Git此时会自动提示我们当前的master分支比远程的master分支要超前一个提交。
在master分支上编辑a.txt文件的最后一行
进行了与test1分支不一样的修改
再次提交:
此时,master与test1分支合并时可能会产生冲突:
果不其然,产生了冲突。我们可以通过git status查看冲突的文件
查看a.txt文件中的内容:
Git用<<<<<<>>>>>>标记出不同分支的内容,我们修改如下后保存,再提交。
使用git log命令查看分支合并情况:git log --graph --pretty=oneline --abbrev-commit
七、标签管理
7.1 创建标签
在Git中打标签非常简单,首先,切换到需要打标签的分支上:
为test1分支打标签:
默认标签是打在最新提交的commit上的。有时候,如果忘了打标签,比如,现在已经是周五了,但应该在周一打的标签没有打,怎么办?
方法是找到历史提交的commit id,然后打上就可以了:
使用:git log --pretty=oneline --abbrev-commit查看commitid
可根据commitid创建标签:
再使用git tag命令查看标签:
注意,标签不是按时间顺序列出,而是按字母排序的。可以用git show查看标签信息:
还可以创建带说明的标签,使用-a指定标签名,-m指定说明文字。
7.2 操作标签
如果标签打错了,也可以删除。
因为创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地 安全删除。
如果要推送某个标签到远程,使用命令git push origin 标签名:
或者一次性全部推送到远程仓库:
在远程仓库上查看:
如果标签已推送到远程,要远程删除的话,首先删除本地的标签: