场景
回到上一次提交
这个问题,通常会有两种情况;先说第一种情况
需要一个git的常用命令:git log
– 查看日志
1. 没有 push
这种情况发生在你的本地代码库中,我们只做了add
、commit
,但是发现代码有点问题,不能做提交;
那么我们将使用reset
命令恢复:
git reset [--soft | --mixed | --hard] <commit_id>
我们使用reset
命令常见有三种类型:
--mixed
: 保留源码,只是将commit
和index
信息回退到了某个版本,–mixed 是默认参数,可以省略不写--soft
:保留源码,只回退到commit
信息到某个版本,不涉及index
的回退,如果还是需要提交,直接commit
即可.--hard
:不保留源码,commit
和index
都回回退到某个版本(注意:此种方法慎用,会把自己新写的代码丢弃
)
如果你push代码后,使用git reset --hard <commitID>
回退到某个版本,这样就会有一个问题,你先上代码没有变,index
和commit
都没有变,如果你修改本地代码后进行push
,你会发现代码是冲突的
所以这种情况需要用用到下面的方法
2. 已经 push
如果你已经把所commit
的代码push
了,你想退回到某个版本,相当于,你想让服务器上的代码退回到某个版本,本地代码保持一致
那么我们需要使用revert
命令:
git revert <commit_id>
使用revert
有几个注意事项:
revert
用于反转提交- 执行
evert
命令时要求工作树必须是干净的 revert
用一个新提交来消除一个历史提交所做的任何修改
使用方式:
- 我们使用
revert
以后,本地代码就会回滚到某一个之前的版本版本 - 然后使用
push
命令,提交这个回滚的操作
拯救灾难性的反回复
这里我们先说一下一个重要的命令:
git reflog
有时候使用Git
工作得小心翼翼,特别是涉及到一些高级操作,例如reset
,rebase
和merge
。甚至一些很小的操作,例如删除一个分支,我都担心数据丢失。
这是后我们就要说一下reflog
,它会记录所有HEAD的历史,也就是说当你做reset
,checkout
…等操作的时候,这些操作会被记录在reflog
中,有了这个东西,我们就不要太害怕数据丢失了。
下面我们来看一个例子:
我们首先看一下提交历史:
$ git log --oneline
e66158d (HEAD -> master) 第三次提交
1bb2a89 第二次提交
a4c4e40 第一次提交
现在一共有三次提交,但是我想回到第一次提交的场景,我们使用reset
命令,但是我不小心执行了下面的命令:
$ git reset --hard a4c4e40
HEAD is now at a4c4e40 第一次提交
这个时候我发现新的代码全没了,怎么办,难道工作白做了吗?
我们知道git
的修改都是指针的修改,只要我历史做过某次提交,那么我就一定能回到那个地方,只需要知道commit_id
,但是怎么知道,这个时候我们就可以用reflog
命令了,他记录了我的一切操作:
$ git reflog
a4c4e40 (HEAD -> master) HEAD@{0}: reset: moving to a4c4e40
e66158d HEAD@{1}: commit: 第三次提交
1bb2a89 HEAD@{2}: commit: 第二次提交
a4c4e40 (HEAD -> master) HEAD@{3}: commit (initial): 第一次提交
这样我们就找到第三次提交的commit_id
了,那么用reset
恢复吧
$ git reset --hard e66158d
HEAD is now at e66158d 第三次提交
代码回来了,谢天谢地!!!
总结:
这里附录一下比较底层一个关于git的博客:https://www.cnblogs.com/kekec/p/9248487.html