首发于 浅谈前端
git图解(2):代码回退

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)