一、前言
经常有些操作失误,但又不小心上传或者提交到git仓库,这时候如何解决这种尴尬的局面?
二、业务场景
1、提交但没上传
不小心将不想要的代码commit到本地仓库,但还没有做push操作!
2、上传到远程仓,回到上次的提交
尴尬了,刚上线发现上传的代码出现了问题,需要还原这次提交的代码!
3、刚才发现带了敏感信息,需要彻底消灭
上传之后发现我吐槽的话留在代码中了,万一被pr看到……,我需要把它干掉!
三、撤销提交
对于上述场景1,在还没有做push之前的所有操作,都是在本地代码仓中执行的。我们暂且把对本地代码仓的代码还原操作叫做“撤销”!
1、文件被修改了,但没有执行git add操作(working tree内操作)
# 最好加上--参数
git checkout -- fileName
git checkout .
2、同时对多个文件执行了git add操作,但本次只想提交其中一部分修改的文件
执行了git add只是将文件放入本地仓的暂存区
git add *
git status
# 取消暂存 <>,可以是多个文件
git reset HEAD <fileName>
3、文件执行了git add操作,但想撤销对起的修改(index内回滚)
# 取消暂存
git reset HEAD fileName
# 撤销修改
git checkout fileName
4. 已经执行了commit操作,想再次修改但不想再次产生新的commit
# 修改最后一次提交
git add sample.java
git commit --amend -m "对整体的日志说明"
5. 已经对本地仓进行多次的commit,现在想撤销到其中某次commit
git reset [--hard|soft|mixed|merge|keep] [commit|HEAD]
6、已多次push,借壳上市
修改配置文件是一个非常烦的事情,而且还容易出错,修改了好多次才成功,好难看,可以借用另一个分支暂存代码,并正确配置;在远程删除原分支,并从master分支或者其他同源分支切出和原分支文件名相同的分支;将暂存代码推到该分支,完成借壳上市。
# 查看提交历史,找到想要恢复的commitId
git log --oneline
# 切到指定commitId的位置,但此时并不是分支
git checkout beecca7
# ...
# 从此处切出一个分支
git checkout -b gaox
#推送到远程
git push origin gaox:gaox
四、回滚
上述场景二中已经执行了git push,现在想要把提交到远程仓的代码还原操作叫做“回滚”。高度注意:对远程仓库做回滚是有风险的,需要提前做好备份,并且有必要通知团队其他成员!
如果你每次更新线上代码时,都会打上tag标签,那么对于场景二的处理你会非常快的。
# 查看tag历史,
git tag -n
# 切换到指定标签版本
git checkout <tag>
如果你要是想回到当前HEAD的指向
git checkout <branch_name>
1、撤销指定文件到指定版本
# 查看指定文件的历史版本
git log <fileName>
# 指定文件回滚到指定的commitID
git checkout <commitID><fileName>
2、删除最后一次远程提交
方式一:使用revert
git revert HEAD
git push origin master
方式二:使用reset
git reset --hard HEAD^
git push origin master -f
二者的区别
- reset:是把HEAD指针指向指定提交,历史记录中不会出现提交记录,私密信息也不会再出现的吐槽**就要用这个了。。。。。
- revert:是放弃指定的提交修改,但会生成一次新的提交,有提交日志,并且以前的历史记录还会在。。。。
3、回滚某次提交????
git log
git revert commitID
五、删除某次提交
# 查看最近五次提交的简单信息
git log --oneline -n5
注意:需要注意最后的^号,意思是commit id的前一次提交
git rebase -i "a74abfc"^
在编辑框中删除相关commit,如pick 8e95ef4 添加maven依赖
,然后保存退出(如果遇到冲突需要先解决冲突)!
# 强制推送到远程仓
git push origin master -f
通过上述操作,如果你想对历史多个commit进行处理或者,可以选择git rebase -i,只需删除对应的记录就好。rebase还可对 commit 消息进行编辑,以及合并多个commit。
六、强制推送
-f
强制推送,强行用本地仓库覆盖远端仓库。导致的后果就是文件可能被老的内容给覆盖掉,仓库的历史提交记录丢失等等。
万不得已,不要使用!