Git reset 和 revert 的区别是什么?
Git 中的 `reset` 和 `revert` 是两种用于修改项目版本控制历史的方法,主要区别在于它们如何处理提交记录以及对工作区的影响。
git reset
git reset
移动当前分支的 HEAD
指针到指定提交历史位置, 可以丢弃或重置某些更改。它有以下模式:
git reset --soft
: 仅移动HEAD
指针, 保留暂存区和工作目录的更改。git reset --mixed
(默认模式): 移动HEAD
并重置暂存区, 但保留工作目录的更改。git reset --hard
: 移动HEAD
、重置暂存区和工作目录, 丢弃所有未提交的更改, 慎用可能永久丢失数据。 适用场景: 撤销本地未推送的提交(例如个人分支中的错误提交或暂存文件撤销)。例:# 撤销本地工作区文件修改 git reset HEAD file.txt # 硬重置到指定提交 git reset --hard commit_id
git revert
git revert
创建新提交未撤销指定已有提交的更改,保留原本的历史提交记录, 用于已发布共享分支的撤销操作。例:
# 撤销某个提交的历史提交 (e. g. )
git revert aabbcc1222
该操作生成反向更改的提交, 需人工解决潜在冲突在 commit conflict时出现.
核心区别
- 对历史记录的影响:
reset
移动HEAD
, 可能覆盖提交历史并丢失数据修改, 适合私有仓库和本地的操作, 但不适用于已有推送到已发布历史.revert
添加一个新内容, 保留原始提交历史, 不改变协作历史。
- 是否数据丢弃重写:
reset
(尤其--hard
)可能强制修改内容或删除数据, 存在风险修改丢失风险.revert
不修改已存在的版本历史, 只增更改操作日志; 操作更安全.
- 分支使用场景:
- 公有已推送历史: 严格用
revert
(不重写历史)。 - 未推送或开发中的新分支: 可选
reset
(便于灵活丢弃错误)。
- 公有已推送历史: 严格用
- 操作后果:
- 若操作三提交 (
A→B→C
)并取消B
:reset --hard B
: HEAD →A
之后修改无效清除,只留存A/B
的提交。状态重置为空状态.revert B
: 新的HEAD指向新提交撤销B
更改,结果树文件回滚A
前状态, 仍记录A/B/C
历史。新记录点出现追加新操作.
- 若操作三提交 (