如何撤销已提交的 Git 代码

如何撤销已提交的 Git 代码

引言: 在我们进行开发中,将自己写好的代码合并到远程分支之后,要是出了问题,我们应该如何回如何撤销已提交的 Git 代码呢?

如何撤销已提交的 Git 代码

在以下一些常见情况下,可能需要撤销已提交的代码:

  1. 不小心提交了包含密码或 API 密钥的代码。

  2. 提交的代码不完整或存在问题,需要进一步修改。

  3. 提交信息填写错误,需要重新整理。

  4. 将个人配置文件或私有依赖提交到共享仓库,影响团队协作。

  5. 想将多次零散的提交合并为一个更有意义的提交。

我们可以使用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。

在执行这些操作之前,建议先备份代码或创建一个新分支。

LICENSED UNDER CC BY-NC-SA 4.0