Git 中复原 revert 和重设 reset 有什么区别?
回答重点
Git 中的 revert 和 reset 都是用于撤销更改的命令,但它们的用法和效果有所不同。
1) Git revert :通过创建一个新的提交来撤销某个特定的已存在的提交。这意味着代码库的历史会保留,而且之前的提交记录不会被删除,只是增加了一个新的提交来抵消以前的更改。使用方式: git revert <commit>
2) Git reset :改变当前分支的 HEAD 指针的位置,有三种模式:
--soft
:只是移动 HEAD 指针,不改变工作目录和暂存区。--mixed
(默认):移动 HEAD 指针,并重置暂存区到指定的提交,但保留工作目录的更改。--hard
:移动 HEAD 指针,并重置暂存区以及工作目录到指定的提交,所有未提交的更改都会丢失。 使用方式:git reset [--soft | --mixed | --hard] <commit>
扩展知识
1) 应用场景 :
- Git revert 适合用在已经共享了的公共分支(例如主分支),因为它不会改变提交历史记录,别的开发者可以拉取这些变更,不会产生冲突。
- Git reset 更适合用在本地分支或临时分支,尤其是在提交了错误的更改后立即修正的场景,因为它可以彻底“擦掉”错误的提交记录。
2) 潜在风险 :
- 使用 git reset --hard 要非常谨慎,因为它会丢失所有未提交的更改,可能造成不可恢复的数据丢失。
- 使用 git reset 改变提交历史记录后,推送到远程仓库可能会导致团队其他成员的工作变得复杂,因为他们也需要手动同步这样的变更。
3) 解决冲突 :理解 git reset 可能导致的同步问题,引导同事同步改变后的历史记录,常见方法包括 pull --rebase 或者 rebase -i 来进行交互式变基。
4) 实际场景举例 :
- 假设你在主分支进行了错误的提交,比如提交 ID 是
abc123
。
- 使用
git revert abc123
会生成一个新的提交,比如def456
,这个新的提交将把abc123
的更改反向操作。 - 使用
git reset --hard abc123^
则会直接删除abc123
及之后的所有提交,把主分支重置为abc123
之前的状态。
- 使用
5) 高级用法 :
- git revert 可以接受多个提交,甚至可以是一个范围的提交,它会逐一对每个提交操作生成反向提交。
- git reset 的高级用法还包括使用路径参数,如
git reset HEAD file.txt
,只重置单个文件的状态。