在 git 中合并功能分支时处理恢复提交

问题描述 投票:0回答:1

我们有两个针对

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”'提交)。

虽然不常见,但引入另一个并行工作的分支可能会很有用,因为这可能会影响您开发功能的方式。遇到这种情况应该如何处理?

git git-revert
1个回答
0
投票

不要恢复,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 中的重写历史记录了解更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.