git图解(2):代码回退
关于 git 的基本理解, 在第一篇 git文章 已介绍。 上一篇文章主要讲解了git的提交操作, 本篇在上篇基础上着重写git代码的逆向操作: 代码回退 。网上关于git回退的文章比较多, 本文是个人理解实践的汇总, 不当、不全之处请评论区指出。
首先,回顾下git代码存在的5个区域, 分别是 工作区间 、 工作现场 、 缓存区 (或叫暂存区)、 本地仓库 (或叫当前分支)、 远程仓库 (或叫远程分支);如下图:
1.缓存区代码覆盖工作区代码
场景: 缓存区 存有上次改动代码,即之前有执行:git add
对应指令:
// 将缓存区某一文件代码 覆盖本地工作区:
git checkout -- testReset.txt
// 将匹配的文件覆盖:
git checkout -- *.txt
// 将所有文件覆盖:
git checkout -- .
2.本地仓库代码覆盖缓存区代码
场景:发现之前add的文件不需要了,又不想 工作区间 重新改回去。
对应指令:
// 将本地仓库某一文件覆盖缓存区:
git reset HEAD testReset.txt
// 将匹配的文件覆盖缓存区:
git reset HEAD *.txt
// 将所有文件覆盖缓存区:
git reset HEAD .
注意: 改变的是
缓存区
代码,
工作区间
代码不变(编辑器代码不会改变)
3.本地仓库代码覆盖工作区代码(常用)
上述两场景在实际开发中没那么常用,接下来 本地仓库 代码 覆盖 工作区间 代码 则经常会用到。
场景: 当前 工作区间 代码混乱(一般更新或合并分支后) , 废弃当前改动;
对应指令:
// 将本地仓库某一文件代码 覆盖本地工作区:
git checkout head testReset.txt
// 将本地仓库所有文件代码 覆盖本地工作区:(谨慎操作):
git checkout head .
我们知道 本地仓库 中有一个commit 列表, 记录了所有commit的记录, 查看commit列表指令:
// 查看commit id, 查看提交记录(git commit的记录)
git log
git log --pretty=oneline
// 查看以往提交历史(包括 撤销回退 记录)
git reflog
根据commit列表, 工作区间 代码能实现更灵活的回退:
// 本地工作区间代码 回退到上一次版本、上上次、前10个版本
git reset --hard HEAD^
git reset --hard HEAD^^
git reset --hard HEAD~10
// 本地工作区间代码 回退到指定版本(“d362816”为commit id)