###### git checkout(working tree内的回滚) ######
# git checkout : 把index区域中的文件覆盖working tree中的文件
# 回滚单个文件
$ git checkout file1
# 回滚多个文件,中间用空格隔开即可
$ git checkout file1 file2 ... fileN
# 回滚当前目录一下的所有working tree内的修改,会递归扫描当前目录下的所有子目录
$ git checkout .
# git checkout HEAD : 会用HEAD指向的master分支中的全部或者部分文件替换index暂存区和以及working tree工作区中的文件。这个命令也是极具危险性的,因为不但会清除working tree工作区中未提交的改动,也会清除index暂存区中未提交的改动
# 回滚单个文件
$ git checkout HEAD file1
# 回滚多个文件,中间用空格隔开即可
$ git checkout HEAD file1 file2 ... fileN
# 回滚当前目录一下的所有working tree内的修改,会递归扫描当前目录下的所有子目录
$ git checkout HEAD .
###### git reset(index内的回滚) ######
# git reset语法(<commit>必须是没有push到remote端的)
git reset [-q] [<commit>] [--] <paths>…
git reset (--patch | -p) [<commit>] [--] [<paths>…]
git reset (--soft | --mixed | --hard | --merge | --keep) [-q] [<commit>或HEAD]
# 将index区域中修改过的文件移除index,也就是恢复到working tree中
# 文件被恢复到working tree中,回滚操作就是上面提到的git checkout
# 回滚单个文件,相当于git add file1的反命令
$ git reset file1
# 回滚某一个目录,相当于git add .的反命令
$ git reset .
###### git reset(commit之后的回滚(HEAD内的回滚)) ######
# 修改前一次的提交,并且保持前一次的Change-Id不变(推荐使用)
# 直接本地修改好上一次commit的文件,再次add,使用commit --amend提交,修改注释即可修改上一次的提交
$ git commit --amend
# 回滚到某个版本,只回滚了HEAD的信息,不会恢复到index一级。如果还要提交未commit的文件,直接commit即可
# 参数是git log中每次commit的ID
$ git reset --soft cb0c40643afa791ea2c7905318cf17b4eac4bce5
# 此为默认方式,不带任何参数的git reset,即时这种方式,它回滚到某个版本,只保留working tree中文件的源码,回滚了HEAD和index的信息
# 参数是git log中每次commit的ID
$ git reset --mixed cb0c40643afa791ea2c7905318cf17b4eac4bce5
# 彻底回滚到某个版本,本地working tree的源码也会变为上一个版本的内容
# 参数是git log中每次commit的ID
$ git reset --hard cb0c40643afa791ea2c7905318cf17b4eac4bce5
###### merge回滚的文件和本地working tree文件 ######
$ git reset --merge cb0c40643afa791ea2c7905318cf17b4eac4bce5
# 下面是git help给出的提示,很清晰的写明会回滚的区域
--mixed reset HEAD and index
--soft reset only HEAD
--hard reset HEAD, index and working tree
--merge reset HEAD, index and working tree
###### git revert ######
# 回滚到某一次的commit,但是如果本地working tree有修改需要先merge,然后重新add到index区,再执行git revert --continue回滚到指定版本,同时编辑本地回滚的commit的注释,然后在查看git log就会发现多了一次commit信息,add的文件出现了之前版本的内容修改,需要重新merge在提交
# 回滚到某一次的commit
$ git revert cb0c40643afa791ea2c7905318cf17b4eac4bce5
# merge完本地working tree中的文件内容重新add并且revert continue
$ git add file1
$ git revert --continue
# 查看提交历史记录会发现多了一条revert的记录
$ git log
###### reset和revert的区别 ######
git reset : git reset是指向原地或者向前移动指针,之前的commit信息会被删除
git revert : git revert是创建一个commit来覆盖当前的commit,指针向后移动,之前的commit信息会被保留