假设我有历史 - 所有本地,没有共享 -
A ── B ── C ── D ────── E ── F ── G ╲ └topic0 ╱ ├local-master Γ ── Δ ─────── Ξ └HEAD └topic1
,其中
topic0
是一个基本完成的功能,但是当我将其合并到local-master
topic1
是实验/ hackish,我现在需要的东西,但还没有准备好推动G
是使topic0
功能正常工作所需的错误修正我想尽快做的是推topic0
,但与错误修正提交G
一起。即,我想要历史
A ── B ── C ── D ── G'────── E'── F' ╲ └topic0 ╱ └local-master Γ ── Δ ──────────── Ξ └topic1
如果不是topic1
,这将非常简单:
$ git rebase -i topic0
# move G up so it comes after D
$ git checkout topic0
$ git merge G'
但这不起作用,因为E
不仅仅是D
作为它的祖先,所以我需要
$ git checkout topic0
$ git cherry-pick G
$ git checkout -b tmp/topic0plus1
$ git merge topic1
$ git checkout local-master
$ git rebase tmp/topic0plus1
$ git branch -d tmp/topic0plus1
哪个更加繁琐。
是否有更简单的方法来完成相同的重写?
答案 0 :(得分:1)
是否有更简单的方法来完成相同的重写?
没有。有其他方式,但更简单方式。通过合并重写不是很好支持[1]。您可以决定是否更喜欢cherry-pick
或rebase
来重写G
,但对于单次提交,它几乎没有什么区别。其他类似的变化是可能的。
重新创建合并是最危险的一步,您需要了解合并的创建方式(至少,它使用默认的合并策略和选项;是否手动添加了更改;是有冲突,他们是如何解决的。)
您可能获得最大收益的地方将是采用更加结构化的方法来进行分支和合并。它可能会或可能不容易与您的工作流程,但有一个主线和规则,当你合并到它可以很长的路要走。 (例如,当您想要将实验代码与主线结合使用时,可能您可以将master
合并到topic1
而不是相反,这样您的主线就不会受到影响代码,虽然它仍然是实验性的。)
[1]我一直在争论这句话是否合理; 支持“好”并不是一件容易的事。但重点是,从用户的角度来看,这并不容易。