git的时光穿梭

版本回退

当初始化一个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 <[email protected]>
Date:   Tue Jul 25 11:38:56 2017 +0800

    添加c

commit 6283e2a3c0e0406b8f055ce16215efcbb55573d7
Author: Elemento <[email protected]>
Date:   Tue Jul 25 11:38:32 2017 +0800

    添加b

commit a78a9273893b6b14ab2438e74abcf32b3c9484fe
Author: Elemento <[email protected]>
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 <[email protected]>
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 ..." 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 ..." to update what will be committed)
  (use "git checkout -- ..." 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 区别,本文只作为平时的学习笔记。

你可能感兴趣的:(git的时光穿梭)