引言
在 Git 版本控制系统中,merge 和 rebase 是实现分支合并的两种核心操作,它们都能帮助我们整合分支,但实现方式和适用场景有所不同:
merge操作:通过创建新的合并提交整合分支,该方式简单直观,能完整保留分支历史脉络。不过,频繁合并易使提交历史呈现复杂的 “分支 - 合并” 锯齿状结构,影响历史追溯。rebase操作:将变基分支提交重新应用于目标分支,可使目标分支提交历史更为线性简洁,但可能带来风险(如重写提交历史,需要强制推送),在多人协作中需谨慎使用,避免造成协同冲突。
分支合并操作流程
主分支 (main) 和 feature 分支的初始结构
A---B---C (main)
\
D---E---F (feature)
merge 操作
场景 1:快速合并
- 操作:
git checkout main git merge feature git push - 结果:
A---B---C---D---E---F (main、feature) - 特点:快速合并不会创建新的合并提交,提交历史保持线性。
场景 2:非快速合并
- 操作:
git checkout main git merge feature git push - 结果:
A---B---C---G---H---I (main) \ / D---E---F (feature) - 特点:
- 如果没有冲突,会创建一个新的合并提交
I。 - 如果有冲突,需要解决冲突后执行
git add <冲突文件>和git merge --continue。 - 强制非快速合并:使用
git merge --no-ff。
- 如果没有冲突,会创建一个新的合并提交
场景 3:使用 git merge --squash
- 操作:
git checkout main git merge --squash feature git commit -m "Squash merge feature branch" git push - 结果:
A---B---C---G---H---I (D&E&F) (main) \ D---E---F (feature) - 特点:将多个提交压缩成一个单独的提交,主分支提交历史更加简洁,但会丢失原始提交的信息。
rebase 操作
场景 1:简单变基
- 操作:
git checkout main git rebase feature git push - 结果:
A---B---C---D---E---F (main、feature) - 特点:简单变基不用使用强制提交,更安全, 提交历史保持线性。
场景 2:复杂变基
- 操作:
git checkout main git rebase feature git push -f - 结果:
A---B---C---D'---E'---F'---G---H (main) \ D---E---F (feature) - 特点:
- Git 会重新应用
D、E、F提交记录。 - 如果存在冲突,需要逐个解决每个提交的冲突(会执行多次
git add <冲突文件>和git rebase --continue)。 - 变基后需要强制推送(
git push -f或git push --force-with-lease)。 - 风险:强制推送会覆盖远程分支的提交记录,可能导致其他开发者本地和远程分支提交历史不一致。
- Git 会重新应用
场景 3:使用 rebase 压缩提交
-
操作(在feature分支上):
git checkout feature git rebase -i HEAD~3 # 在交互模式下修改提交信息,保存退出 git push --force-with-lease git checkout main git rebase feature git push --force-with-lease -
结果:
A---B---C---I'---G---H (main) \ I(D&E&F 提交合并) (feature) -
操作(在main分支上):
git checkout main git rebase feature git status git reset HEAD~{number} git stash git pull git stash pop git add . git commit -m "xxx" git push -
结果:
A---B---C---G---H---I (D&E&F) (main) \ D---E---F (feature) -
特点:将多个提交压缩成一个单独的提交,主分支提交历史更加简洁,但会丢失原始提交的信息。
FAQ
- 分支合并最佳实践:
- 为保持提交历史整洁,开发前建议先执行
git pull同步最新代码;功能分支合并前,优先使用rebase更新主分支最新提交,再通过merge完成合并。
- 为保持提交历史整洁,开发前建议先执行
- 操作建议
- 避免在主分支上直接
rebase开发分支,防止破坏主分支提交记录的完整性。。 - 多人协作时,避免使用
git push --force,优先使用git push --force-with-lease,推送成功后通知其他开发者处理本地变基问题。 - 灵活使用
merge和rebase,保持提交记录整洁清晰。
- 避免在主分支上直接
- 强制推送
- 如果需要强制推送,优先使用
git push --force-with-lease,以避免覆盖远程分支的提交记录。
- 如果需要强制推送,优先使用
感谢阅读,敬请斧正!