[git]git 的一个变基问题.

2023-03-21 18:26:08 +08:00
 kyonn

最开始分支是这样的

A-B-C(main)
    |
    |-D-E(dev)

然后发现个 bug,需要合入 main 分支(对应图中的 Q), 但是开发人员误合入了 dev 分支(对应途中的 Q'), 由于 dev 也是公共分支, 不能复写历史, 只能 revert(对应图中的 Q''), 然后最终历史变为下图. 其中 Q 和 Q'是相同的修改, Q''是 Q'的 revert.

A-B-C-Q(main)
    |
    |-D-E-Q'-Q''(dev)

假设这时开发完成了, 我要把 dev 合回 main. 选择把 dev 变基到最新的 main, 但是由于 rebase 的特性, Q'被认为跟 main 上的 Q 是一样的修改, 被 rebase 自动丢弃了. 最终变为下图. 其中 Q'''跟 Q''是等价的,是针对 Q 或者 Q'的 revert, 这样反而导致主线上的修改 Q 被 dev 回退了, 不符合最终目标.

A-B-C-Q(main)-D'-E'-Q'''

有一种解决方案是变基前先将 dev 压缩为一条 commit, 缺点是丢失了历史. 不知道 V 友们是否有更好的解决方法? 在保留 dev 分支历史的情况下.

1172 次点击
所在节点    问与答
24 条回复
kyonn
2023-03-21 19:31:22 +08:00
@rrfeng 交互模式是有告警的... 测试了下.
optional
2023-03-21 19:32:08 +08:00
@kyonn 忘了就没什么好办法。。这相当于你要在一个分支上保留特定修改,又要于其它分支交互。。
vvdsaa
2023-03-21 21:14:41 +08:00
从 main checkout 一个新 branch 指向 Q ;
cherrypick D 、E ;
新 branch pr 到 main
weyou
2023-03-22 01:30:06 +08:00
关键点在于 dev 分支上的 Q 本就不该 revert 。既然 dev 是其他不相关的开发,不 revert 相当于提前 cp 了 main 的一些 commit ,Q 在 dev 上的存在是很正常的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/925933

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX