git 如何撤回已push的代码

在日常的开发中,我们经常使用Git来进行版本控制。有时候,我们可能会不小心将错误的代码 Push 到远程仓库,或者想要在本地回退到之前的某个版本重新开发。

或者像我一样,写了一些感觉以后很有用的优化方案push到线上,又接到了一个新的需求。但是呢,项目比较重要,没有经过测试的方案不能轻易上线,为了承接需求只能先把push上去的优化方案先下掉。

现在我的分支是这样的,我想要在本地和远程仓库中都恢复到help文档提交的部分。

image.png

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

这样的操作非常不推荐,但是如果你不了解git,确实是我们最容易理解的方式。

如果你的错误代码不是很多,那么你其实可以通过与你想要恢复到的commit进行对比,然后手动删除错误代码,然后删除不同的代码。

image.png

按住 ctrl 选择想要对比的两个commit,然后选择 Compare Versions 就能通过对比删除掉你想要删除的代码。

这个方案在代码很简单时时非常有效的,甚至还能通过删除后最新commit和想要退回的commit在Compare一下保障代码一致。

但是这个方法对于代码比较复杂的情况来说就不太好处理了,如果涉及到繁杂的配置文件,那更是让人头疼。只能通过反复的Compare Version来进行对比。

这样的手动操作显然显得有些笨拙了,对此git有一套较为优雅的操作流程,同样能解决这个问题。

2. git Revert Commit(推荐)

image.png

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

image.png

git自动产生一个Revert记录,然后我们会看到git自动将我第三次错误提交代码回退了,这个其实就相当于git帮我们手动回退了代码。

image.png

后续,只需要我们将本次改动push到远程,即可完成一次这次回退操作,

image.png

revert相当于自动帮我们进行版本回退操作,并且留下改动记录,非常安全。这也是评论区各位大佬非常推荐的。

但是revert还是存在一点不足,即一次仅能回退一次push。如果我们有几十次甚至上百次的记录,一次次的单击回退不仅费时费力而且还留下了每次的回退记录,我个人觉得revert在这种情况下又不太优雅。

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

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

在想要回到的版本处的提交记录右键,点击new branch

image.png

 

image.png

 

image.png

新建分支的操作仅仅增加了一个分支,既能保留原来的版本,又能安全回退到想要回退的版本,同时不会产生太多的回退记录。

但是此操作仍然建议慎用,因为这个操作执行多了,分支管理就又成了一大难题。

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

image.png

这个时候会跳出四个选项供你选择,我这里是选择hard

其他选项的含义仅供参考,因为我也没有一一尝试过。

  1. Soft:你之前写的不会改变,你之前暂存过的文件还在暂存。
  2. Mixed:你之前写的不会改变,你之前暂存过的文件不会暂存。
  3. Hard:文件恢复到所选提交状态,任何更改都会丢失。 你已经提交了,然后你又在本地更改了,如果你选hard,那么提交的内容和你提交后又本地修改未提交的内容都会丢失。
  4. keep:任何本地更改都将丢失,文件将恢复到所选提交的状态,但本地更改将保持不变。 你已经提交了,然后你又在本地更改了,如果你选keep,那么提交的内容会丢失,你提交后又本地修改未提交的内容不会丢失。

image.png

image.png

image.png

然后,之前错误提交的commit就在本地给干掉了。但是远程仓库中的提交还是原来的样子,你要把目前状态同步到远程仓库。也就是需要把那几个commit删除的操作push过去。

打开push界面,虽然没有commit需要提交,需要点击Force Push,强推过去。 

image.png

需要注意的是对于一些被保护的分支,这个操作是不能进行的。需要自行查看配置,我这里因为不是master分支,所以没有保护。

image.png

可以看到,远程仓库中最新的commit只有我们的help文档。在其上的三个提交都没了。

image.png

注意:以上使用的是2023版IDEA,如果有出入的话可以考虑搜索使用git命令。

<think>好的,我现在需要帮助用户解决如何撤回已经推送到远程仓库的代码的问题。用户之前可能已经提交了错误的代码,现在想撤销这些更改。我需要结合提供的引用资料,给出准确的操作步骤,并确保步骤清晰易懂。 首先,根据引用[2]、[4]、[5],撤回已推送的代码通常使用git reset和git push --force命令。但要注意不同的reset参数的区别,比如--soft、--mixed和--hard。用户需要根据是否保留本地修改来选择不同的选项。 然后,用户可能需要针对特定的提交进行回退,这时候可以使用git revert,如引用[3]提到的。这种方法不会改变历史,适合团队协作的情况。 另外,引用[4]提到使用git reset到特定commit id,再强制推送。需要提醒用户谨慎操作,因为这会改变历史,可能影响其他协作者。 需要分步骤说明不同的场景:完全删除最新提交、保留本地修改、撤销特定提交。同时要强调注意事项,比如备份和强制推送的风险。 还要检查是否有遗漏的情况,比如如果用户已经回滚,如何重新提交正确的代码,如引用[3]中的步骤。最后,确保语言简洁,避免技术术语过多,让用户容易理解。</think>### 如何撤回已推送到远程仓库的代码撤回已推送的代码需谨慎操作,以下分场景说明具体步骤: --- #### **场景1:完全删除最新提交(适用于个人分支或团队协作前)** 1. **本地回退到上一次提交** ```bash git reset --hard HEAD~1 # 删除最新提交,丢弃所有修改 ``` - 参数说明: - `--hard`:同时撤销提交、暂存区和工作区改动 - `HEAD~1`:表示前一次提交(撤回多次提交可替换为`HEAD~n`) 2. **强制推送到远程仓库** ```bash git push origin <分支名> --force # 强制覆盖远程分支 ``` --- #### **场景2:保留本地修改(仅撤销提交记录)** 1. **撤销提交但保留代码改动** ```bash git reset --soft HEAD~1 # 保留工作区和暂存区内容 ``` - 修改代码后重新提交: ```bash git add . git commit -m "新提交说明" git push origin <分支名> ``` --- #### **场景3:撤销特定历史提交(保留后续修改)** 1. **使用`git revert`生成反向提交** ```bash git log # 查找要撤回的提交ID(如15f2499) git revert <提交ID> # 生成抵消该提交的新提交 ``` 2. **推送到远程仓库** ```bash git push origin <分支名> # 无需强制推送 ``` - 优点:不修改历史记录,适合团队协作[^3] --- #### **注意事项** 1. **强制推送风险** `--force`会覆盖远程历史,若其他人已拉取原提交,可能导致代码冲突[^5] 2. **备份** 操作前建议创建分支备份:`git checkout -b backup_branch` 3. **恢复误删提交** 若误删提交,可通过`git reflog`找回提交ID并重置 --- #### **操作流程图** ```mermaid graph TD A[本地错误提交] --> B{是否需保留本地修改?} B -->|是| C[git reset --soft] B -->|否| D[git reset --hard] C --> E[修改代码后重新提交] D --> F[强制推送] E --> G[正常推送] F --> H[远程记录更新] ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值