younghz原创,转载请注明出处:http://blog.csdn.net/u012150179/article/details/24889109
本篇博文主要说明两个问题:
1、 Git作为版本控制系统,那么他就应该具备在各次提交之间穿梭的能力,这里首先就先说恢复到历史提交的方法,也就是roll back的能力。
2、 滚到历史提交我又想回来怎么办?第二就说这个问题。
3、 深化说明在1中使用到的命令。
1、
首先,看一下版本库中的分支游标master的内容:
也就是最新commit 的ID。
下面的.git 目录下的HEAD就是是master的一个指向。
既然要回滚,就要知道想要回到的commit的ID,通过:
git log –oneline简化显示:
所谓的回滚其实就是将分支游标master指向之前的提交,重置命令git reset 上场:
git reset --hard commit-ID
即可。
2、
继续问题2,滚到历史提交又想回来的问题。
首先问题出来了,回去的话你得有commit id才行啊,可是经过上面的步骤你在执行git log的话只能找到回滚到的commit以及之前的记录。
这是.git目录下的另一个目录可以隆重登场了,看logs目录:
这个就是提交的历史记录,由于我并未执行git reset,所以你看见的记录最新commit id和master所指向的一致。
上恢复重置的命令 git reflog:
先用这个命令看看前四次log记录:
使用git reset重置到master@{2}:
查看当前commit 记录,重置成功:
现在我要回到重置之前的状态,首先找到重置前的master指向的commit的id:
然后执行重置:
继续查看commit记录,成功:
补充:若你的提交已经push到了远程库中,重置后的master指向若和远程库中不一致,那么会阻止push。以GitHub为例,出现下面:
这时你只能强制push:
这种操作在多人协同的库中谨慎使用。
3、git reset进阶。
git reset --hard <commit> --- 执行123,即将master、暂存区、工作区全部重置
git reset --soft <commit> --- 只执行1,也就是指修改引用的指向,不修改暂存区、工作区
git reset --mixsd <commit>(git reset <commit>) --- 执行12
注:<commit>不写的话默认为HEAD,HEAD^指HEAD的父提交,否则都是用master@{n}表示。