git reset
- git reset :回滚到某次提交。
- git reset –soft:此次提交之后的修改会被退回到暂存区
- git reset –hard:此次提交之后的修改不做任何保留,git status 查看工作区是没有记录的。
- git reset的作用是修改HEAD的位置
- 即将HEAD指向的位置改变为之前存在的某个版本,且那个版本之后提交的版本都会不见
查看版本号
1
$ git log
回退,版本号填写前六位即可
1
2
3
4$ git reset --hard <目标版本号>
$ git reset --hard HEAD //当前版本
$ git reset --hard HEAD^ //回退到上一个版本
$ git reset --hard HEAD^^ //回退到上上一个版本提交
1 | // 直接push会报错,需要强制push |
git revert
- git revert用于“反做”某一个版本,以达到撤销该版本的修改的目的
- 即新增一个版本,该版本与想要回退的版本一致
查看版本号
1
$ git log
回退,版本号填写前六位即可
1
2// -n是--no-commit如果不带这个参数会自动提交一条commit
$ git revert -n <目标版本号>提交
1 | $ git add . |
实际应用场景
场景一
糟了,我刚把不想要的代码,commit到本地仓库中了,但是还没有做push操作!
在未进行git push前的所有操作,都是在“本地仓库”中执行的。我们暂且将“本地仓库”的代码还原操作叫做“撤销”
情况一
文件被修改了,但未执行git add操作(working tree内撤销)
1 | $ git checkout fileName |
情况二
同时对多个文件执行了git add操作,但本次只想提交其中一部分文件
1 | $ git add * |
情况三
文件执行了git add操作,但想撤销对其的修改(index内回滚)
1 | // 取消暂存 |
情况四
修改的文件已被git commit,但想再次修改不再产生新的Commit
1 | // 修改最后一次提交 |
情况五
已在本地进行了多次git commit操作,现在想撤销到其中某次Commit
1 | $ git reset [--hard|soft|mixed|merge|keep] [commit|HEAD] |
场景二
彻底完了,刚线上更新的代码出现问题了,需要还原这次提交的代码!
已进行git push,即已推送到“远程仓库”中。我们将已被提交到“远程仓库”的代码还原操作叫做“回滚”!注意:对远程仓库做回滚操作是有风险的,需提前做好备份和通知其他团队成员!
如果你每次更新线上,都会打tag,那恭喜你,你可以很快的处理上述场景二的情况
1 | $ git checkout <tag> |
如果你回到当前HEAD指向
1 | $ git checkout <branch_name> |
情况一
撤销指定文件到指定版本
1 | // 查看指定文件的历史版本 |
情况二
删除最后一次远程提交
方式一:使用revert1
2$ git revert HEAD
$ git push origin master
方式二:使用reset
1 | $ git reset --hard HEAD^ |
二者区别:
- revert是放弃指定提交的修改,但是会生成一次新的提交,需要填写提交注释,以前的历史记录都在;
- reset是指将HEAD指针指到指定提交,历史记录中不会出现放弃的提交记录。
情况三
回滚某次提交
1 | // 找到要回滚的commitID |
场景三
刚才我发现之前的某次提交太愚蠢了,现在想要干掉它!
1 | $ git log |
进入编辑器
将对应版本号前的 pick 改为 d ,即drop = remove commit,然后保存退出
1 | $ git push origin <分支名> -f |
- 通过上述操作,如果你想对历史多个commit进行处理或者,可以选择git rebase -i,只需删除对应的记录就好
- rebase还可对 commit 消息进行编辑,以及合并多个commit