git代码回滚常用操作,reset与revert的区别

假设现在日志有1111,2222 提交记录,我在2222提交了致命缺陷代码,如果我使用reset 怎么做


git log

你当前的提交历史如下:

```

1111 (较早)

2222 (HEAD,有致命缺陷)


你在 `2222` 提交了**致命缺陷代码**,现在想撤销这个提交。

根据你是否已经将 `2222` **推送到远程仓库**,处理方式不同:


情况一:**尚未推送到远程(仅本地提交)**

你可以使用 `git reset` 安全地撤销。

推荐操作:回退到 `1111`,保留修改(推荐)

```bash

git reset --soft 1111

```

  • **效果**:

  • 撤销 `2222` 的提交记录。

  • 但保留你写的代码修改在**暂存区**(`git status` 会看到文件是绿色的)。

  • 你可以修改代码 → `git add .` → `git commit` 重新提交。

> 适合:你想保留代码但修复后再提交。


🔹 如果你想彻底丢弃 `2222` 的所有修改

```bash

git reset --hard 1111

```

  • **效果**:

  • 完全回到 `1111` 的状态。

  • `2222` 的所有代码修改**永久丢失**(无法恢复,除非有备份)。

> ⚠️ 谨慎使用!仅当你确定不需要 `2222` 的任何代码时使用。


🔹 如果你想撤销提交但保留修改在工作区

```bash

git reset 1111

git reset --mixed 1111

```

  • **效果**:

  • 撤销提交。

  • 修改保留在工作区(未暂存),你可以重新编辑、选择性添加。


情况二:**已经推送到远程仓库**

❌ 不要使用 `git reset --hard` + 强推 --force(除非你确定!)

因为这会**改写公共历史**,如果别人已经拉取了 `2222`,他们会遇到混乱。就是别人从远程仓库同步你的'2222'分支到本地,现在你把远程仓库分支'2222'分支的提交给删除了,上传了确实致命缺陷那块代码,但是同事本地还有'2222分支'的代码。

正确做法:使用 `git revert`(推荐!)

```

git revert 2222

```

  • **效果**:

  • 生成一个**新的提交**,内容是"把 `2222` 的修改全部撤销"。

  • 提交历史变成:

```

1111

2222(缺陷)

3333(revert 2222)

```

  • 安全、可追溯、不影响团队协作。

总结:怎么选?

  • 如果是团队协作或主分支**,**永远用 `git revert`。

  • 如果是个人本地调试,可以用 `git reset` 快速修复。

> 一句话:能用 `revert` 就不用 `reset`,能用 `--soft` 就不用 `--hard`