【Git】原理及使用(二) (版本回退)

版本回退

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

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

复制代码
git reset 命令语法格式: git reset [--soft | --mixed | --hard] [HEAD]
--soft 参数对于工作区和暂存区的内容都不变,只是将版本库回退到某个指定版本。
--mixed 为默认选项,使用时可以不用带该参数。
该参数将暂存区的内容退回为指定提交版本内容,工作区文件保持不变。
--hard 参数将暂存区与工作区都退回到指定版本。
切记工作区有未提交的代码时不要用这个命令,因为工作区会回滚,你没有提交的代码就再也找不回了,所以使用该参数前一定要慎重。

HEAD说明:

复制代码
可直接写成 commit id,表示指定退回的版本
◦ HEAD 表示当前版本
◦ HEAD^ 上一个版本
◦ HEAD^^ 上上一个版本
◦ 以此类推...
可以使用〜数字表示:
◦ HEAD~0 表示当前版本
◦ HEAD~1 上一个版本
◦ HEAD~2 上上一个版本
◦ 以此类推...

测试回退功能:

回退到version2,重新基于version2开始编写。由于我们在这里希望的是将工作区的内容也回退到version2版本,所以需要用到--hard参数:

如果我后悔了,想再回到version3怎么办?我们可以继续使用git reset命令,回退到version3版本,但我们必须要拿到version3的commit id去指定回退的版本。

但我们看到了git log并不能打印出version3的commit id,运气好的话我们可以从终端上去找找之前的记录,运气不好的话commit id已经被我们搞丢了。

Git还提供了一个git reflog命令能补救一下,该命令用来记录本地的每一次命令。

Git的版本回退速度非常快,因为Git在内部有个指向当前分支(此处是master)的HEAD指针,refs/heads/master文件里保存当前master分支的最新commit id。当我们在回退版本的时候,Git仅仅是给refs/heads/master中存储一个特定的version,可以简单理解成如下示意图:

撤销修改

我们在⼯作区写了很⻓时间代码,想恢复到

上⼀个版本:

情况一:工作区的代码,还没有add

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

情况二:已经add,但还没commit

git reset 回退命令如果使⽤--mixed 参数,可以将暂存区的内容退回为指定的版本内容,但⼯作区⽂件保持不变。那我们就可以回退下暂存区的内容了。

情况三:已经add,并且也commit了

可以 git reset --hard HEAD^ 回退到上⼀个版本。不过,这是有条件的,就是你还没有把⾃⼰的本地版本库推送到远程。

删除文件

在Git中,删除也是⼀个修改操作。如果要删除 f3⽂件,怎么搞呢?如果你这样做了:

但这样直接删除是没有⽤的,git status 命令会⽴刻告诉你哪些⽂件被删除了:

此时,工作区和版本库就不一致了,要删文件,目前除了要删工作区的文件,还要清除版本库的文件。

走到这里,一般有两种可能:

复制代码
1.不小心删错了
2.确实要从版本库中删除文件

第一种误删操作:需要用git进行恢复

对于第一种情况,很明显是没有删完,我们只删除了工作区的文件。这时就需要使用git rm 将文件从暂存区和工作区中删除,并且commit :

现在,⽂件就从版本库中被删除了。

注意:

git rm f3 做了两件事:

1.从工作区删除 f3 文件

  1. 自动把"删除 f3"这件事加入暂存区
相关推荐
独隅4 分钟前
WebStorm 在 Linux 环境下的实战安装与高效开发指南
linux·ide·webstorm
坤坤子吖2 小时前
Linux网络编程:TCP服务器的多进程与多线程实现
linux·服务器·开发语言·网络·c++·笔记·学习
阡陌数智2 小时前
Claude API新版本重大变更与安全升级指南
java·linux·安全
奶茶树2 小时前
【Linux】环境开发工具(vim,gcc,g++,Makefile)
linux·运维·vim
木子欢儿6 小时前
国内 macOS/Linux 安装 rust
linux·运维·服务器·macos·rust
say_fall6 小时前
【Linux网络编程】计算机网络基础:局域网与广域网、OSI七层模型与TCP/IP五层模型、封装解包与MAC/IP地址、端口号与socket编程接口
linux·网络·tcp/ip·计算机网络·信息与通信
进击的荆棘6 小时前
Linux系统——线程同步与互斥
linux·运维·服务器·策略模式·同步·互斥·posix
橙橙笔记6 小时前
QT的学习第四部分
linux·qt·学习·音视频
.道阻且长.6 小时前
Linux基本开发工具:gdb和cgdb的使用
linux·运维·服务器·开发语言
叼烟扛炮7 小时前
Linux 学习笔记(五十四):内网穿透实战——用 frp 让外网访问你的私人电脑
linux·服务器·网络·笔记·学习