git 回滚


在 Git 中,revertresetrebase 都是用来修改提交记录或状态的,但它们的使用场景和效果各不相同。


恢复提交: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:选择回退模式

  1. 软回退 (--soft)
    仅回退分支指针,保留暂存区和工作区的更改。

    git reset --soft <commit-id>
    
  2. 混合回退 (--mixed)
    回退分支指针,清除暂存区,保留工作区的更改。(这是默认模式)

    git reset --mixed <commit-id>
    
  3. 硬回退 (--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 revertgit resetgit rebase
作用撤销提交,创建新提交改变提交历史重组提交历史
安全性安全,适合已推送分支高风险,慎用于远程分支高风险,慎用于远程分支
适用场景团队协作,回滚指定提交修改本地提交清理历史、线性合并

选择合适的工具,确保团队协作无缝进行!


文章作者: costalong
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 costalong !
评论
  目录
国庆
快乐