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`
更多推荐
所有评论(0)