针对 commit
git reset
作用: 从分支末端重置到某个提交,此提交之后的提交将成为悬挂分支,如果之后再无操作,在下次Git执行垃圾回收的时候,这些提交会被删除。
建议在私有分支上使用。
撤销没有提交的更改
git reset HEAD
向后回退一个提交
git reset HEAD^
向后回退两个提交
git reset HEAD~2
参数选择
--mixed 默认选项,缓存区会同步到你指定的提交,但是工作目录中的更改更改仍然保留。
--hard 缓存区会同步到你指定的提交,舍弃当前工作目录中没有提交的改动
git checkout
作用:切换分支/把 HEAD 移动到特定的提交
git revert
撤销一个提交的同时会创建一个新的提交。
reset会重写之前的commit历史,revert不会,而是产生新的历史。
在公共分支上可安全使用。
针对文件
git reset
修改的是缓存区。
将当前test.js做的更改从缓存区中移除出去。
git reset HEAD test.js
将缓存区中的test.js内容替换为倒数第二个提交中的test.js内容。
git reset HEAD~2 test.js
git checkout
修改的是工作目录
将当前test.js做的更改从工作目录中移除出去。
git checkout HEAD test.js
将当前工作目录中test.js的内容替换为倒数第二个提交中的test.js内容
git checkout HEAD~2 test.js
用途
git checkout 主要用于查看项目的旧版本。
命令 | 作用域 | 常用场景 |
---|---|---|
git reset | commit | 在私有分支上舍弃一些没有提交的更改 |
git reset | 文件 | 将文件从缓存区中移除 |
git checkout | commit | 切换分支、查看旧版本 |
git checkout | 文件 | 舍弃工作目录中的修改 |
git revert | commit | 在公共分支上回滚更改 |
疑惑
^ 和 ~ 的区别
^
是横向父提交
^
代表父提交,当一个提交有多个父提交时,可以通过在^
后面跟上一个数字,表示第几个父提交,^
相当于^1
.
~
是纵向父提交
~<n>
相当于连续的<n>个^
.