Refference: https://git-scm.com/docs/git-reset
Recommend: http://marklodato.github.io/visual-git-guide/index-zh-cn.html

本节主要讲版本回退,按照笔者自己的理解,可以分为两个类别:

  • 远程版本回退
  • 本地版本回退
  • 远程版本和本地版本同时回退

git reset - 重置当前版本到指定的状态

  • 命令
    git reset [-q] [] [--] ... git reset (--patch | -q) [] [--] [...] git reset [--soft | --mixed [-N] | --hard | --merge | --keep] [-q] []

  • 描述 git reset [<mode>] [<commit>]
    重置当前分支的HEAD到指定的版本(这里commit改为commit-id更为合适),根据指定的模式mode可能会更新暂存区(index)和工作区。默认模式为mixed。

    • –soft
      不改变暂存区和工作区,但是重置当前版本库到指定的版本。这就相当于所有改变了的文件处于待提交状态(Changes to be committed)。
    • –mixed
      回退到指定的版本,暂存区也回退到指定版本,但是工作区不变(相对于回退版本,所有改变的文件都处于未标记为提交的状态),并且会显示待提交的文件。
    • –hard
      重置版本库、暂存区以及工作区到指定的版本。在工作区中所有提交的文件都会被丢弃。

例子

  • 撤销add操作
    $ git add examples.txt
    $ git reset
    add之后,暂存区已经改变。所以撤销add操作就是重置暂存区的数据。使用git reset命名默认的模式,即可重置暂存区。

  • 撤销commit操作(远程版本回退,本地仓不变)
    $ git commit …
    $ git reset –soft HEAD^
    $ edit
    $ git commit -a -c ORIG_HEAD
    如果commit之后发现提交不完整或有错误等,可以回退commit操作之后,对文件进行修改制作,再执行commit操作

  • 撤销commit操作(远程版本以及本地版本同时回退)
    $ git commit …
    $ git reset –hard HEAD~3
    本地和远程仓库都会指定的版本HEAD~3(HEAD~3表示回退到前3个版本),所以hard选项要慎用!

  • 撤销单个文件的commit
    $ git reset – examples.txt
    $ git commit -m “commit files in index without examples.txt”