是否有可能在Git中做一个'倒置'的rebase?

时间:2018-01-12 11:08:52

标签: git

我有一种情况,我有一个功能分支方式领先于我的主人,所以 我的分支看起来像:

A---B---C   master
 \
  E---F-(~60 commits)-Z feature-1

Master在合并基础之前只提交了一些提交。 在主人身上重新定位特征-1会变得很糟糕,因为会有大量的冲突。此外,feature-1不是我的分支,所以我不确定如何解决它们。

然而,在轻微的冲突解决方案中,对feature-1的变基础主人很容易。

我的问题是,是否有可能在feature-1上修改master,同时保持master的提交?

即。我在master上的期望结束代码状态看起来像:

A---E---F-(~60 commits)-Z---B'--C'

但我真的希望我的历史看起来像

A---B---C---E'---F'-(~60 commits)'-Z'

这是不是可能没有通过功能1的巨大痛苦变化到主人身上?

仅仅为了一些背景知识,我想保持master未提交的提交的原因是另一个大的功能分支在feature-1之后从master分支。

我的实际历史看起来像是:

A---B---C---D
 \       \
  \       \
   \       H---I---J---K feature-2
    \
     E---F-(~60 commits)-G feature-1

如果我将master重新命名为feature-1,则H将不再是与C相同的提交, 因此,当将feature-2重新设置为master时,这两个分支的合并基础将是A(据我所知),这将搞乱rebase进程。

这个问题是否有一个简单的解决方案,或者我只需要咬紧牙关并完成大量功能-1 - >掌握rebase?

1 个答案:

答案 0 :(得分:0)

首先,你不应该将master(主分支)与任何其他分支重新绑定,除非另一个分支更新了master中的所有更改,或者你知道你在做什么。因为否则,你最终会改变master上提交的哈希值,并且必须强行推动你的更改。

其次,我不知道混淆的地方,但是在master上重新定位feature1之后,提交的状态将按照您的期望,而不是您预期的那样,即

A---B---C---E'---F'-(~60 commits)'-Z'

第三,只有当您是使用该分支的唯一用户时,才应将rebase用于分支。通常情况下,merging分支比rebase更安全,更可行,但您不会再获得线性历史记录。此外,使用merge策略可以避免中间冲突,因为它只考虑两个分支的最终状态。

git checkout master
git merge feature1

但是,如果你想保持线性历史,那么

git fetch
git rebase origin/master master
git checkout feature1
git rebase master 
# resolve any conflicts
git checkout master
git rebase feature1

# Do the same for feature2, when the need arises.