在 Git 中,revert
、reset
和 rebase
都是用来修改提交记录或状态的,但它们的使用场景和效果各不相同。
恢复提交:git revert
git revert
命令的实际结果类似于 reset
,但它的方法不同。reset
是通过移动分支指针撤销更改,而 revert
是通过添加一个新的提交取消更改。
用法
git revert <commit-id>
例如,撤销最近一次提交:
git revert HEAD
特点
- 安全,不会修改历史记录。
- 适合用于团队协作和已推送到远程的分支。
回退提交:git reset
git reset
用于改变分支指针,并决定是否保留工作区和暂存区的更改。
步骤 1:查看提交历史
使用 git log
查询需要退回的提交 ID:
git log
步骤 2:选择回退模式
软回退 (
--soft
)
仅回退分支指针,保留暂存区和工作区的更改。git reset --soft <commit-id>
混合回退 (
--mixed
)
回退分支指针,清除暂存区,保留工作区的更改。(这是默认模式)git reset --mixed <commit-id>
硬回退 (
--hard
)
回退分支指针,同时清除暂存区和工作区的所有更改。git reset --hard <commit-id>
推送到远程
如果需要将本地的变更覆盖远程分支:
git push --force
变基:git rebase
git rebase
用于重新整理提交历史,将当前分支的更改重新应用到另一个基础提交上。
场景:分支变基
假设有以下分支:
- master:
C4 -> C2 -> C1 -> C0
- feature:
C5 -> C3 -> C2 -> C1 -> C0
要将 feature
分支的提交重新基于 master
分支:
git checkout feature
git rebase master
变基后的结果:
- master:
C4 -> C2 -> C1 -> C0
- feature:
C5' -> C3' -> C4 -> C2 -> C1 -> C0
交互式变基
可以通过 -i
参数合并、修改或删除提交:
git rebase -i <base-branch>
编辑器中提供以下选项:
pick
: 保留提交。squash
: 合并当前提交到上一个提交。edit
: 修改提交内容。
恢复历史:git reflog
git reflog
用于查看分支操作历史。它记录了所有分支指针的变动,帮助找回丢失的提交。
用法
git reflog
示例输出:
e309ee8 (HEAD -> master) HEAD@{0}: pull: Fast-forward
30c0e5e HEAD@{1}: commit: fix: 优化代码
9429f03 HEAD@{2}: commit: fix: 优化代码
1bdcafe HEAD@{3}: commit: fix: 修改配置
如果误操作(如 git reset --hard
),可以通过 git reflog
找到目标提交并恢复:
git reset --hard <commit-id>
对比总结
功能 | git revert | git reset | git rebase |
---|---|---|---|
作用 | 撤销提交,创建新提交 | 改变提交历史 | 重组提交历史 |
安全性 | 安全,适合已推送分支 | 高风险,慎用于远程分支 | 高风险,慎用于远程分支 |
适用场景 | 团队协作,回滚指定提交 | 修改本地提交 | 清理历史、线性合并 |
选择合适的工具,确保团队协作无缝进行!