如何回退已推送到远程的合并提交

如何回退已推送到远程的合并提交

技术背景

在使用Git进行版本控制时,有时会遇到需要回退已经推送到远程仓库的合并提交的情况。例如,合并了一个存在问题的分支,导致主分支出现故障,此时就需要回退这个合并提交。由于合并提交有多个父提交,Git无法自动确定要回退到哪个父提交,因此需要一些特殊的操作来完成回退。

实现步骤

使用git revert -m命令

  1. 确定合并提交的哈希值和父提交:使用git log命令查看合并提交的信息,找到合并提交的哈希值以及其两个父提交的哈希值。例如:
1
2
3
4
5
6
7
8
9
commit 8f937c683929b08379097828c8a04350b9b8e183
Merge: 8989ee0 7c6b236
Author: Ben James <[email protected]>
Date: Wed Aug 17 22:49:41 2011 +0100

Merge branch 'gh-pages'

Conflicts:
README

这里8f937c683929b08379097828c8a04350b9b8e183是合并提交的哈希值,8989ee07c6b236是其父提交。
2. 选择要回退到的父提交:使用-m选项指定父提交编号。git revert 8f937c6 -m 1会将仓库状态恢复到8989ee0时的状态,git revert 8f937c6 -m 2会恢复到7c6b236时的状态。
3. 提交回退操作:执行git revert命令后,会自动创建一个新的提交来记录回退操作。
4. 推送到远程仓库:使用git push -u origin master将回退后的提交推送到远程仓库。

使用git reset命令

  1. 检出远程分支到本地:使用git checkout your_branch_name将远程分支检出到本地。
  2. 找到正确的提交哈希值:使用git log -n5查看提交历史,找到合并前的正确提交的哈希值。
  3. 重置分支:使用git reset <commit-hash>将分支重置到该提交。
  4. 撤销错误提交的更改:使用git reset --hard撤销所有错误提交的更改。
  5. 强制推送到远程仓库:使用git push -f origin your_branch_name将本地分支强制推送到远程仓库。

核心代码

使用git revert -m

1
2
git revert -m 1 <commit-hash> 
git push -u origin master

使用git reset

1
2
3
4
5
git checkout your_branch_name
git log -n5
git reset <commit-hash>
git reset --hard
git push -f origin your_branch_name

最佳实践

  • 备份分支:在进行回退操作之前,先创建一个备份分支,以防操作失误。例如:
1
2
3
git checkout -b mybackup-branch
git reset --hard <commit-before-merge>
git push origin -u mybackup-branch
  • 明确回退目标:在使用git revert -m时,要明确知道自己要回退到哪个父提交,可以通过git log查看父提交的详细信息。
  • 测试回退效果:在将回退后的提交推送到远程仓库之前,先在本地进行测试,确保回退操作没有引入新的问题。

常见问题

回退后再次合并时部分更改丢失

当使用git revert回退合并提交后,再次合并相同分支时,之前回退的更改可能不会再次合并进来。这是因为git revert只是撤销了数据更改,并没有撤销合并提交对历史记录的影响。解决方法是先回退之前的回退操作,再进行合并。例如:

1
git revert <revert-commit-hash>

强制推送带来的问题

使用git push -f强制推送到远程仓库可能会覆盖其他开发者的提交,导致历史记录混乱。因此,在多人协作的项目中,建议先与其他开发者沟通,或者使用git revert来进行回退操作。


如何回退已推送到远程的合并提交
https://119291.xyz/posts/how-to-revert-a-merged-commit-pushed-to-remote/
作者
ww
发布于
2025年5月26日
许可协议