在使用git工具进行代码管理时,代码的回退时一项经常要做的事,没有人能一下就把代码改到一个字母都改不了,甚至在提交时会犯下重大错误,如何修补呢?在这个过程中,无论时在修改、添加(add)、提交(commit)还是推送(push)阶段都有不同的命令。
1、本地工作区修改,但未add
git checkout ./
//将本地工作区所有修改文件回退到HEAD
git checkout -- <files>
//仅回退单个(多个)文件
PS:修改不复存在
2、工作区修改文件已add到暂存区
git reset HEAD
//将暂存区文件回退到工作区
git reset HEAD <files>
PS:修改仍然存在
3、已提交commit至本地版本库
git reset HEAD^
//回退至上一节点 HEAD^^上上节点
git reset <commit_id>
//commit_id 为需要回退到的id。
PS:工作区修改仍然存在
git reset --hard <commit_id>
//commit_id 为需要回退到的id。
git reset --hard HEAD^^
//^^为当前id和差值数量。
这里我们还可以使用git checkout <commit_id>
来回退,等同于git reset --hard <commit_id>
。
PS:工作区修改被删除
差异自己操作两次就明白了。
有没有-- hard
区别很大,后续的恢复修改也有差异。
如果你使用了git reset --hard <commit_id>
带–hard的命令回退了版本;然后后悔了,要恢复,请参考我的另一篇文章:(点击下面链接)
https://blog.csdn.net/weixin_43083491/article/details/112618311
4、已push到远程仓库
这个就相对有点麻烦了
- 4.1覆盖
最简单的是再次提交一次正确的修改,问题是会留下一个commit_id,显得有点傻。 - 4.2回退
1、 首先回退本地分支
回退到自己修改之前的那次修改
git reset --hard <commit_id>
2、推送到远程
git push --force
其实这里有个疑问,如果在自己push上去之后,又有人提交了,那这样回退岂不把别人的提交给删除了吗?这里可以这样操作:
git rebase -i [commit_id]
//any commit id
del pick[commit_id]
//you want to rollback.
git push <branch> --force
// is the branch you want to push
工作区、暂存区理解(这部分可参考廖雪峰老师网站)
https://www.liaoxuefeng.com/wiki/896043488029600/897271968352576
工作区(Working Directory)
就是你在电脑里能看到的目录
版本库(Repository)
工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。