Git进阶--7、git-reset、git-revert、git-checkout、git-restore区别
reset与checkout的异同
commit模式
checkout
1 |
|
当你checkout分支的时候,git做了这么三件事情
1 |
|
所以你可以发现,HEAD,Index,Working Directory这个时候里的内容都是一摸一样的。
注意:一般会误解为,Index中的内容是空的,只有git add后才会有东西。实际上不是,add完第一次之后,Index里一直是有东西的。 所以,git里的所有操作就是对这三个区域的状态的操作。
此操作是WD(Working Directory)安全的
reset
1 |
|
总结
- 两者都可以加branch也可以加commit
- checkout在commit模式下是WD安全的,reset –hard下是WD不安全的
- checkout贯穿3棵树,reset可以控制贯穿哪几棵树
- 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被撤销,工作区会变红,表示工作区文件被修改,其实内容没变,因为索引区变了,导致校验和不一致,所以变成了红色
总结
- checkout撤销3个区的内容,而reset只覆盖索引区,即只撤销了commit动作
- checkout此时是WD不安全的,而reset反而是WD安全的
revert与reset的异同
总结
revert只有commit模式,且是WD安全的。
evert撤销一个提交的同时会创建一个新的提交。这是一个安全的方法,因为它不会重写提交历史。
相比
git reset
,它不会改变现在的提交历史。因此,git revert
可以用在公共分支上,git reset
应该用在私有分支上。
restore
请见Git进阶--4、Git-后悔药-回退撤销-restore
对commit历史的影响
命令 | log | reflog |
---|---|---|
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 | 文件层面 | (木有) |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Taylor!
评论