List item List itemGit是目前世界上最先进的分布式文件版本控制系统(没有之一)
List item版本控制 所谓的版本控制就是将一组文件的改动记录下来,形成版本历史,以便需要时恢复
GIT作用
代码共享
每位开发者可以使用Git将自己的代码上传到云服务器上,同时使用Git还可以将其他人上传的代码下载到自己的电脑上,这样就实现了代码共享
回溯版本
在开发的过程中其实还会越到各种奇葩问题,比如自己心血来潮写了一段超级牛×的代码,本着闲着也是闲着的思想,在这段代码的基础上又进行了调优,但是优没调成,代码还给整的不能用了。鉴于马上要要交活了,这个时候就打算放弃,但是你发现原来能用的代码已经被改的面目全非,不能用了,那这就太让人崩溃了。这个时候就幻想着如果这两小时什么事情都没有发生该多好,如果能时间倒流该多好。Git告诉你,这事我能做。Git除了可以帮我们保存代码,还可以保存每次上传的痕迹,每上传一次就做一次备份,上传3次就备份3次,每次备份就相当于一个版本,任意时间可以通过Git查询曾经提交过的每一个版本对应的内容,这样就可以随时恢复到之前任意上传时间对应的状态了
追踪信息
使用Git的过程中大部分时间是管理自己写的东西,但是也会存在一些情况需要你去改别人的代码或者几个人编辑同一个文件。此时同一个文件,你改改,我改改,最后算谁的啊?出了问题你追责都没的追,怎么解决这个问题呢?Git提供了强制记录日志的功能,每次上传信息要求书写日志,可以记录本次上传的相关信息。比如写清楚本次上传的内容啊,对应的说明啊,等等。关于日志的内容书写格式并不是规范类的东西,只能算是一个约定,因此每个公司对开发者提交日志都有自己的要求,上传时写什么东西,这样出了问题就可以进行信息追踪了
GIT与SVN的区别【面试题】
Git 是分布式的,SVN 不是
Git 把内容按元数据方式存储,而 SVN 是按文件
Git 分支和 SVN 的分支不同
Git 没有一个全局的版本号,而 SVN 有
Git 的内容完整性要优于 SVN
git没有中央版本库,但是为了方便开发小组的成员们进行代码共享,我们通常会搭建一个远程的git仓库。和svn不同的是开发者本地也包含一个完成的git仓库,从某种程度上来说本地的仓库和远程的仓库在身份上是等价的,没有主从。
工作区:就是你在电脑里能看到的目录。
暂存区:英文叫 stage 或 index。一般存放在 .git 目录下的 index
文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
版本库:工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库
GIT安装完成,并测试成功
点击后,出现Git的控制台,在控制台输入git,可以看到相关的帮助信息
先建个文件夹 任意起名 任意位置 进去 右键 选 GIT BASH HERE
在文件夹中机会出现一个隐藏文件.git如图
当我们在learn-Git文件夹中添加文件的时候,那么这个文件就会被Git所管理
查看状态
我们在learn-git目录中创建一个readme.txt文件,可以通过命令来查看它的状态
命令:git status #查看状态
红色代表当前没有提交到缓存区
工作区提交缓存区
在git控制台中使用 命令
命令:git add readme.txt
这是完成了将文件由工作区提交暂存区
发现这时文件变成绿色,可以提交到本地仓库
缓存区提交本地仓库
命令:git commit -m '第一次提交'
说明:-m 后面跟随的是为你提交的备注
注意:如果第一次提交需要填写如下内容:
命令:git config --global user.email '[email protected]'
说明:指定邮箱
命令:git config --global user.name 'Shuwq'
说明:指定操作者
扩展:
添加多个文件 git add [file1] [file2] ...
添加指定目录到暂存区,包括子目录 git add [dir]
添加当前目录下的所有文件到暂存区 git add .
add 时,一个个文件加比较麻烦,可以用下面的命令将所有变动同步至暂存区(新增、修改、删除)
git add -A
下面的命令是将所有修改和删除同步至暂存区,不包括新增
git add -u
使用vi命令,对readme.txt文件进行编辑,添加我是第二行代码,使用wq退出
#第1步
vi readme.txt
#第2步:按下键盘i键,进入到编辑模式
#第3步:编辑结束后,按照键盘esc,回到命令模式
#第4步:按下键盘:键,进入到底行模式
#第5步:输入wq (保存并退出)
工作区、暂存区比较
命令: git diff readme.txt
工作区、本地库比较
命令: git diff HEAD readme.txt
# HEAD代表本地库
暂存区、本地库比较
命令:git diff --cached readme.txt
这里缓存区和本地库没有不同所以没有内容
工作区与暂存区如何比较
git diff 文件名
工作区与本地库如何比较
git diff HEAD 文件名
暂存区与本地库如何比较
git diff --cached 文件名
在这里插入图片描述
使用vi命令编辑readme.txt,添加“我是第三行代码”
命令:git add readme.txt #提交到暂存区
命令:git commit -m '第三次提交' #提交到本地仓库
我们可以通过git提供的查看日志命令来查看提交的日志
命令:git log #查看当前提交日志
可以发现,目前为止,我们已经在本地仓库中提交了3次,也就是说有3个不同版本。其中,最近的这个版本有一个标示:HEAD-> master 这就是标记当前分支的当前版本所在位置,如果没有显示当前所在位置可以使用下面命令查看:
命令:git log --decorate 查看当前提交日志,且显示当前分支的当前版本所在位置
在log中,每一个版本的前面,都有一长串随即数字: b44a10787c2b2bcc7ceb9c39cf06309065518d4b ,这是每次提交的commit id ,这是通过SHA1算法得到的值,Git通过这个唯一的id来区分每次提交
回退到之前版本
命令:git reset --hard HEAD^
回归到上一个版本,Git通过HEAD来判断当前所在的版本位置。那么上一个版本,就用HEAD^标示,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。
发现只有两个版本,我们在查看一下文件内容
回退到指定版本
首先们使用
命令: git reflog #查看所有操作
找到之后可以使用如下命令进行回退到指定版本
命令:git reset --hard 版本号 #回退到指定版本
我们回到到第三次提交,这时我们在查看文件
如何查看当前日志 (查看代码提交的日志信息)
git log
如何回退到上一个版本
git reset —hard Head^
如何查看所有操作日志 (查看git的操作日志【每一次的操作都会被记录到日志文件中】)
git reflog
如何回退到指定版本 (通过操作日志中记录的版本号,回退到指定的版本上)
git reset --hard 版本号
总结:
git作用:
git工作模型
git本地操作命令:
初始化工作区
git init
把工作区中的文件,添加到暂存区
git add 文件或目录
把暂存区中的文件,提交到本地仓库
git commit -m "备注"
对文件代码的差异化比较
#工作区 VS 暂存区
git diff 文件名
#工作区 VS 本地库
git diff HEAD 文件名
#暂存区 VS 本地区
git diff --cached 文件名
版本回退
#回退到上一个版本
git reset --hard HEAD^
查看git操作日志文件
git reflog
回退到指定的版本上
git reset -- hard 版本号 #版本号可以通过git reflog查看
当我们工作区内容想要提交到缓存区时【add】,突然发现有问题,想要撤销该如何处理?
当我们已提交到缓存区的内容,发现出现了bug,这时又应该如何处理哪?
以上操作我们可以使用GIT提供的撤销命令来完成
工作区撤销修改
编辑readme.txt添加“我是第四行”
在你提交缓存区前,你突然发现这个修改是有问题的,你打算恢复到原来的样子。怎么办?
使用git status 命令查看当前状态
命令:git checkout 文件名称 #撤销工作区修改
我们撤销后,在查看文件中内容,发现工作区内容已经撤销,并查看状态,发现状态很干净
我们在查看文件,发现已经恢复到最初始样子
如何实现工作区撤销修改
git checkout 文件名
如何将缓存区内容撤销到工作区
git reset head 文件名
能说分支作用
我们现在使用Git可以简单理解为阶段性的使用Git保存一下自己写的代码,每次提交形成一个版本信息。但是你能想象出当一个团队所有人提交的版本信息汇集到一起后是什么样子吗?那版本的数量是数以千计的。尽管Git提供了一系列的操作帮助我们完成版本的操作,但是最终架不住版本太多看着乱啊。
比如说张三是一个成熟的开发者,他做完一个模块提交一个版本,李四是一个入行一年的开发者,他做完一个功能提交一个版本,这都是可以接受的,你要碰到王五这种刚刚入行的,他恨不得一个文件提交一个版本,甚至写一个方法就提交一个版本,那Git中管理的版本真的就要数以万计了。
其实理想的情况应该是这样的,张三开发功能A,在A没有完全制作完成之前不要提交版本,等做完了再一次性提交所有的文件。这样每一个版本都是具有非常高的价值的,不会出现大量无效的提交。什么叫无效提交?你一个模块8个类配合在一起工作,你写完一个类提交一个版本,回头不管是回滚也好,对版本进行管理也好,单独一个类自己不能构成一个完整的开发状态,你回滚到这个版本你发现不能用,再换一个还是缺文件,这就让人很崩溃了。
但是作为开发者来说,我打版本也是为了自己用的方便,我写点备份一点,看上去也很合理。这个时候就提出了一个新的需求,能不能我自己提交自己专用的版本,而不要和项目组的核心代码掺和在一起呢?这个功能必须有,这就是下面要说的分支。
那么在说分支前,我们说一下之前的提交到底是什么?
提交的本质:记录仓库中一组文件的变化信息(增、删、改)
分支是什么?
分支就是多次提交串起来的一条线
场景:问题背景:要开发一个新功能,又不想打扰目前分支(main)的功能开发,于是
可以看到 main 分支的开发并不会停止,可以继续进行 c4 这个功能的开发,而 new 分支可以开发新功能 c5,同样不会影响 main
等 new 分支的功能开发测试没有问题了,main 也想要 new 的代码怎么办?
可以使用 merge 命令将 new 分支的变动合并至 main 分支,此时的 c6 中既包含了 c4 以来的修改,也包括了 c5 的修改,这时如果觉得 c5 已经没用了,可以将它删除
我们分支讲解主要包含
掌握分支创建与切换
分支切换
命令: git checkout dev #切换dev分支
编辑readme.txt,添加“我是dev提交的代码”
从工作区提交到缓存区执行:git add readme.txt
执行:git commit -m ‘dev分支提交’
切换到master分支,并查看文件内容
掌握分支合并与删除
上一个示例中,我们已经创建了dev分支,并在分支上添加了内容,如果想要将dev分支内容合并到master上如何操作
分支合并
命令: git merge dev #合并dev分支
注意:当前我们是在master分支
合并后,我们发现master分支上的readme.txt文件内容已经改变
分支删除
合并完分支之后,如果不再使用dev分支,则可以删除此分支,先查看当前分支:
命令 git branch #查看分支情况
当有前两个分支dev与master,我们当前是在master分支上,如何删除dev分支
命令 git branch -d 分支名
在这里插入图片描述
我们使用git branch查看,发现dev分支已经被删除
分支总结:
能说出常用的GIT远程仓库,并完成码云仓库的注册创建
本地仓库实际上是存储在个人电脑中的,用于存储个人提交记录与提交日志,说简单点,你现在commit提交的内容都在本地
远程仓库是公网或外网中的一个仓库,主要用于存储个人或团队的提交记录与提交日志,团队合作开发也是靠远程仓库实现的。大家都把东西提交到同一个远程仓库里面就OK了,这样每个人都可以获取到团队内开发的所有内容了。目前市面上常用的git支持的远程仓库有如下三个
常用的远程仓库
GitHub是一个面向开源及私有软件项目的托管平台,说白了就是给开发者提供了一个远程仓库。当然人家提供的功能还是很强大的,2018年微软以75亿美金收购了GitHub。现在的GitHub除了承载了代码托管平台的功能,更大的功能是组建了一个同性交流平台,大量的码农在上面做技术及非技术的交流,活跃用户还是很多的,可惜这个主站在国外,速度一般。
gitee和GitHub是一样的东西,是开源中国(OSChina)推出的基于Git的代码托管平台,又叫码云。有什么特点呢?有,还很硬的特点,主站在中国,是否秒懂?速度快啊,中国码农的数量那不是一般的多。
GitHub和gitee都是开源的代码托管平台,这里就有一个BUG了,如果我现在做的项目涉密性很强怎么办?放公网上?不现实啊,你再提供高等级的安全服务我也不敢放啊,自己搭一个把,gitlib就有了。gitlib基于git作为版本控制工具的基础上,可以为你搭建一个Web服务器,你就可以理解为自己搭建了一个局域网内能够访问的服务器。啥用?私服啊,代码安全啊,别人访问不到啊,就这个用。
那我们如果玩远程仓库玩哪个?百分之百玩gitee啊,速度快,又免费,多好。
注册登录
访问地址:https://gitee.com/
填写项目相关的信息
仓库创建完毕,可以看到,如果我们要与远程仓库同步,这里支持多种通信协议,当我们选中一种协议后,后面会出现对应的远程仓库地址。
git常用的远程仓库有哪些
github gitee gitlib
完成远程仓库的关联、拉取、推送、克隆操作
关联
现在readme.txt已经推送到我们自己的本地仓库,在推送到码云仓库前,我们需要先建立与远程仓库的关系
命令:git remote add origin 远程仓库地址 #关联远程仓库
远程仓库地址:可以从github、gitee上获取
例:https://gitee.com/itheima-jackie/hello-git.git
例如: git remote add origin https://gitee.com/itheima-jackie/hello-git.git
拉取
【注意】在推送代码前必须先拉取代码,否则无法推送本地仓库代码到仓库
命令:git pull origin master --allow-unrelated-histories
首次拉取需要添加:--allow-unrelated-histories
命令:git pull 后续拉取
推送(把本地库中的内容,同步到远程代码仓库)
命令: git push -u origin master #首次推送
命令: git push #后续推送
码云仓库有推送的信息
克隆
如果我们新加入一个团队,这个时候就需要我们把代码从远程仓库克隆过来,那么咱们操作呢?
新建文件夹learn-Git-B,新建的文件中右键
点击 Git bash Here
命令: git clone 远程仓库
这时候就拉取出远程仓库的内容
#关联远程仓库
命令: git remote add origin 远程仓库
#从远程仓库拉取最新版本到本地
命令: git pull origin master --allow-unrelated-histories
首次拉取需要添加:--allow-unrelated-histories
命令: git pull 后续拉取
#推送到远程仓库
命令: git push -u origin master 首次推送
命令: git push 后续推送
#从远程仓库克隆
命令: git clone 远程仓库
### 解释说明
# clone (克隆)
从远程服务器克隆一个一模一样的版本库到本地,复制的是整个版本库,叫做clone
clone是将一个库复制到你的本地,是一个本地从无到有的过程
# pull (拉取)
从远程服务器获取到一个branch分支的更新(新版本)到本地,并更新本地库,叫做pull
pull是指把远程服务器中版本库内容更新的部分同步到本地库
- [ ] 后续会发IDEA中使用GIT-集成GIT