找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

4571

积分

0

好友

599

主题
发表于 昨天 09:16 | 查看: 12| 回复: 0

面试官问:Git 如何撤回已 Push 的代码?如果问你,你会吗?

日常开发中,Git 是版本控制的核心工具。云栈社区上不少同行都交流过类似的场景:一不小心把错误的代码 push 到了远程仓库,或者想回退到某个历史版本重新开发。

我也遇到过类似的情况:写了一些自认为未来有用的优化方案 push 到线上,结果新需求来了,项目又比较核心,未经测试的方案不能轻易上线。为了不阻塞需求,只能先把已经 push 上去的优化代码撤掉。

当前分支状态如下,我希望本地和远程都恢复到 help文档 提交的部分。

Git 提交历史分支视图,展示第三次错误提交到 help 文档之间的记录

下面整理了四种解决思路,各有适用场景。

1. 基础的手动操作(比较笨,不推荐)

这种方式虽然不推荐,但如果你对 Git 还不熟悉,它反而是最容易理解的办法。

如果错误代码不多,可以直接和想要恢复到的 commit 进行对比,手动删除多余代码。

右键菜单中的 Compare Versions 选项

按住 ctrl 选中要对比的两个 commit,然后选择 Compare Versions,就能通过对比找到并删掉需要移除的代码。

代码简单时,这个方法很有效,还能在删除后再次 Compare 对照最新提交与目标提交,确保内容一致。但一旦代码复杂、配置文件多,反复对比就会很头疼。

手动操作终究有些笨拙,好在 Git 有更优雅的流程可以解决同样的问题。

2. Git Revert Commit(推荐)

README.md 仓库差异对比视图,显示第三次错误提交的内容

我第三次提交了错误代码,并且已经 push 到远程分支。想撤回这部分,只需要右键点击错误提交记录

右键菜单中的 Revert Commit 选项

Git 会自动生成一条 Revert 记录,然后把第三次错误提交的代码回退掉。这相当于 Git 帮你自动完成了手动删除的工作。

Revert 操作完成后的差异对比视图

接下来只需要把这次改动 push 到远程,回退操作就算完成了。

Push Commits 对话框,显示 Revert 记录即将推送

Revert 会自动帮我们完成版本回退,同时留下清晰的改动记录,安全性很高,这也是评论区多数大佬推荐它的原因。

不过 Revert 也有短板:一次只能回退一次 push。如果错误提交多达几十次甚至上百次,一次次单击回退既费时又费力,还留下大量回退记录。这种情况下,我个人觉得 revert 就不太优雅了。

3. 增加新分支(推荐撤回较多情况下使用)

真要回退到上百次提交之前的版本,我更建议直接新建分支。

在目标版本的提交记录上右键,点击 New Branch

右键菜单中的 New Branch 选项

Create Branch 新建分支对话框,输入分支名 test_copy

新建分支 test_copy 后的提交历史视图

新建分支只是多出了一个分支引用,既能保留原版本的完整记录,又能安全回到目标版本,同时不会产生大量回退记录。

但这个方法同样要谨慎使用——分支建得多了,分支管理本身就会变成新难题。

4. Reset Current Branch 到你想要恢复的 commit 记录(不太安全,慎用)

右键菜单中的 Reset Current Branch to Here 选项

选择 Reset 后会弹出四个模式供你选择,我这里是 Hard

其他模式的含义仅供参考,我也没有逐一尝试。

  1. Soft:你之前写的代码不会改变,之前暂存过的文件仍然保留在暂存区。
  2. Mixed:你之前写的代码不会改变,但之前暂存过的文件不再处于暂存状态。
  3. Hard:文件恢复到所选提交状态,任何本地更改都会丢失。如果你已经提交过,之后又在本地做了修改,选 Hard 会同时丢失已提交内容和未提交的本地修改。
  4. Keep:文件恢复到所选提交状态,但本地更改会尽量保留。如果你已经提交过,之后又做了本地修改,选 Keep 会丢失提交的内容,但保留下提交后的本地未提交修改。

Git Reset 对话框,Hard 模式被选中

本地分支回到 help 文档提交记录的界面

这样一来,错误提交的 commit 在本地就被清掉了。但远程仓库还保持着原来的状态,需要把这些删除操作同步过去。也就是要把那几个 commit 的删除动作 push 到远程。

打开 push 界面,虽然提示没有 commit 需要提交,但此时必须点击 Force Push 强推。

Push 对话框中 Force Push 按钮高亮显示

需要注意的是,对于受保护的分支,这个操作会被拦截。你需要自行检查分支保护配置。我这里因为不是 master 分支,所以没有保护限制。

Git 设置中的 Protected branches 保护分支配置

强推完成后可以看到,远程仓库最新的 commit 只剩 help文档,它上面的三个提交已经全部消失。

远程仓库提交记录,最新提交为 help 文档

注意事项:以上演示使用的是 2023 版 IDEA,如果你的版本界面有差异,建议直接搜索对应的 Git 命令来操作。




上一篇:Git 的 merge 就能合并代码,为什么公司规范要求用 rebase?
下一篇:嵌入式代码保养:Astyle 格式化、cppCheck 静态检查与 Git 版本控制
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-9-3 20:17 , Processed in 1.007273 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表