我们有两个针对
master
的功能分支:feature-a
和 feature-b
。
feature-b
暂时合并为 feature-a
。随后用 git revert -m1
撤消了该操作。
当
feature-a
合并到 master
时,Github 认识到来自 feature-b
的所有提交现在都出现在 master
上,并“帮助”关闭了 feature-b
的未完成 PR。但这实际上并没有帮助,因为从 feature-b
开始的代码更改并不存在于 master 中(因为合并 feature-a
还合并了“恢复“将功能 b 合并到功能 a”'提交)。
虽然不常见,但引入另一个并行工作的分支可能会很有用,因为这可能会影响您开发功能的方式。遇到这种情况应该如何处理?
不要恢复,rebase。
你的存储库看起来像这样。
A - B - C - D - E - F -------------- M2 [master]
\ \ /
\ Z - Y - M1 - X - R - W [feature-a]
\ /
1 - 2 - 3 --- [feature-b]
R 是回归。 M 是合并提交。 master 通过提交之间的连接包含 feature-a 和 feature-b;恢复提交没有什么特别的。
您可能应该保留此功能,因为功能 a 已合并到 master 中,但下次......让我们将时钟回滚到恢复之前。
A - B - C - D - E - F [master]
\ \
\ Z - Y - M1 - X [feature-a]
\ /
1 - 2 - 3 --- [feature-b]
这里,feature-b 已合并到 feature-a 中,并且附加提交已添加到 feature-a 中。
要完全撤消合并,请执行交互式变基以完全删除合并提交。
$ git switch feature-a
$ git rebase -i master
此时您将看到一个编辑器,其中列出了所有提交。只需删除带有合并提交的行即可。 Git 会在 Y 之上重写提交 X,看起来好像合并从未发生过。
A - B - C - D - E - F [master]
\ \
\ Z - Y - XA [feature-a]
\ \
\ M - X
\ /
1 - 2 - 3 [feature-b]
需要注意的是,由于提交 X 的父级发生了更改,因此它必须具有不同的提交 ID XA。如果你已经推送了feature-a,它不会再次推送,因为它已经被重写了。使用
git push --force-with-lease
安全地推送重写的功能-a。
如果变基出现问题,您可以随时返回。请注意,合并提交和原始 X 提交仍然存在。没有任何东西引用它们,它们最终将在几周内被垃圾收集。要撤消变基,请将
feature-a
移回提交 X。git reset
允许您根据需要移动分支标签。
$ git switch feature-a
$ git reset --hard X
A - B - C - D - E - F [master]
\ \
\ Z - Y - XA
\ \
\ M - X [feature-a]
\ /
1 - 2 - 3 [feature-b]
请参阅 Pro Git 中的重写历史记录了解更多信息。