以前在使用SVN工具时,经常用到revert来还原到某个提交点,而现在切换到git,是否也有呢? 答案是肯定的,那么下面我们来看看git如何实现还原。

workspace、index、HEAD

在了解git还原之前,我们先要理解git的几个常用概念workspace、index、HEAD、commit、local、remote等.先来看看下图:

image

从上图我们可以总结如下:

  • workspace - 对应本地目录,当有文件修改,则最先体现在workspace变化
  • index - 是索引文件,指定commit要提交的内容
  • commit - 提交到本地仓库
  • HEAD - 表示本地最新的一次commit
  • git diff - 比较workspace与index
  • git diff -cached - 比较index与commit
  • git diff HEAD - 比较workspace与commit

git reset

有了以上的基础,我们来看看git如何实现还原,通过查阅可以知道git是通过reset来还原,那么我们来看看help

usage: git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [< commit>]
   or: git reset [-q] < tree-ish> [--] < paths>...
   or: git reset --patch [< tree-ish>] [--] [< paths>...]
    -q, --quiet           be quiet, only report errors
    --mixed               reset HEAD and index
    --soft                reset only HEAD
    --hard                reset HEAD, index and working tree
    --merge               reset HEAD, index and working tree
    --keep                reset HEAD but keep local changes
    -p, --patch           select hunks interactively
    -N, --intent-to-add   record only the fact that removed paths will be added later

这里可以看下mixed、soft、hard几个选项的区别

  • mixed - 还原HEAD和index(即默认情况),即workspace内容还在;若想恢复,你可以通过add+commit来重新提交
  • soft - 只还原HEAD,即只还原commit,index还会存在;若想恢复,你可以再次commit
  • hard - 还原HEAD, index 和workspace,此情况,你无法恢复回来

总结

目前为止,应该对git还原有了比较深刻的认识,至于如何选择,要看你项目的实际需求.