一、丢弃工作区的改动
在日常开发过程中,会遇到这种情况:在工作区更改了代码,但想起来有地方写错了,不想要工作区的代码了,回退到之前版本,使用命令:
git checkout – 文件名
示例:不小心删除了main.cpp文件,使用该命令,又回来了
二、从暂存区回退到工作区
如果是在 git add 即提交到暂存区后发现有错误,想取消对暂存区的修改,使用命令:
git reset HEAD
示例:不小心删除了main.cpp文件,并且提交到了暂存区
- 提交到了暂存区
- 使用 git reset HEAD回退,再使用git checkout – 恢复工作区
三、本地仓库回退到以前版本
如果自己的代码错误在提交到本地仓库后才知道,那么可使用下面命令回退:
git log 先查看日志里所有版本的 commit-id(一个哈希值)
再使用
git reset --hard + commit-id
示例:对main.cpp做出了更改,且提交到了本地仓库
使用git log查看日志,commit 后面跟的就是id值
想回退到上个版本,示例:复制上面的commit-id后配合使用该命令,main.cpp又变回来了。这实际上就是对HEAD指针的操作。
四、回退GitHub远程仓库的代码
在开发项目中如果把错误的版本提交到了远程仓库,别人克隆了你的错误版本,然后一看信息后发现是你提交的,那你少不了一顿骂。。。所以如果发生了这种错误,在别人没发现前,有下面的方法可以补救。
- 把自己工作区的代码改正,然后一步一步重新提交到远程仓库。
- 把自己本地仓库回退到以前版本,然后强制提交到远程仓库。
使用命令
git push -f origin main
这里示例第二个方法:
来看一个简单的示例,首先远程仓库的main.cpp是这样的
在本地修改main.cpp让它什么也输出不了,并提交到远程仓库:
此时我的远程仓库已经是错误的了:
然后回退自己本地仓库版本,并强制提交到远程仓库:
可以看出,使用之前的命令无法提交到远程仓库,因为远程仓库的版本优先于我本地仓库的版本,所以需要加一个强制命令 -f ,意为 force 强制。
git push -f origin main
这时候再来看看GitHub,又回到了以前的版本:
总结
- git checkout – 在git add之前,把工作区的代码用版本库中的代码覆盖掉,注意命令中的–不能
去掉,否则成切换分支的命令了- git reset HEAD 把git add之后,暂存区的内容全部撤销
- git reset --hard commitid 把提交到本地仓库中的代码改动进行回退
- git reflog 查看HEAD指针的改动日志
- git push -f 强制推送本地仓库代码到远程仓库
- git diff HEAD – 查看工作区file文件和仓库中该文件最新版本的代码有什么区别