数据恢复与还原
1.介绍
在任何一个阶段,我们都有可能想要撤销某些操作。在本章,我们将会学习几个撤销所作修改的命令。注意,某些撤销操作是不可逆的。这是在使用Git的过程中,由于操作失误可能导致之前的工作丢失的少数情况之一
2.restore命令
介绍
git restore命令主要用于撤销工作区或暂存区中文件的未提交更改,将指定文件恢复至最近一次提交的状态,便于快速撤销误操作或清理工作空间,保持代码与仓库中的最新版本同步
语法
注意
在执行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添加至暂存区)合并到最近的提交记录中。同时可重新编辑提交消息
语法
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命令用于撤销提交、回退版本或重置暂存区和工作空间的状态
语法
什么是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状态,即所有的操作均已提交
总结
5.git revert
后续补充
6.reflog与数据恢复
7.正确使用reset和revert
8.总结
注意:在git新版本中,尝试使用git restore替代git checkout