版本回退
当初始化一个git仓库后,.git文件就是你的版本库。你工作的文件目录被称为工作区,而.git文件中存在一个被称为stage(或者叫index)的暂存区。我们工作的大概流程一般是修改工作区的文件,执行 git add 文件名
,将改动添加到暂存区,确认无误后执行git commit -m "xxx"
,再将暂存区的内容提交到主分支。但是如果在这之中出现了错误想撤销上一步操作我们应该怎么办呢?这里分三种情况:
撤销工作区的修改
命令git checkout -- 文件名
意思就是,把文件在工作区的修改全部撤销,这里又分两种情况:
一种是文件自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是文件已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit或git add时的状态。
撤销暂存区的修改
如果你发现添加到暂存区的代码出现了bug,那么这时候用命令git reset HEAD 文件名
可以把暂存区的修改撤销掉(unstage),重新放回工作区。
其实这时候你工作区的代码是有问题的,所以你可以用上面介绍的命令git checkout -- 文件名
将工作区的修改撤销。
撤销版本库的修改
$ git reset --hard HEAD^
可以回退到上一个版本,使用git log
命令可以查看commit的历史记录和id,$ git reset --hard id前几位
就可以回退到想要的版本。具体用法请看下面。
$ git reset命令的用法
我们先用git log命令查看commit日志,以下测试代码都以这个主分支为基准
$ git log
commit 8f15b4cc534c83d2baf3b312d28c1c78f511fd81
Author: Elemento <18733660998@163.com>
Date: Tue Jul 25 11:38:56 2017 +0800
添加c
commit 6283e2a3c0e0406b8f055ce16215efcbb55573d7
Author: Elemento <18733660998@163.com>
Date: Tue Jul 25 11:38:32 2017 +0800
添加b
commit a78a9273893b6b14ab2438e74abcf32b3c9484fe
Author: Elemento <18733660998@163.com>
Date: Tue Jul 25 11:37:57 2017 +0800
添加a
回退版本库
使用git reset命令回退两个版本
$ git reset head~2
Unstaged changes after reset:
M test.txt
$ git log
commit a78a9273893b6b14ab2438e74abcf32b3c9484fe
Author: Elemento <18733660998@163.com>
Date: Tue Jul 25 11:37:57 2017 +0800
添加a
回退工作区和暂存区
想要 选择性的回退 这两部分则要添加一些参数,比如--soft、--mixed、--hard
- --soft: 暂存区和工作区都不回退 (建议在命令行执行后,再输入 git status 查看状态)
- --mixed: 暂存区回退, 工作区不回退。【这是默认选项】(建议同上)
- --hard:暂存区和工作区都将回退
测试--soft参数
$ git reset --soft head^
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: test.txt
//只有版本库回退了,暂存区中仍有add的内容
测试--mixed参数
$ git reset --mixed head^
Unstaged changes after reset:
M test.txt
$ git status
On branch master
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: test.txt
no changes added to commit (use "git add" and/or "git commit -a")
//现在版本库和暂存区都回退了,工作区的内容是修改过的,暂未add到暂存区,暂存区为空
测试--hard参数
$ git reset --hard head^
HEAD is now at 6283e2a 添加b
$ git status
On branch master
nothing to commit, working directory clean
//现在版本库、暂存区和工作区都回退了
更新中,待续...
参考了廖雪峰的官方网站以及git reset, git checkout, git revert 区别,本文只作为平时的学习笔记。
网友评论