繁体   English   中英

Git:重新分支一个分支

[英]Git: rebasing a branch

我试图理解Git中的变基,并且在这种情况下使用变基是否是一种好的做法是个好问题:

我有一个名为'feature'的分支,它从另一个名为'develop'的分支分支出来。 我已经在'feature'中做了几次提交,但还没有与'develop'合并,因为该功能仍在开发中,'feature'中的提交也没有被推送到远程存储库。

如果我现在结帐“开发”以进行一些修正,将它重新设置为“功能”分支是否明智,以便“开发”与“功能”同步?

我会在'develop'上修改'feature'(当然,假设'feature'是一个本地分支)

将“develop”合并为“feature”将创建冗余合并提交。 但是,使用rebase集成了来自master的所有更改,并允许您在“feature”准备好与“develop”合并之前解决所有冲突,而无需创建任何额外的提交。

当然有些人不同意 但我喜欢干净,可读的历史。 我经常做的是,当我完成与功能,我rebase ,然后我merge --no-ff 这样,历史记录仍然清楚地表明有一个功能分支:

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

问题是我喜欢“不断”地解决冲突。 每当发生冲突时我都想早点知道它,所以我可以在它变得麻烦之前解决它(类似于持续集成的原因)。 如果我遵循使用频繁合并的策略,我会有很多合并提交。 频繁的反叛我可以避免它们。

有一种替代策略可以让你使用合并但没有合并提交 - 你可以打开git rerere:

git config --global rerere.enabled true

如本文所述 ,您可以执行中间合并,解决冲突,然后重置合并提交。 当您执行“功能”分支的最终合并时,rerere功能将使Git记住冲突解决方案。

添加所有提交功能

以下将导致在开发分支上进行的所有提交,因为拆分应用于功能分支,而不影响开发

当前状态:

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

选项1:合并发展特征
git checkout feature; git merge develop

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

选项2(最初由Klas Mellbourn建议):rebase 功能 开发
git checkout feature; git rebase develop

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

rebase创建了一个更好的历史记录,但如果有其他基于功能的提交则存在问题。 在你的情况下没有,所以这不是一个问题。

添加一些提交功能

如果您不能执行上述操作(可能提交D1D2尚未准备好进入功能 ),您可以使用git cherry-pick将提交复制到功能

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

通过这样的图形主题 ,我可以合并到开发功能中,而不会引入不需要的或重复的提交。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM