本章主要测试讲解
-
git reset
、git checkout
和git revert
在撤销修改,内容还原功能中的对比。
测试过程内容较多,每个步骤都逐一截图以便真实说明,也有列示用法。若不感兴趣,可直接查看总结部分。
测试过程
前置说明
使用需求大概都是一致,就是在修改了代码之后,想要会到旧版本去。虽然列示的三种操作过程不一样,但都达到了那样的效果。
指令原理说明
简单说明区别
git revert:只能用于 commit-level,会新建一个 commit,在历史记录中说明还原了什么
git reset:可用于 commit-level 和 file-level,用于撤销未被提交到远程(remote)的改动,即撤销本地(local)的修改。
可以将其 git revert 视为撤销已提交更改的工具,同时 git reset HEAD 用于撤销未提交的更改。
git checkout:可用于 commit-level 和 file-level,是将 HEAD 指针移动到想要回退的版本,不会修改历史记录
示例演示说明
项目准备,一个有简单修改的 tensorflow 项目
git checkout <commit id>
示例
例如,查看 tensorflow 的历史记录,HEAD 目前在 12589
使用git checkout
到 47092caa 去。
再查看历史记录,HEAD 已经指向了 4f092caa 了。
项目中也把文件还原到了当时提交的情况
git revert <commit id>
示例
先将分支切回到 dev
使用 git revert 还原到 a122a10dcd
还原过程中会弹窗窗口提示输入 commit 内容
revert 完成之后,查看日志可以看到,会看到新增一条 commit
而项目中已经有还原到当时的文件
但是通常情况下,git revert 不会带 commit id,直接使用,用于撤销最近一次提交。
git reset
示例
注意 git reset 的参数
在实际使用时,如果有确切的撤销需求,例如撤销后的提交内容都应该是不需要的,历史记录也不在保留,index 和工作区也回退到撤销的版本,那么就需要使用–hard 参数。
使用git reset
前的日志
使用git reset
恢复到 4f092caa
直接使用git log
,则看到第一条已经是 4f092caa 那条提交
不过使用git log --all --oneline
还是可以看到
但是注意,使用 git log --pretty=oneline
是不行的
总结
表格列示三种指令的作用范围和效果:
git 命令 | 作用范围 | 常见用例 |
---|---|---|
git reset | commit-level | 放弃在私有分支中的提交或丢弃未提交的更改 |
git reset | file-level | 取消暂存文件 |
git checkout | commit-level | 在分支之间切换或检查旧快照 |
git checkout | file-level | 放弃工作目录中的更改 |
git revert | commit-level | 撤消在公共分支中提交 |
git revert | file-level | (N/A) |
git 官方文档已有做出意见:
- git revert is used to record some new commits to reverse the effect of some earlier commits (often only a faulty one).
- If you want to throw away all uncommitted changes in your working directory, you should see git-reset[1], particularly the –hard option.
- If you want to extract specific files as they were in another commit, you should see git-checkout[1], specifically the git checkout <commit style="box-sizing: border-box;">– <filename style="box-sizing: border-box;">syntax.</filename></commit>
即:
- git revert 用于记录一些新的提交,以逆转某些较早提交的效果(通常只有一个错误的提交)。
- 如果要丢弃工作目录中所有未提交的更改,则应看到 git-reset,尤其是–hard 选项。
- 如果要提取特定文件,就像在另一个提交中一样,则应该看到 git-checkout ,特别是
git checkout <commit>-<filename>
语法。
参考内容:
- https://git-scm.com/docs/git-revert
- https://git-scm.com/book/zh/v2/Git-%E5%B7%A5%E5%85%B7-%E9%87%8D%E7%BD%AE%E6%8F%AD%E5%AF%86
- https://segmentfault.com/a/1190000009126517
- https://dev.to/neshaz/when-to-use-git-reset-git-revert--git-checkout-18je
- https://stackoverflow.com/questions/8358035/whats-the-difference-between-git-revert-checkout-and-reset