如何回退多个Git提交

如何回退多个Git提交

技术背景

在Git的使用过程中,我们经常会遇到需要回退多个提交的情况。例如,开发过程中发现某些提交引入了错误,或者提交的内容不再需要等。但需要注意的是,不应该重写(更改)已经发布的历史,因为可能有人基于这些历史进行了工作,重写历史会给合并和更新带来问题。所以通常采用创建新提交来撤销更改的方式。

实现步骤

方法一:使用git revert命令逐个回退

假设提交历史为 A <- B <- C <- D <- master <- HEAD,要回退提交 BCD,可以按以下步骤操作:

1
2
3
4
git revert --no-commit D
git revert --no-commit C
git revert --no-commit B
git commit -m "the commit message for all of them"

此方法适用于除合并提交之外的所有情况。

方法二:使用git checkout恢复指定提交的内容

1
2
git checkout -f A -- .
git commit -a

这样会创建一个新提交 A',其内容与 A 相同,但提交信息、父提交和提交日期不同。此方法也适用于合并提交,但不会删除新增的文件。如果有本地更改,需要先使用 git stash 暂存。

方法三:使用git reset

1
2
3
git reset --hard A
git reset --soft D
git commit

此方法适用于所有情况。

方法四:使用git revert结合范围指定

1
git revert master~3..master

或者 git revert B...Dgit revert D C B,这会创建一个新提交来撤销 BCD 的更改。

方法五:使用git restore

1
2
3
4
5
git switch -c feature/flux-capacitor
git restore --source A .
git add .
git commit
git push

此方法可以将 HEAD 恢复到与 A 相同的状态,且不会更改他人可能基于的历史,还会留下有用的历史记录。

方法六:使用git revert结合git rev-list

如果要在一个提交中回退多个提交,可以使用:

1
for i in `git rev-list <first-commit-sha>^..<last-commit-sha>`; do git revert --no-commit $i; done

如果要为每个回退的更改创建一个单独的提交,可以使用:

1
for i in `git rev-list <first-commit-sha>^..<last-commit-sha>`; do git revert --no-edit -s $i; done

核心代码

批量回退多个提交

1
2
git revert --no-commit HEAD~3..
git commit -m "your message regarding reverting the multiple commits"

恢复到指定提交状态

1
2
3
git checkout <branch_name>
git reset --hard <commit Hash for A>
git push -f

使用git restore恢复

1
2
3
4
5
git switch -c feature/flux-capacitor
git restore --source A .
git add .
git commit
git push

最佳实践

  • 在回退多个提交之前,确保工作副本没有未提交的修改,可以使用 git status 检查。
  • 对于共享仓库,尽量使用 git revert 来创建新提交撤销更改,避免重写历史。
  • 在回退操作前,先备份重要的代码或分支,以防误操作。

常见问题

遇到合并提交无法回退

可以尝试使用 git checkoutgit reset 方法,或者先将需要回退的提交进行合并,再进行回退操作。

回退操作后出现冲突

需要手动解决冲突,然后使用 git addgit commit 完成回退提交。

重写历史后无法正常推送

如果重写了历史,需要使用 git push -f 强制推送,但要注意这可能会影响其他开发者,使用前应与团队沟通。


如何回退多个Git提交
https://119291.xyz/posts/how-to-revert-multiple-git-commits/
作者
ww
发布于
2025年5月27日
许可协议