我正在尝试理解Git中的变基操作,并且有一个问题,即在这种情况下是否使用变基是一个好习惯:
我有一个名为“feature”的分支,它从另一个名为“develop”的分支中分支出来。 我在“feature”中进行了几次提交,但尚未与“develop”合并,因为该功能仍在开发中,也没有将“feature”中的提交推送到远程存储库。
如果我现在检出“develop”进行一些修改,那么将其变基到“feature”分支中以使“develop”与“feature”同步是否明智?
我正在尝试理解Git中的变基操作,并且有一个问题,即在这种情况下是否使用变基是一个好习惯:
我有一个名为“feature”的分支,它从另一个名为“develop”的分支中分支出来。 我在“feature”中进行了几次提交,但尚未与“develop”合并,因为该功能仍在开发中,也没有将“feature”中的提交推送到远程存储库。
如果我现在检出“develop”进行一些修改,那么将其变基到“feature”分支中以使“develop”与“feature”同步是否明智?
假设'feature'是本地分支,我会在'develop'上进行变基(rebase)。
将'develop'合并到'feature'会创建一个多余的合并提交。但是通过变基操作,可以整合来自主分支的所有更改,并让你在'feature'准备好与'develop'合并之前解决所有冲突,而不会创建任何额外的提交。
当然,有人可能持有不同的观点,详情请参考这里。但我喜欢一个干净且易读的历史记录。通常我完成一个功能后,会执行rebase
,然后执行merge --no-ff
。这样,历史记录仍然清晰地表明已经有一个功能分支:
- * - * - - - - - - - * - * -
\ /
* - * - * - *
git config --global rerere.enabled true
以下操作会将自分支点以来在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的其他提交,则会出现问题。在你的情况下没有这种情况,所以不会有问题。
如果你不能执行上述操作(可能提交D1
和D2
还没有准备好进入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 合并到 develop 和 feature 中,而不会引入不需要的或重复的提交。