Git: 变基分支

3

我正在尝试理解Git中的变基操作,并且有一个问题,即在这种情况下是否使用变基是一个好习惯:

我有一个名为“feature”的分支,它从另一个名为“develop”的分支中分支出来。 我在“feature”中进行了几次提交,但尚未与“develop”合并,因为该功能仍在开发中,也没有将“feature”中的提交推送到远程存储库。

如果我现在检出“develop”进行一些修改,那么将其变基到“feature”分支中以使“develop”与“feature”同步是否明智?


2
为什么不把它们合并呢? - Adrian
我还没有完成开发这个功能。 - Goonyan Harir
合并不会关闭分支。如果你觉得从特性分支的更改可以应用到 develop 分支上,那么你可以将它们平等地合并。然后你继续在特性分支上工作,并在完成后再次合并它。 - Adrian
谢谢你的帮助。我一直认为最好将任何功能分支与develop分开,直到该功能经过完全测试,然后将它们合并到develop中 - 也许我想错了? - Goonyan Harir
2个回答

6

假设'feature'是本地分支,我会在'develop'上进行变基(rebase)。

将'develop'合并到'feature'会创建一个多余的合并提交。但是通过变基操作,可以整合来自主分支的所有更改,并让你在'feature'准备好与'develop'合并之前解决所有冲突,而不会创建任何额外的提交。

当然,有人可能持有不同的观点,详情请参考这里。但我喜欢一个干净且易读的历史记录。通常我完成一个功能后,会执行rebase,然后执行merge --no-ff。这样,历史记录仍然清晰地表明已经有一个功能分支:

- * - * - - - - - - - * - * -
       \             /
        * - * - * - *

事实上,我喜欢“持续”解决冲突。每当出现冲突时,我想尽早知道,以便在变得麻烦之前解决它(类似于持续集成的原因)。如果我遵循使用频繁合并的策略,我将有大量合并提交。使用频繁的变基可以避免它们。
还有一种替代策略可以让你使用合并但没有合并提交——你可以打开git rerere。
git config --global rerere.enabled true

根据这篇文章的描述,您可以进行中间合并、解决冲突,然后重置合并提交。当您对'feature'分支进行最终合并时,rerere功能将使Git记忆冲突解决方案。

1
@tom 我理解OP的意思是将“feature”重新基于“develop”。 OP在“develop”中进行了一些更改(“一些修改”),他希望将这些更改“同步”到“feature”中。将“feature”重新基于“develop”将使这些更改在“feature”中可用,这就是我理解“同步”的方式。 - Klas Mellbourn
感谢您的所有帮助和建议。如果我想将“develop”重新基于“feature”,这样做是否可以,还是像@Adrian建议的那样简单地将“feature”与“develop”合并,以便在切换回“develop”时能够看到更改,但请注意,“feature”尚未经过完全测试,仍处于开发中? - Goonyan Harir
如果“feature”分支自“develop”,我不太明白如何将“develop”基于“feature”进行变基。这对我来说听起来很奇怪。如果你在“develop”上重新将“feature”基于它进行变基,你将会在“feature”中得到“develop”的更改。 - Klas Mellbourn
抱歉,我应该更好地表达我的问题 - 如何在不进行合并的情况下将“feature”中的更改显示在“develop”中。 - Goonyan Harir
@GoonyanHarir 好的。如果这是你的目标,那么将“feature”的重要部分挑选到“develop”中可能是一个不错的主意。 - Klas Mellbourn

3

将所有提交添加到feature

以下操作会将自分支点以来在develop分支上进行的所有提交应用于feature分支,但不会影响develop分支。

当前状态:

M1---M2---D1--D2--T1--T2  develop
      \
       F1--F2  feature

选项1: 将 develop 合并到 feature
git checkout feature; git merge develop

M1---M2---D1--D2--T1--T2  develop
      \                \
       F1--F2-----------F3  feature

选项2(最初由Klas Mellbourn建议):将feature 分支变基到 develop分支
git checkout feature; git rebase develop

M1---M2---D1--D2--T1--T2  develop
                       \
                        F1'--F2'  feature

rebase操作可以让提交历史更加清晰,但是如果有基于feature的其他提交,则会出现问题。在你的情况下没有这种情况,所以不会有问题。

feature添加一些提交

如果你不能执行上述操作(可能提交D1D2还没有准备好进入feature),则可以使用git cherry-pick将这些提交复制到feature中:

M1---M2---D1--D2--T1--T2  develop
      \
       F1--F2--T1'--T2'  feature

git rebase会移动提交记录,而不是复制它们。

分离的主题分支

另一种工作流程是在早期共同祖先的基础上创建一个新的主题分支来进行新的提交记录:

       T1--T2  topic
      /
M1---M2---D1--D2  develop
      \
       F1--F2  feature

有了这样的图表,可以将 topic 合并到 developfeature 中,而不会引入不需要的或重复的提交。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接