Git中回退有几种情况,如下:
①对文件修改,但是修改未存入暂存区(这次修改也未提交)。
此时只需将工作区的修改 抹掉 即可。使用git checkout 文件名。命令之后的文件内容就是 修改之前的内容。
②(暂存区存放的是文件的修改信息)对已经存在暂存区的文件进行了修改,需要抹掉的是 暂存区修改之上的修改 。这里比较绕口。
文件 one.txt 内容是one
此时 在文件中插入一行two,并且执行了add 命令。 暂存区就是存储了此次修改的信息。
此时 又对文件插入了一行 three。此时就是相当于在修改之上就行了修改。
此时git status 控制台会输出
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: one.txt //已经存在与暂存区的修改 ----> 就是上述的插入的two
Changes not staged for commit: //未存入暂存区的修改
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: one.txt //未存入暂存区的修改 就是上述的插入 three
此时git checkout one.txt 就会将未存入暂存区的修改 抹掉(就是将 插入的three 抹掉)
③文件进行了修改,并且使用了add 命令 将其存入了暂存区(未提交)。
那么取消修改就需要两步:第一,将暂存区的修改信息清除(reset)。第二,取消实际的修改(checkout)
git reset HEAD one.txt //清楚了已存入暂存区的修改
git chenkout one.txt //删除工作区中本次的修改
④Git可以将commit回退至指定的版本。使用的命令如下
git reset --hard HEAD^ 有几个^就回退几个commit
git reset --hard HEAD~数字 数字是几就回退几个commit
git reset --hard HEAD commit_id 回退至指定的commit
⑤git reflog可以查看操作记录
2ba4947 HEAD@{0}: reset: moving to HEAD^ // commit_id 操作数 操作名字和具体操作
9bec1ea HEAD@{1}: commit: add two
2ba4947 HEAD@{2}: commit: init
d35472d HEAD@{3}: reset: moving to d3547
e5f6212 HEAD@{4}: reset: moving to HEAD~2
d35472d HEAD@{5}: reset: moving to d3547
409954c HEAD@{6}: reset: moving to HEAD^^
aca02d6 HEAD@{7}: reset: moving to HEAD^
d35472d HEAD@{8}: commit: add a third line
aca02d6 HEAD@{9}: commit: add second line
e5f6212 HEAD@{10}: commit: add a new line
409954c HEAD@{11}: commit (initial): initial commit