reset与checkout的异同

commit模式

checkout

1
git checkout [-q] [-f] [-m] [<branch>|<commit>]

当你checkout分支的时候,git做了这么三件事情

1
2
3
> 将HEAD指向那个分支的最后一次commit或者指定的commit
> 将HEAD指向的commit里所有的文件的snapshot替换掉Index区域里面的内容
> 将Index区域里面的内容填充到Working Directory里

所以你可以发现,HEAD,Index,Working Directory这个时候里的内容都是一摸一样的。
注意:一般会误解为,Index中的内容是空的,只有git add后才会有东西。实际上不是,add完第一次之后,Index里一直是有东西的。 所以,git里的所有操作就是对这三个区域的状态的操作。

此操作是WD(Working Directory)安全的

reset

1
git reset (<branch_name>|HEAD|<tree-ish>|<tag_name>) [--mixed | --soft | --hard | --merge | --keep]

总结

  1. 两者都可以加branch也可以加commit
  2. checkout在commit模式下是WD安全的,reset –hard下是WD不安全的
  3. checkout贯穿3棵树,reset可以控制贯穿哪几棵树
  4. checkout不改变分支的指向的commit,只是改变HEAD指向的分支;而reset会将HEAD和branch一起移动来改变指向的commit。所以reset会丢失commit log,checkout不会

file模式

checkout

贯穿3棵树,WD不安全,相当于git reset --hard commitid的作用,但checkout这里后面的参数是filename或者filepath

reset

file模式下,只会覆盖索引区文件内容,执行后,索引区会变绿,表示commit被撤销,工作区会变红,表示工作区文件被修改,其实内容没变,因为索引区变了,导致校验和不一致,所以变成了红色

总结

  1. checkout撤销3个区的内容,而reset只覆盖索引区,即只撤销了commit动作
  2. checkout此时是WD不安全的,而reset反而是WD安全的

revert与reset的异同

总结

  1. revert只有commit模式,且是WD安全的。

  2. evert撤销一个提交的同时会创建一个新的提交。这是一个安全的方法,因为它不会重写提交历史。

相比git reset,它不会改变现在的提交历史。因此,git revert 可以用在公共分支上,git reset 应该用在私有分支上。

restore

请见Git进阶--4、Git-后悔药-回退撤销-restore

对commit历史的影响

命令logreflog
git revert新增可跟踪
git checkout无变化无变化
git reset丢失可跟踪
git restore无变化无变化
git amend改变改变

对work directory的影响

原图可去我的processon下载
https://www.processon.com/view/link/63248872f346fb3377e76017

应用场景

命令作用域常用情景
git reset提交层面在私有分支上舍弃一些没有提交的更改
git reset文件层面将文件从缓存区中移除
git checkout提交层面切换分支或查看旧版本
git checkout文件层面舍弃工作目录中的更改
git revert提交层面在公共分支上回滚更改
git revert文件层面(木有)