Git版本回退
转自:https://www.liaoxuefeng.com/wiki/896043488029600/897013573512192
https://vue3js.cn/interview/git/git%20reset_%20git%20revert.html#一、是什么
1.reset命令
reset
用于回退版本,可以遗弃不再使用的提交。
1.1--hard参数
使用命令
git reset --hard HEAD^ //或者 git reset --hard HEAD~1
表示回退到上1个版本,HEAD~n表示回退到上n个版本, 回退的本质是移动HEAD指针,git reset 命令是在更改git指针HEAD的指向,具体是更改指向不同的版本号。然后顺便把工作区的文件更新了。
类似的:
如果想恢复了,直接再reset之前的commitID前几位即可,
myproj % git reset --hard 7ce989d2294 HEAD 现在位于 7ce989d 修改a.txt,+0820 bg修改一下
--hard 参数撤销工作区中所有未提交的修改内容,将暂存区与工作区都回到上一次版本,并删除之前的所有信息提交。
logs/有记录所有的命令情况,可以找回:
myproj % git reflog 7ce989d (HEAD -> master) HEAD@{0}: reset: moving to 7ce989d2294 c3a96ee HEAD@{1}: reset: moving to head~1 7ce989d (HEAD -> master) HEAD@{2}: checkout: moving from feature/1 to master 594e046 (origin/master, feature/1) HEAD@{3}: checkout: moving from master to feature/1 7ce989d (HEAD -> master) HEAD@{4}: commit: 修改a.txt,+0820 bg修改一下
1.2--soft参数
https://www.runoob.com/git/git-reset.html
--soft 参数用于回退到某个版本:
$ git reset --soft HEAD~3 # 回退上上上一个版本
暂存区和工作区内容都不变,只是版本库的版本回滚了,
该参数能让commit的内容,再回到工作区,不会丢失
1.3--mixed参数(默认)
https://zhuanlan.zhihu.com/p/346993796
--mixed 为默认,用于重置暂存区的文件与上一次的提交(commit)保持一致,工作区文件内容保持不变。
git reset HEAD^ hello.php # 回退 hello.php 文件的版本到上一个版本
git reset #
没有指定ID, 暂存区的内容会被当前ID版本号的内容覆盖,工作区不变
git reset <ID> #
指定ID,暂存区的内容会被指定ID版本号的内容覆盖,工作区不变
应该是只影响暂存区的内容,使得暂存区和版本库一致。如下图所示,本底仓就是版本库,
git reset HEAD可以理解为current 版本,舍去暂存区的内容,重新将文件变为unstaged。
1.4总结
-
--mixed(默认):默认的时候,只有暂存区变化
-
--hard参数:如果使用 --hard 参数,那么工作区也会变化
-
--soft:如果使用 --soft 参数,那么暂存区和工作区都不会变化
2.revert命令
在当前提交后面,新增一次提交,抵消掉上一次提交导致的所有变化,不会改变过去的历史,主要是用于安全地取消过去发布的提交。
git revert
撤销某次操作,此次操作之前和之后的 commit
和history
都会保留,并且把这次撤销,作为一次最新的提交,如下:
git revert <commit_id>
git revert HEAD #撤销前一个版本
git revert HEAD^ #撤销前前一次
3.区别
- 撤销(revert)被设计为撤销公开的提交(比如已经push)的安全方式。用一次新的commit来回滚之前的commit。
git reset
被设计为重设本地更改。直接删除指定的commit。- git revert是HEAD继续前进,只是新的commit的内容和要revert的内容正好相反,能够抵消要被revert的内容。reset 是把HEAD向后移动了一下。