引言: 在我们进行开发中,将自己写好的代码合并到远程分支之后,要是出了问题,我们应该如何回如何撤销已提交的 Git 代码呢?
如何撤销已提交的 Git 代码
在以下一些常见情况下,可能需要撤销已提交的代码:
不小心提交了包含密码或 API 密钥的代码。
提交的代码不完整或存在问题,需要进一步修改。
提交信息填写错误,需要重新整理。
将个人配置文件或私有依赖提交到共享仓库,影响团队协作。
想将多次零散的提交合并为一个更有意义的提交。
我们可以使用Git 的撤回功能。
Git Reset 模式
git reset 命令有三种主要模式用于撤销提交:--soft、--mixed 和 --hard。
--soft:撤销提交,但保留暂存区的状态,适用于需要保留代码改动的情况。
--mixed(默认):撤销提交并清除暂存区的状态,但保留工作目录中的代码改动。
--hard:删除提交并删除工作目录中的代码改动。
对应在idea中的就是这样。
如何撤销已提交(commit)的代码
基本撤销方法
可以使用 git reset 命令来撤销提交,根据不同需求,有以下三种模式:
--soft 模式
不删除工作目录中的代码改动。
只撤销提交,保留暂存区的状态。
使用命令:
git reset --soft HEAD^
--mixed 模式(默认)
不删除工作目录中的代码改动。
撤销提交和暂存区的状态。
使用命令:
git reset HEAD^
或
git reset --mixed HEAD^
--hard 模式
删除工作目录中的代码改动。
撤销提交和暂存区状态。
使用命令:
git reset --hard HEAD^
在这里大家可能会好奇,什么是Git的暂存区呢?
Git 可以大概分为三个区
Git 本地数据管理,大概可以分为三个区,工作区,暂存区和版本库。
工作区(Working Directory)
是我们直接编辑的地方,例如 Android Studio 打开的项目,记事本打开的文本等,肉眼可见,直接操作。
暂存区(Stage 或 Index)
数据暂时存放的区域,可在工作区和版本库之间进行数据的友好交流。
版本库(commit History)
存放已经提交的数据,push 的时候,就是把这个区的数据 push 到远程仓库了。
从这里我们不难得知。
撤销指定的提交版本
可以通过以下方式指定要撤销的版本:
1.使用 HEAD^ 表示上一个提交版本:
git reset --soft HEAD^ # 撤销最近一次提交
git reset --soft HEAD~2 # 撤销最近两次提交
2.使用提交的 commit ID:
git reset --soft <commit-id> # 回退到指定的提交版本
修改提交信息
如果只需要修改最后一次提交的注释信息,可以使用以下命令:
git commit --amend
注意事项
git reset 只能回滚最新的提交,无法单独回滚某个历史提交。
如果代码已推送到远程仓库,需要在本地执行 reset 后,再强制推送:
git push origin <branch-name> --force
建议使用 --soft 模式,以避免丢失代码改动。
如何撤回已推送(Push)的代码
方法一:使用 git revert(推荐)
git revert 是最安全的方式,因为它不会删除提交历史:
# 1. 查看提交历史
git log
# 2. 撤销指定的 commit
git revert <commit-id>
# 3. 推送到远程仓库
git push origin <branch-name>
这种方法会通过创建一个新的提交来撤销之前的更改。
方法二:使用 git reset
这种方式会修改提交历史,需谨慎使用:
# 1. 使用 reset 回退版本
git reset --soft HEAD^ # 撤销最近一次 commit,保留代码改动
或
git reset --hard HEAD^ # 撤销 commit 并删除代码改动
# 2. 强制推送到远程
git push -f origin <branch-name>
reset 有三种模式:
--soft:只撤销 commit,保留代码修改。
--mixed:撤销 commit 和 add,保留代码修改。
--hard:完全撤销修改,删除代码改动。
注意事项
使用 git revert 更安全,因为它不会删除提交历史。
使用 git reset --force 时要谨慎,因为它会重写历史,可能影响其他开发者。
如果其他人已经拉取了要撤销的代码,建议使用 git revert 而不是 reset。
在执行这些操作之前,建议先备份代码或创建一个新分支。