** 在使用 Git 进行版本控制时,合并分支是一个常见的操作。然而,有时候我们可能需要撤销之前的合并操作。本文将详细介绍如何使用
git revert
撤销合并提交,即使在合并提交之后还有其他提交。**
场景描述:
假设你有两个远程分支
main
和
feature
,
feature
分支上有一些提交:
A -> B -> C (main)
\
D -> E (feature)
你已经将
feature
分支合并到
main
分支,并将合并后的
main
分支推送到远程仓库,创建了一个合并提交
M
。之后,
main
分支上又有一些新的提交
F
和
G
:
A -> B -> C -> M -> F -> G (main)
\ /
D -> E (feature)
现在你想撤销合并提交
M
。
步骤:
1. 切换到 main 分支
首先,确保你当前在 main 分支上:
git checkout main
2. 拉取最新的远程分支
确保你有最新的远程分支数据:
git pull origin main
3. 撤销合并提交 M(即hash版本号)
使用 git revert 命令撤销合并提交 M。由于合并提交有多个父提交,需要指定主分支(通常是第一个父提交)作为基准来撤销合并。这里的 -m 1 表示选择 M 的第一个父提交(即 C)作为基准来撤销合并。
git revert -m 1 M
#或者带上提交信息,步骤4就不会出现
git revert -m 1 M -m "Revert merge of feature branch to fix issues"
4. 提交撤销操作
git revert 会打开一个编辑器让你输入撤销提交的信息,默认信息通常已经包含了撤销操作的描述。保存并关闭编辑器后,撤销提交就会被创建。
5. 推送撤销提交到远程仓库
将撤销提交推送到远程仓库,确保其他开发者也能看到撤销操作:
git push origin main
撤销结果
撤销合并提交
M
后,
main
分支的提交历史将变成:
git log --oneline --graph
A -> B -> C -> M -> F -> G -> R (main)
\ /
D -> E (feature)
R
是一个新的提交,内容是撤销合并提交M
的更改。F
和G
仍然是main
分支的一部分,不受撤销操作的影响。
验证
使用
git log
命令来验证撤销操作的结果:
* 1234567 Revert "Merge branch 'feature' into main"
* 6789012 Commit G
* 5678901 Commit F
* abc1234 Merge branch 'feature' into main
|\
| * 567890e Commit E
| * 456789a Commit D
* cdef012 Commit C
* bdef012 Commit B
* adef012 Commit A
详细解释:
-m 1 选项:-m 1 表示选择合并提交 M 的第一个父提交作为基准。在合并提交中,第一个父提交通常是主分支(main),第二个父提交通常是被合并的分支(feature)。
撤销合并:git revert -m 1 M 会创建一个新的提交 R,这个提交的内容是撤销 M 引入的更改。R 提交会撤销 D 和 E 的更改,使 main 分支回到合并前的状态。
不影响 M 之后的提交:撤销 M 只会撤销 M 引入的更改,不会影响 M 之后的提交 F 和 G。
总结
- 撤销远程分支合并:使用
git revert -m 1 <merge-commit-hash>
撤销合并提交M
。 - 拉取最新远程分支:确保在撤销操作前拉取最新的远程分支,以避免冲突。
- 推送撤销提交:将撤销提交推送到远程仓库,确保其他开发者也能看到撤销操作。
- 不影响
M
之后的提交:撤销M
只会撤销M
引入的更改,不会影响M
之后的提交。
通过这些步骤,你可以有效地撤销远程分支的合并操作,即使在合并提交之后还有其他提交。
版权归原作者 与遨游于天地 所有, 如有侵权,请联系我们删除。