09.数据恢复与还原

48 阅读7分钟

数据恢复与还原

1.介绍

在任何一个阶段,我们都有可能想要撤销某些操作。在本章,我们将会学习几个撤销所作修改的命令。注意,某些撤销操作是不可逆的。这是在使用Git的过程中,由于操作失误可能导致之前的工作丢失的少数情况之一

1769841079077.png

2.restore命令

介绍

git restore命令主要用于撤销工作区或暂存区中文件的未提交更改,将指定文件恢复至最近一次提交的状态,便于快速撤销误操作或清理工作空间,保持代码与仓库中的最新版本同步

语法

FigureT19784930.jpg

注意

在执行git restore命令时,一定要谨慎,因为它会直接覆盖或删除相关更改。如果尚未提交的重要改动被覆盖,则可能无法找回。因此,在进行此类操作之前,请确保了解并评估潜在的风险

案例

还原工作空间

初始化一个仓库

git init
echo "111" >> aaa.txt
git add ./
git commit -m "111" ./

编辑文件,然后使用Git还原

echo "222" >> aaa.txt
# 发现有更改未被commit
git status
# 撤销对工作空间的修改
git restore aaa.txt
# 查看文件内容,发现未被commit的内容已被撤销
cat aaa.txt
# 查看状态,发现没有变更需要commit
git status
还原暂存区

初始化项目

git init
echo "111" >> aaa.txt
git add ./
git commit -m "111" ./

查看当前暂存区

git ls-files -s

编辑文件,添加到暂存区,查看暂存区

echo "222" > aaa.txt
git add ./
git ls-files -s

还原暂存区

# 查看状态发现有变更还没有commit
git status
# 还原暂存区
git restore --staged aaa.txt
# 打印内容发现工作空间还没有被还原
cat aaa.txt
# 再次查看暂存区
git ls-files -s
# 查看当前状态,已经还原成未添加到暂存区的状态
git status

继续还原工作空间

git restore aaa.txt
cat aaa.txt
git status
同时还原暂存区和工作空间

初始化项目

git init
echo "111" >> aaa.txt
git add ./
git commit -m "111" ./

编辑文件,添加到暂存区

git ls-files -s
cat aaa.txt
echo "222" >> aaa.txt
git add ./
git ls-files -s
cat aaa.txt

同时还原暂存区和工作空间

git restore -S -W aaa.txt
git ls-files -s
cat aaa.txt

3.amend命令

介绍

amend是git commit命令的一个参数,该参数用于修改最后一次提交的内容与提交信息,允许用户将新的更改(通过git add添加至暂存区)合并到最近的提交记录中。同时可重新编辑提交消息

1769863379998.png

语法

git commit --amend -m "注释"

案例

提交日志修正

有时当我们提交完,才会发现漏掉了几个文件没有添加,或者提交信息写错了。此时,可以运行带有amend选项的提交命令来重新提交

初始化项目

git init
echo "初始化文件" >> aaa.txt
git add ./
git commit -m "初始化文件" ./

具体操作

git log --oneline
git commit --amend -m "初始化文件-001" ./
git log --oneline
提交内容修正

有时候提交文件之后才发现文件漏了一些内容,我们当然可以编辑文件再次提交,但这样会使得提交日志过于冗余;Git允许我们修改提交内容并且不造成提交日志的冗余

初始化项目

git init
echo "1245" >> aaa.txt
git add ./
git commit -m "初始化文件" ./

不使用amend的做法,对项目中造成很多无用的冗余日志

# 编辑内容为12345
vi aaa.txt
cat aaa.txt
git commit -m "第一次写错了,补上了第一次的错误" ./
git log --oneline

使用amend的做法,使用amend来修正提交内容

# 编辑内容为12345
vi aaa.txt
cat aaa.txt

git commit --amend -m "初始化文件" ./
git log --oneline
提交文件修正

若在本应提交两个文件的情况下,不慎遗漏了一个,仅提交了一个,那么再次提交会导致两个文件版本不一致。然而,Git允许我们对某一次的提交文件进行修正

初始化项目

git init
echo "111" >> aaa.txt
git add ./
git commit -m "111" ./

使用amend进行提交文件的修正

git log --oneline
echo "222" >> bbb.txt
git add ./
git commit --amend -m "初始化项目" ./
git log --oneline

4.reset命令

介绍

git reset命令用于撤销提交、回退版本或重置暂存区和工作空间的状态

语法

FigureADT20488099.jpg

什么是HEAD~

HEAD~指的是回退到上一个版本,与此同时Git还支持HEAD~~的写法,指的是回退到上上个版本,以此类推

案例

回退HEAD指针

初始化项目

git init
# 添加111内容并commit
echo "111" >> aaa.txt
git add ./
git commit -m "111"
# 添加222内容并commit
echo "222" >> aaa.txt
git commit -m "222"
# 添加333内容并commit
echo "333" >> aaa.txt
git commit -m "333"
# 查看日志
git log --oneline
git reflog

将HEAD指针回退到上一个版本

# 将HEAD指针回退到上一个版本,或者使用git reset --soft commit哈希值 也是可以的
git reset --soft HEAD~
# 注意:git log不能查询已经被删除的提交或通过reset操作移除的提交记录
git log --oneline --all
# 使用reflog命令查看到所有commit
git reflog
# 查看暂存区与工作空间的内容是否有变化
git ls-files -s
cat aaa.txt

查看当前工作空间状态,当前工作空间的状态变为了Changes to be committed,即有更改的文件已经被追踪到了,但还未提交

回退暂存区

使用git reset --soft用于还原HEAD指针指向的Commit对象,并不会对暂存区和工作空间造成影响,如果想要还原暂存区可以使用git reset --mixed。下面演示回退暂存区的步骤

初始化项目

git init
# 添加111内容并commit
echo "111" >> aaa.txt
git add ./
git commit -m "111"
# 添加222内容并commit
echo "222" >> aaa.txt
git commit -m "222"
# 添加333内容并commit
echo "333" >> aaa.txt
git commit -m "333"
# 查看日志
git log --oneline
# 查看文件内容
cat aaa.txt
# 查看暂存区
git ls-files -s
# 查看暂存区的内容
git cat-file -p [上面命令查询出来的值]

还原暂存区

# 回退暂存区到上一个版本
git reset --mixed HEAD~
# 查看暂存区
git ls-files -s
# 查看暂存区内容
git cat-file -p [上面命令查询出来的值]
# 查看工作空间内容发现没有更改
cat aaa.txt
# 查看日值
git log --oneline
git reflog

查看当前工作空间状态,当前的工作状态处于Changes to be committed,即有更改的文件已经被追踪到了,但还未提交

回退工作空间

使用git reset --hard可以回退HEAD指针、暂存区和工作空间

git init
# 添加111内容并commit
echo "111" >> aaa.txt
git add ./
git commit -m "111"
# 添加222内容并commit
echo "222" >> aaa.txt
git commit -m "222"
# 添加333内容并commit
echo "333" >> aaa.txt
git commit -m "333"
# 查看日志
git log --oneline
# 查看暂存区
git ls-files -s
# 查看暂存区内容
git cat-file -p [上面命令查询出来的值]

执行操作

# 回退HEAD指针,暂存区,工作空间到上个版本
git reset --hard HEAD~
# 查看日志
git log --oneline
# 查看暂存区,发现被回退到上个版本
git ls-files -s
# 查看工作空间,发现被回退到上个版本
cat aaa.txt
# 查看日志
git reflog

查看当前工作空间状态,由于HEAD指针、暂存区和工作空间都被回退了,因此当前工作空间为nothing to commit状态,即所有的操作均已提交

总结

1769863186322.png

5.git revert

后续补充

6.reflog与数据恢复

1769863361851.png

7.正确使用reset和revert

1769863868910.png

8.总结

1769863526399.png

注意:在git新版本中,尝试使用git restore替代git checkout