git reset

git reset命令用于将当前HEAD复位到指定状态或用指定commit中的文件快照恢复暂存区中的文件. 一般用于撤销之前的一些操作, 如git add, git commit等.

注解

下面这一段是一个牛人的解释:

总的来说, git reset命令是用来将当前branch重置到另外一个commit的, 而这个动作可能会将index以及work tree同样影响.

相关的基本概念

先来看几个基本的概念:

  • HEAD
    一个特殊的分支指针, 指向某一个分支, 表示当前分支(或者说当前commit); HEAD可以在不同的分支的不同commit之间切换.
  • 分支
    一个分支其实就是一个指针, 指向一个commit; 分支指针可以在该分支的历史中移动, 指向不同的commit(分支指针只能指向固定的一个分支).
  • Index
    index也被称为staging area, 是指一整套即将被下一个提交的文件集合.
  • Working Copy
    表示正在工作的那个文件集.

参数

  • --soft

    --soft参数表示将HEADbranch 重置到指定的commit, 但是indexworking copy都不会有任何变化, 所有的original HEAD和重置到的那个 commit之间的所有差异都放在stage(index)区域中.

  • --hard

    --hard参数会将HEADbranch重置到指定的commit, 同时indexworking copy也会重置到一样的状态. 这是一个比较危险的动作, 具有破坏性, 数据因此可能会丢失.

    如果我们希望丢掉working copyindex中的修改而又不希望更改HEADbranch所指向的commit, 可以执行:

    git reset --hard HEAD
    

    git reset --hard
    

    另一个使用场景是简单地移动branch从一个到另一个commit, 同时保持index/working area的同步.

  • --mixed(default)

    --mixedreset的默认参数, 也就是当不指定任何参数时的参数. 它将重置HEADbranch到指定的commit, 并且重置index但是不会更改working copy.

    所有该branch上从original HEAD到重置到的那个commit之间的所有修改, 以及暂存区相对工作区之间的修改, 都将作为local modifications保存在working area中(被标示为local modification or untracked via git status), 但是并未staged的状态, 可以重新检视然后再修改和提交.

git resetgit checkout的区别

git reset是将HEADbranch重置到指定的commit, 根据参数的不同, 还可能重置indexworking copy.

git checkout是切换HEAD指向指定的commit,

用指定commit中的文件快照恢复暂存区中的文件状态

git reset commit <file> ...