Git基本操作(2)

Git基本操作(2)

今天我们来继续了解Git的操作

上交文件之后,git文件的变化

我们之前不是上交了几个文件嘛,我们可以看看我们隐藏的.git文件发生什么变化没有:

我们发现,我们的对象库中记录了每次上交的commit编号,而编号的前两位就是此次上交储存在对象库中的文件名。

objects 为Git的对象库,里面包含了创建的各种版本库对象及内容。当执行git add 命令时,暂存区的目录树被更新,同时⼯作区修改(或新增)的文件内容被写⼊到对象库中的⼀个新的对象中,就位于?".git/objects"?目录下,查找object时要将commit id 分成2部分,其前2位是⽂件夹名称,后38位是文件名称

git cat-file

找到这个⽂件之后,⼀般不能直接看到里面是什么,该类⽂件是经过? sha (安全哈希算法)加密过的文件,好在我们可以使用 git cat-file 命令来查看版本库对象的内容:

其中还有一行tree b7a6dcbed4b5f267fde31ed7438195daaace7755,我们也可以打印来看看

如果我们此时继续查看,我们就可以查看My_file里面的内容:

因为我的My_file里面没有任何内容,所以没有打印任何内容。

通过这次操作,我们可以大概理解,git会记录我们的修改操作,我们找到对应的修改操作之后,就可以找到对应的文件。

HEAD指针里面有啥

除此之外,我们可以看看HEAD指针里面有啥:

我们来看看日志:

这时候我们知道了,HEAD指针里面储存了最近一次上交时的commit编号。

文件被修改

首先,我们得知道git是追踪修改痕迹(这里的修改痕迹指的是新增文件,修改文件,删除文件 )的版本控制器。我们之前把My_file文件已经上交了,如果此时我们将My_file里写入文字:

此时我们修改了工作区中的My_file文件。

git status

此时我们可以用git status来查看我们git仓库的状态:

这里提示我们工作区中一个文件被修改了,就是我们的My_file。而我们的暂存区没有改动。

git diff + 文件名

我们可以用git diff + 文件名来查看到底我们的文件有了哪些变化:

我们看到带有加号的内容就是新增的内容。

我们还可以用git diff HEAD -- [file] 命令来查看版本库和工作区文件的区别。

我们了解好了状态之后,我们就可以把文件提交暂存区:

这个时候我们再来看仓库的状态:

这个时候显示的是,,修改需要被commited了,我们此时commit一下:

这时候,显示的是没有什么需要被提交,工作区是干净的。

版本回退(git reset)

git最重要的功能之一就是版本回退:

之前我们也提到过,Git能够管理⽂件的历史版本,这也是版本控制器重要的能⼒。如果有⼀天你发现之前前的⼯作做的出现了很大的问题,需要在某个特定的历史版本重新开始,这个时候,就需要版本回退的功能了。

执行git reset 命令⽤于回退版本,可以指定退回某⼀次提交的版本。要解释⼀下"回退"本质是要将版本库中的内容进⾏回退,⼯作区或暂存区是否回退由命令参数决定:

git reset 命令语法格式为: git reset [--soft | --mixed | --hard] [HEAD]

--mixed 为默认选项,使⽤时可以不⽤带该参数。该参数将暂存区的内容退回为指定提交版本内容,工作区文件保持不变。

--soft 参数对于工作区和暂存区的内容都不变,只是将版本库回退到某个指定版本。

--hard 参数将暂存区与工作区都退回到指定版本。切记工作区有未提交的代码时不要⽤这个命令,因为工作区会回滚,你没有提交的代码就再也找不回了,所以使用该参数前⼀定要慎重。

• HEAD 说明:

◦ 可直接写成commit id,表示指定退回的版本

◦ HEAD 表示当前版本

◦ HEAD^ 上⼀个版本

◦ HEAD^^ 上上⼀个版本

◦ 以此类推...

• 可以使用〜数字表示:

◦ HEAD~0 表示当前版本

◦ HEAD~1上⼀个版本

◦ HEAD^2 上上⼀个版本

为了演示,我们做一些准备工作:

现在我们想退回到第一次提交的版本,我们现在可以用git reset 来进行回退,但是在这之前,我们要弄清工作区 暂存区 版本库 中的内容:

我们现在工作区 暂存区 版本库 的内容都是第二次提交的内容:

我们的 --soft 参数对于工作区和暂存区的内容都不变,只是将版本库回退到某个指定版本

我们的 --mixed 为默认选项,使用时可以不用带该参数。该参数将暂存区的内容退回为指定提交版本内容,工作区文件件保持不变

我们的 --hard 参数将暂存区与工作区都退回到指定版本。切记用作区有未提交的代码时不要用这个命令,因为工作区会回滚,你没有提交的代码就再也找不回了,所以使用该参数前⼀定要慎重。

我们这里演示一下--soft选项:

我们来查看仓库的状态:

我们来看看版本库和工作区文件的区别:

再来看看工作区和暂存区的区别:

发现版本库的内容已经回退,工作区和暂存区的内容没有回退。

除此之外,我们还可以利用commit的id来回退,我们打印日志:

找到第一次上交的commit编号,然后用类似的方法:

撤销回退

拿上面举例,我后悔撤销了,该怎么办呢?其实,我们如果能拿到第二次提交时的commit的id,就没问题。

但是这是因为凑巧我们打印了第二次提交时的commit的id,要是万一没打印该怎么办?

git reflog

也许还可以补救,我们可以用git reflog 命令,可以查看我们本地的每一次命令:

HEAD前面的部分commit的id也可以帮助我们进行回退:

但是,现实开发中,因为一直再进行开发,id号什么的,早就忘的一干二净了,所以还是小心点为上策~。

撤销的三种情况

还没有add

这个时候,我们只是在工作区进行了修改,还没有进行add。

假设,我现在对我们的文件进行了修改:

现在我想回到修改之前的版本,我们有一条命令:

git checkout -- [file]

git checkout -- [file] 命令让工作区的
文件回到最近⼀次 add 或 commit 时的状态。要注意 git checkout -- [file] 命令中的
-- 很重要,切记不要省略,⼀旦省略,该命令就变为其他意思了

已经add还没有commit

这个时候我们可以用--mixed选项:

cpp 复制代码
 git reset HEAD 文件名

因为--mixed是默认的,所以不用再写。

已经add且commit

这个时候只能用--hard:

cpp 复制代码
git reset --hard 想回退的版本的commitid

这个时候希望文件还没有交到远程仓库上,要是交了,事情就麻烦了。

从本地仓库删除文件

如果我们直接在工作区删除文件,git会记录我们的修改的:

我们只删除了工作区的,并没有删除暂存区的,要删除暂存区的,我们要使用:

git rm 文件名

删除之后,记得commit我们的修改痕迹:

相关推荐
刘大辉在路上9 小时前
突发!!!GitLab停止为中国大陆、港澳地区提供服务,60天内需迁移账号否则将被删除
git·后端·gitlab·版本管理·源代码管理
落落鱼201318 小时前
cenos如何升级git到2以上版本
git
Domain-zhuo18 小时前
Git常用命令
前端·git·gitee·github·gitea·gitcode
sin220119 小时前
git自己模拟多人协作
git
大猫和小黄1 天前
Windows、CentOS环境下搭建自己的版本管理资料库:GitBlit
linux·服务器·windows·git
孤水寒月1 天前
Git忽略文件.gitignore
git·elasticsearch
DN金猿1 天前
git命令恢复/还原某个文件、删除远程仓库中的文件
git
DWei_GaGa1 天前
Git:查看分支、创建分支、合并分支
git
涵信2 天前
Windows11 安装 Ubuntu-20.04,同时安装配置 zsh shell,配置 git 别名(alias),大大提高开发效率
linux·git·ubuntu·bash
喝鸡汤2 天前
一起学Git【第五节:git版本回退】
git