Git Reset 三种模式

日常的工作当中,由于需要和别人协同工作,代码方面当然就直接使用Git的方式来管理了。在日常使用当中有很多命令比较常用

  • git commit
  • git push
  • git stash
  • git rebase -i HEAD~想要合并的Commit数量
  • git reset

git rebase 我在这一篇文章已经做了一点讲解,应该使用起来都比较方便。值得一提的是,可以使用git rebase -abort来撤销一次rebase。

今天来说一下git reset。它的一句话概括

git-reset - Reset current HEAD to the specified state

意思就是可以让HEAD这个指针指向其他的地方。例如我们有一次commit不是不是很满意,需要回到上一次的Commit里面。那么这个时候就需要通过reset,把HEAD指针指向上一次的commit的点。

它有三种模式,soft,mixed,hard,具体的使用方法下面这张图,展示的很全面了。

这三个模式理解了,对于使用这个命令很有帮助。在理解这三个模式之前,需要略微知道一点Git的基本流程。正如上图,Git会有三个区域:

  • Working Tree 当前的工作区域
  • Index/Stage 暂存区域,和git stash命令暂存的地方不一样。使用git add xx,就可以将xx添加近Stage里面
  • Repository 提交的历史,即使用git commit提交后的结果

结合这两张图,基本就非常明确的知道这三个参数的作用范围了。假设我们对于一个txt文件,每次顺序添加一个数字。有4次提交,1 -> 2 -> 3 ->4,则txt中就会有4个数字1234,使用命令git reset [param] HEAD~2

  • soft:将HEAD reset到目标2,由于没有修改working tree和stage,所以这时它俩的文件都是txt[1234],但是如果和HEAD进行diff就会发现,此时HEAD指向是commit2-txt[12]
  • mixed:将HEAD reset到目标2,没有修改working tree,所以working tree里面的文件是txt[1234],此时stage是空的,HEAD指向的仍然是commit2-txt[12]
  • hard:将HEAD reset到目标2,清除三个区域,working tree = stage = history = txt[12]

Git在默认执行reset命令的时候会选择mixed,如果不小心使用hard参数,丢失了当前的commit也不要慌。在Git中所有的历史提交都会有记录下来,输入git reflog,找到所有的历史纪录。然后通过**HEAD@{N}**来恢复到某一次提交。

git reset --hard HEAD@{N}

ref :

  1. git reset soft,hard,mixed之区别深解
  2. Reset - mixed, hard and soft
  3. SOF