Skip to content

git 回退

Git 回退 commit 的方法

在 Git 中,回退 commit 主要有 3 种方法,取决于你的具体需求:

  • git reset(本地回退,不保留或保留修改)
  • git revert(保留历史,创建新的 commit)
  • git reflog(找回误删的 commit)

1️⃣ 使用 git reset(回退到某个 commit,修改历史)

🔹适用于:

  • 本地回退,不会影响远程仓库。
  • 彻底撤销最近的 commit,可以选择保留或丢弃修改。
  • 修改 commit 历史(⚠️ 慎用! 在已推送的分支上使用会导致问题)。

🔸基本命令

bash
git reset [--soft | --mixed | --hard] <commit_id>
选项作用
--soft仅回退 commit,保留文件更改(git add 仍有效)。
--mixed回退 commit 和 git add,但保留文件修改(默认)。
--hard彻底回退 commit、git add 及文件修改,不可恢复(危险⚠️)。

🔹示例

🔹(1)回退 commit,但保留所有修改

bash
git reset --soft HEAD~1

效果:

  • 仅回退 commit,所有修改仍然在 暂存区(staged)
  • 你可以重新 git commit 或继续修改。

🔹(2)回退 commit 并取消 git add

bash
git reset --mixed HEAD~1

效果:

  • 回退 commit,所有修改仍然在 工作区(unstaged),但不会 git add

🔹(3)彻底回退 commit 并删除所有修改

bash
git reset --hard HEAD~1

⚠️ 注意: 这将 彻底删除文件修改,无法恢复!
效果:

  • commit 被删除,所有文件也恢复到上一个 commit 的状态。

🔹(4)回退到指定 commit

bash
git reset --hard <commit_id>

效果:

  • 强制回退到 <commit_id>,所有更改都会消失。

2️⃣ 使用 git revert(撤销 commit,不修改历史)

🔹适用于:

  • 已经推送到远程,但你想撤销某次提交。
  • 保留历史,而不是直接删除 commit。

🔸基本命令

bash
git revert <commit_id>
  • 这会创建一个 新的 commit,用于撤销 <commit_id> 的更改。

🔹示例

bash
git revert HEAD

效果:

  • 撤销最近一次 commit,并创建一个新的 commit。
bash
git revert HEAD~2

效果:

  • 撤销倒数第 3 次 commit(HEAD~2)。

🔹git revert vs git reset

命令作用
git reset修改历史,回退 commit,可选择保留或删除文件更改(本地操作)。
git revert保留历史,创建新的 commit 来撤销某次 commit(适合远程仓库)。

3️⃣ 使用 git reflog(找回误删的 commit)

🔹适用于:

  • 恢复误删的 commit(例如,误用 git reset --hard)。
  • 查找 HEAD 之前的历史状态

🔸基本命令

bash
git reflog

会列出所有 HEAD 变更记录:

1a2b3c4 HEAD@{0}: reset: moving to HEAD~1
5d6e7f8 HEAD@{1}: commit: Fix bug
9g0h1i2 HEAD@{2}: commit: Add new feature

如果你误删了 commit,可以恢复:

bash
git reset --hard <commit_id>

示例:

bash
git reset --hard 5d6e7f8

效果:

  • 恢复到 commit 5d6e7f8,找回误删的内容。

4️⃣ 远程仓库回退(已推送的 commit)

🔹情况 1:用 git revert(推荐)

bash
git revert <commit_id>
git push origin <branch>

效果:

  • 创建新的 commit,撤销 <commit_id> 的更改。

🔹情况 2:用 git reset(慎用⚠️)

如果你 已经推送 了 commit,但仍想用 git reset 回退:

bash
git reset --hard HEAD~1
git push origin <branch> --force

⚠️ 危险!

  • --force覆盖远程仓库的历史,导致其他人拉取时出现冲突。
  • 如果多人协作,建议使用 git revert 代替 git reset

总结

方法适用场景影响远程仓库适用?
git reset --soft回退 commit,保留修改仅撤销 commit,文件仍然存在❌ 仅本地
git reset --mixed回退 commit 和 git add,保留修改代码仍在工作区❌ 仅本地
git reset --hard彻底回退 commit,删除修改无法恢复❌ 慎用!
git revert撤销 commit,保留历史创建新的 commit✅ 推荐
git reflog误删 commit 时恢复恢复误删的 commit❌ 仅本地

推荐最佳实践

  1. 本地修改(未推送):

    • 想撤销 commit,但保留修改:git reset --soft HEAD~1
    • 想撤销 commit,并恢复到未 git add 状态:git reset --mixed HEAD~1
    • 想彻底回退,不留痕迹(慎用):git reset --hard HEAD~1
  2. 远程仓库(已推送):

    • 推荐使用 git revert,保留历史:git revert <commit_id> && git push
    • 避免 git reset --hard + git push --force(除非你知道自己在做什么)。