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我们的修改痕迹:

相关推荐
但老师37 分钟前
Git遇到“fatal: bad object refs/heads/master - 副本”问题的解决办法
git
秃头女孩y39 分钟前
git创建分支
git
研究是为了理解6 小时前
Git Bash 常用命令
git·elasticsearch·bash
DKPT6 小时前
Git 的基本概念和使用方式
git
Winston Wood9 小时前
一文了解git TAG
git·版本控制
喵喵先森10 小时前
Git 的基本概念和使用方式
git·源代码管理
xianwu54311 小时前
反向代理模块
linux·开发语言·网络·git
binishuaio13 小时前
Java 第11天 (git版本控制器基础用法)
java·开发语言·git
会发光的猪。14 小时前
如何在vscode中安装git详细新手教程
前端·ide·git·vscode
stewie616 小时前
在IDEA中使用Git
java·git