一、背景
企业中我们一般采用分布式版本管理工具git来进行版本管理,在团队协作的过程中,我们难免会遇到误操作,需要撤销更改的情况,那么我们怎么高效的进行撤销修改呢?对于还未提交到暂存区的代码怎么高效撤销更改呢?对于已经提交到暂存区的代码,怎么取消add操作?对于已经提交到本地仓库,还没有提交到远程仓库的代码,怎么进行高效撤销更改呢?还有对于已经提交到远程仓库的代码,如何进行高效的撤销更改呢?那我们本文就来一一解决这些棘手的问题!
二、各种状态高效撤销方案
- 文件还未提交到暂存区,只是在工作目录中修改了,想要撤销
git checkout [--] file-name (撤销单个文件修改)
git checkout [--] . (撤销当前工作空间中所有文件的修改)
- 文件已经add到暂存区,但还没有提交到本地仓库,想要撤销(即取消add操作)
git reset [HEAD] file-name (撤销暂存区中的单个文件)
git reset [HEAD] . (撤销当前暂存区中的所有内容)
- 文件已经提交到本地仓库,但还没有push到远程仓库,想要撤销
git log (查看并记录下要回滚到的commitId)
git reset [--soft | --mixed |--hard] commitId (回退版本)
注:git reset 默认是 --mixed 模式,即 git reset --mixed 等价于 git reset.
--soft : 会保留工作区间以及暂存区index的提交,只是把git commit回退到某个版本,如还需提交,直接commit即可。
--mixed : 会在工作区保留源码,只是将git commit和暂存区index回退到某个版本。
--hard : 源码以及暂存区和git commit都回退到某个版本。
- 文件已经提交到远程仓库,想要撤销
git log (查看并记录下要回滚到的commitId)
git reset --hard commitId (回退版本)
git push -f origin branch-name
或
git revert commitId(回退版本)
git push origin branch-name
注: reset和revert有着本质的区别,reset直接删除了指定的commit,而revert是用一次新的commit来覆盖要回滚的commit.
reset 是在正常的commit历史中,删除了指定的commit,这时 HEAD 是向后移动了,而 revert 是在正常的commit历史中再commit一次,只不过是反向提交,他的 HEAD 是一直向前的.
如果在日后现有分支和历史分支需要合并的时候,reset 恢复部分的代码依然会出现在历史分支里.但是revert 方向提交的commit 并不会出现在历史分支里.
三、总结
通过本文我们就知道如何对不同状态的git管理的文件进行撤销修改的操作,这样即使我们不小心操作了什么东西,我们也能很快的进行回滚,就是要做高效的
评论区