Git 版本回退 reset --mixed 命令

概述

git reset --mixed commit-id:回退到指定版本。(mixed:混合的)

该命令不仅修改了分支中HEAD指针的位置,还将暂存区中数据也回退到了指定版本,但是工作区中的版本仍是回退前的版本。

--mixed参数是git reset命令的默认选项。

比如首先在版本库中的 readme.txt 文件中添加一行内容,并提交该内容。我们的目的就是要再回退到该版本。

1、查看本地版本库日志。

复制代码
# 1.使用git log查看历史版本记录
$ git log --oneline
bcd2726 (HEAD -> master) 第3次提交,新增内容:readme.txt file v3
b2de20c 第2次提交,新增内容:readme.txt file v2
40212c3 第1次提交,创建readme.txt文件

# 2.使用git reflog查看历史版本记录
$ git reflog
bcd2726 (HEAD -> master) HEAD@{0}: commit: 第3次提交,新增内容:readme.txt file v3
b2de20c HEAD@{1}: commit: 第2次提交,新增内容:readme.txt file v2
40212c3 HEAD@{2}: commit (initial): 第1次提交,创建readme.txt文件

# 3.查看readme.txt文件的内容
$ cat readme.txt
readme.txt file v1
readme.txt file v2
readme.txt file v3

2、向readme.txt文件中新增一行数据,并提交到本地版本库。

复制代码
# 1.新增数据
$ echo "readme.txt file v4" >> readme.txt

# 2.查看readme.txt文件内容
$ cat readme.txt
readme.txt file v1
readme.txt file v2
readme.txt file v3
readme.txt file v4

# 3.提交到本地版本库
$ git commit -a -m '第4次提交,新增内容:readme.txt file v4'
warning: LF will be replaced by CRLF in readme.txt.
The file will have its original line endings in your working directory
[master 68701fc] 第4次提交,新增内容:readme.txt file v4
 1 file changed, 1 insertion(+)

# 4.现在查看此时本地版本库日志
$ git log --oneline
68701fc (HEAD -> master) 第4次提交,新增内容:readme.txt file v4
bcd2726 第3次提交,新增内容:readme.txt file v3
b2de20c 第2次提交,新增内容:readme.txt file v2
40212c3 第1次提交,创建readme.txt文件

3、现在比对工作区与暂存区、暂存区与本地版本库的差异。

复制代码
# 1.比对工作区与暂存区中文件的差异
$ git diff readme.txt

# 2.比对暂存区与本地版本库中文件的差异
$ git diff --cached readme.txt
我们可以看到此时,工作区、暂存区与本地版本库中的readme.txt文件状态无差异。

4、开始回退操作,退回到V3版本。

使用git reset --mixed HEAD^命令,退回到前一个版本。

复制代码
# 回退一个提交版本
$ git reset --mixed HEAD^
Unstaged changes after reset:
M       readme.txt

说明:

Unstaged changes after reset:意思是回退后,有为被追踪的文件。

M readme.txt:表示readme.txt文件修改后,未被追踪,也就是修改后未添加到暂存区的状态。

这里也就说明了,暂存区中readme.txt文件被回退了。我们还是继续按步骤往下演示。

5、回退后,对比工作区、暂存区与本地库中版本中文件的差异。

复制代码
# 1.比对工作区与暂存区中文件的差异
$ git diff readme.txt
warning: LF will be replaced by CRLF in readme.txt.
The file will have its original line endings in your working directory
diff --git a/readme.txt b/readme.txt
index 1e6534a..47b238c 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,3 +1,4 @@
 readme.txt file v1
 readme.txt file v2
 readme.txt file v3
+readme.txt file v4

# 2.比对暂存区与本地版本库中文件的差异
$ git diff --cached readme.txt

# 3.比对工作区与本地版本库中文件的差异
$ git diff HEAD readme.txt
warning: LF will be replaced by CRLF in readme.txt.
The file will have its original line endings in your working directory
diff --git a/readme.txt b/readme.txt
index 1e6534a..47b238c 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,3 +1,4 @@
 readme.txt file v1
 readme.txt file v2
 readme.txt file v3
+readme.txt file v4

回退后,我们再次对比了工作区、暂存区与本地库中版本中文件的差异:

发现工作区与暂存区内容出现了差异。

暂存区与本地库中的版本没有差异。

工作区与本地库中的版本出现了差异。

说明:工作区中的内容没有回退,但是暂存区和本地库中的内容回退到了之前的版本。(重要)

6、查看本地版本库的提交日志信息。

复制代码
# 1.使用git log查看历史版本记录
$ git log --oneline
bcd2726 (HEAD -> master) 第3次提交,新增内容:readme.txt file v3
b2de20c 第2次提交,新增内容:readme.txt file v2
40212c3 第1次提交,创建readme.txt文件

# 2.使用git reflog查看历史版本记录
$ git reflog
bcd2726 (HEAD -> master) HEAD@{0}: reset: moving to HEAD^
68701fc HEAD@{1}: commit: 第4次提交,新增内容:readme.txt file v4
bcd2726 (HEAD -> master) HEAD@{2}: commit: 第3次提交,新增内容:readme.txt file v3
b2de20c HEAD@{3}: commit: 第2次提交,新增内容:readme.txt file v2
40212c3 HEAD@{4}: commit (initial): 第1次提交,创建readme.txt文件

从上我们可以看到:(重点)

使用git log命令查看历史版本记录,发现已经看不到第4次提交了。

使用git reflog命令查看历史版本记录,第四次提交这个版本仍然存在的。

7、恢复到回退前版本。

上面说了,使用git reset --mixed命令回退,做了两个操作:

移动HEAD指针(版本库的回退)。

暂存区的内容也回退到HEAD指针指向的版本。

而工作区内容不回退。

我们现在来查看一下工作目录中的文件状态。

复制代码
$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   readme.txt

no changes added to commit (use "git add" and/or "git commit -a")

我们可以看到readme.txt文件是修改未暂存状态。

所以若要恢复到回退之前的版本,也是两种方式:

把工作区的readme.txt文件添加到暂存区,在commit提交到本地版本库中。

使用git reset --mixed 68701fc命令,退回到第四次提交版本。

提示(重要):就本例而言,虽然可以通过先add到暂存区,再commit提交到本地版本库的方式,就可以恢复回退前的版本。但若回退的版本是很多版本之前的版本,最好不要使用该方式,而是使用版本跳转命令的方式(也就是第二种方式)。

第一种常规操作,这里就不演示了。下面演示一下第二种方式:

复制代码
# 1.查看可回退的历史版本
$ git reflog
bcd2726 HEAD@{1}: reset: moving to HEAD^
68701fc (HEAD -> master) HEAD@{2}: commit: 第4次提交,新增内容:readme.txt file v4
bcd2726 HEAD@{3}: commit: 第3次提交,新增内容:readme.txt file v3
b2de20c HEAD@{4}: commit: 第2次提交,新增内容:readme.txt file v2
40212c3 HEAD@{5}: commit (initial): 第1次提交,创建readme.txt文件

# 2.回退到第四次提交
$ git reset --mixed 68701fc

# 3.查看工作目录中文件状态
$ git status
On branch master
nothing to commit, working tree clean

# 4.查看版本历史
$ git log --oneline
68701fc (HEAD -> master) 第4次提交,新增内容:readme.txt file v4
bcd2726 第3次提交,新增内容:readme.txt file v3
b2de20c 第2次提交,新增内容:readme.txt file v2
40212c3 第1次提交,创建readme.txt文件

# 5.查看可回退的历史版本
$ git reflog
68701fc (HEAD -> master) HEAD@{0}: reset: moving to 68701fc
bcd2726 HEAD@{1}: reset: moving to HEAD^
68701fc (HEAD -> master) HEAD@{2}: commit: 第4次提交,新增内容:readme.txt file v4
bcd2726 HEAD@{3}: commit: 第3次提交,新增内容:readme.txt file v3
b2de20c HEAD@{4}: commit: 第2次提交,新增内容:readme.txt file v2
40212c3 HEAD@{5}: commit (initial): 第1次提交,创建readme.txt文件

# 6.查看readme.txt内容
$ cat readme.txt
readme.txt file v1
readme.txt file v2
readme.txt file v3
readme.txt file v4

我们查看到,readme.txt文件的内容已经完全恢复。

原文:版本回退:git reset --mixed命令

相关推荐
学传打活1 天前
【边打字.边学昆仑正义文化】_进阶篇5 宇宙星系的运转(续3)
微信公众平台·1024程序员节·汉字·昆仑正义文化
学传打活6 天前
【边打字.边学昆仑正义文化】_进阶篇5 宇宙星系的运转(续1)
微信公众平台·1024程序员节·汉字·昆仑正义文化
fangzhanpeng16814 天前
快速掌握C#语言基础知识点(1.基础数据类型)
开发语言·c#·1024程序员节
无己心16 天前
面向多平台 AI 搜索引擎的适配层架构设计
前端·人工智能·搜索引擎·ai·1024程序员节
u01030552722 天前
AI驱动的安卓UI自动生成功能实现
人工智能·1024程序员节
u01030552723 天前
长株潭智能体赋能腾讯元器链接共享
1024程序员节
云贝贝贝24 天前
OceanBase认证体系介绍与备考指南
运维·服务器·oceanbase·1024程序员节
u01030552724 天前
Java图像处理实战指南
人工智能·1024程序员节
u01030552725 天前
Java AWT鼠标事件全解析
人工智能·1024程序员节
u0103055271 个月前
Java实用类应用精讲
人工智能·1024程序员节