版本控制原理
HEAD指针移动(HEAD指针见)
三种控制方法(good为例)
1、基于索引值操作(推荐)//版本前进后退都可以
git reset --hard index
index是git reflog中的哈希值,是局部索引值,虽然只有一部分但是这部分唯一确定一个版本足够了 index选中即是复制这里从iiiii回退到了ffff版本
HEAD is now at e4161ce insert ffffffffffff good.text
哈希值后边是我们当初自己写的commit message
此时git reflog发现HEAD指向变了
注意两行HEAD->master 哈希值是一样的 后面的日志不一样 一个是reset 一个是commit message
版本前进也是使用reset命令 自己选择对应的版本哈希值即可
2、使用异或符号^ //只能版本后退
git reset --hard HEAD^
当前HEAD在6 7fae0a (HEAD -> master) HEAD@{7}
执行git reset --hard HEAD^后到了fb3310d
辨析 注意b3310d 所指向文件不是good是bad 因为自己测试时候建立了两个文件 把bad当成good就好
此时用分别用git log 和 git reflog 输出日志当前HEAD都是在fb3310d,但是需要区别git log只输出当前版本HEAD之前的版本即HEAD{9-12},而reflog是输出全部不管是当前版本的过去还是未来 HEAD{0-12}
异或每次只能回退一步
若要回退多步则用多个异或^符号 如回退三步
git reset --hard HEAD^^^
缺点若后退很多步 ^需要数很多个
3、使用波浪线符号~
git reset --hard HEAD~5
~后面数字是几就回退几步
总结
版本控制三种方法:
git reset --hard index
git reset --hard HEAD^
git reset --hard HEAD~5
最佳组合 git reset --hard index + git reflog
reset三个参数对比 推荐 hard
soft 在本地库移动HEAD指针
mixed 在本地库移动HEAD指针 + 重置暂存区
hard 在本地库移动HEAD指针 + 重置暂存区 + 重置工作区
当前本地库HEAD在mmmmmm,soft rest后虽然reflog发现HEAD已经变成了51550bb 但是我们cat一下本地文件工作区发现文件内容还是停留在mmmm状态工作区没变
此时通过git status查看暂存区状态发现modified是绿色的 暂存区也没变
接着reset mixed回退 HEAD变了,cat显示工作区没变仍停留在mmmmmm,但是暂存区变了,modified变成了红色