git rebase在一个大的重构之后

时间:2011-05-30 22:02:27

标签: git git-rebase

我有2个分支,master和featureA。在featureA分支中,我在CoolFile.m中编写了一堆新代码。该功能尚未完成,因此此代码尚未准备好合并到主服务器中。 CoolFile过去编写得很糟糕,因此在开发分支中我对它进行了一系列更改(主要是重新排序方法,添加注释和删除空格)。

现在我想让rebase featureA脱离主人,这样我就可以从清理后的代码中受益。问题是,由于所有方法都已移动,因此rebase试图将所有新代码放在错误的位置。解决这个问题的最佳方法是什么?我是否应该等到功能完成重构?

2 个答案:

答案 0 :(得分:1)

我可能是错的,有点像git newb,但是rebase工作的方式是它从origin分支(在本例中为master)中找到子分支的最新共同祖先,然后应用新的提交子分支的原点,然后是新的提交,到子分支上(换句话说,就好像你得到了最新的master然后重新创建了你的分支,通过commit提交)。所以等待对你没有好处,因为它将应用来自两个分支的所有提交。

我发现最好的方法就是咬紧牙关并进行合并。与您一起获取其他开发人员,以便您可以选择要解决合并冲突的代码。

我还发现使提交变小使得变基/合并更容易。所以不要重构x函数然后提交,在每个重构后提交。它真的是要找到一个平衡 - 不要提交每一行更改,但在有意义的时候尽可能减少提交。

答案 1 :(得分:1)

您可以将主分支中的更改合并到featureA分支

A--B--F--G--H master
   \
    \-C--D--E featureA

让我们假设您在master上从commit B创建了featureA,并且C,D和E是在featureA上进行的提交,而F和G是重新排序方法等的提交。您现在要做的是合并F和G进入featureA分支。

$ git checkout featureA
$ git merge G (G is the sha1)

或者,您可以将提交F和G选为featureA。请记住,您仍然会遇到冲突,这些只是您的rebase选项的替代品。

将来我建议您直接在featureA上进行重构,或者从featureA分支进行重构:

A--B--F--G--H master
   \
    \-C--D--E featureA
         \
          \-I--J--K refactorFeatureA

然后将重构分支合并到featureA中是一块蛋糕,因为合并将是微不足道的。