Git 各种回滚操作

361 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第 2 天,点击查看活动详情

前言

Git 将整个版本控制的流程划分为 3 个区域

  • 工作区(working directory):日常对文件的修改,会立即影响到工作区中内容
  • 暂存区(stage):只有git add命令执行后的文件,才会到暂存区中保存
  • 版本库(repository):只有git commit命令执行后的文件,才会保存到版本库中

在命令行模式下,通过git status命令,可以明显区分工作区与暂存区中的文件。其中,工作区中的文件以红色标识,暂存区中的文件以* *绿色**标识。

image-20220424231923679.png

1. 版本库不同版本之间的回滚操作

先添加三个版本的内容

 # 第一个版本无法直接使用 git commit -am ""
 git add App.txt
 git commit -m "feat:第一版本"
 ​
 # 第二个版本
 git commit -am "feat:第二版本"
 ​
 # 第三个版本
 git commit -am "feat:第三版本"

通过命令查看分支的记录git log --graph

image-20220424232734688.png

真实场景

  • 新上线的功能出现了生产环境的故障,第一时间应该回滚版本。对于代码而言,可以回滚版本,重新打包

通过命令git reflog查看提交记录

image-20220424232950923.png

 # 回滚到指定版本需要,指定提交记录的 ID(不需要写全,能标识出唯一即可)
 git reset --hard c1cee7b
 ​
 #版本记录中没有之前的第三个版本了
 git log --graph 

image-20220424233214565.png

如果还想回到之前的「第三版本」,则需要找到第三版本的 commit ID,通过git log显然是无法找到,因为它展示的版本库的记录。需要通过git reflog查看关于版本操作的所有记录,包括刚刚的版本的回滚操作,也会在其中显示

image-20220424233448196.png

git reflog中找到之前版本的记录,再重新git reset --hard 512a374即可回到第三版本,同时这个操作会被记录下来

image-20220424233657586.png

2. 工作区-暂存区-版本库三者之间的回滚操作

工作区的回滚

在 Working Directory 中对文件进行修改,此时想要取消所有的修改,只需要根据git status命令的提示,将工作区中的修改放弃即可。

image-20220424234348420.png

  • 根据提示,git restore <file>可将所有的文件修改放弃
  • git add <file>将文件提交到暂存区

暂存区回滚到工作区

Store 中修改,来自于工作区的提交git add <file>,在git status的提示下

image-20220424234639123.png

  • git restore --staged <file>可将暂存区的文件,重新打回到工作区

版本库同步到暂存区、工作区

如果开发到一半,发现暂存区的内容与工作区的内容都不想要了,需要以最新的版本库内容为准,则需要将暂存区和工作区的修改全部放弃

 # --source 指定版本库的 ID(HEAD 表示当前最新的版本,也可以指定其他版本)
 # --staged 暂存区文件
 # --worktree 工作区文件
 git restore --source=HEAD --staged --worktree <file>

3. 文件的删除

Git 记录的是对文件的修改,因此文件的删除,其实也被看到是一种修改。删除的操作,在 Git 中的操作与普通修改是一致的,只不过 Git 额外提供了一个 git rm <file>命令来将当前删除文件提交到暂存区,当然使用git add <file>也可以提交删除文件

image-20220425221322327.png