Git 版本控制:分支合并操作流程

489 阅读3分钟

引言

在 Git 版本控制系统中,mergerebase 是实现分支合并的两种核心操作,它们都能帮助我们整合分支,但实现方式和适用场景有所不同:

  1. merge 操作:通过创建新的合并提交整合分支,该方式简单直观,能完整保留分支历史脉络。不过,频繁合并易使提交历史呈现复杂的 “分支 - 合并” 锯齿状结构,影响历史追溯。
  2. 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)
    
  • 特点
    1. 如果没有冲突,会创建一个新的合并提交 I
    2. 如果有冲突,需要解决冲突后执行 git add <冲突文件>git merge --continue
    3. 强制非快速合并:使用 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)
    
  • 特点
    1. Git 会重新应用 DEF 提交记录。
    2. 如果存在冲突,需要逐个解决每个提交的冲突(会执行多次git add <冲突文件>git rebase --continue)。
    3. 变基后需要强制推送(git push -fgit push --force-with-lease)。
    4. 风险:强制推送会覆盖远程分支的提交记录,可能导致其他开发者本地和远程分支提交历史不一致。

场景 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

  1. 分支合并最佳实践
    • 为保持提交历史整洁,开发前建议先执行 git pull 同步最新代码;功能分支合并前,优先使用 rebase 更新主分支最新提交,再通过 merge 完成合并。
  2. 操作建议
    • 避免在主分支上直接 rebase 开发分支,防止破坏主分支提交记录的完整性。。
    • 多人协作时,避免使用 git push --force,优先使用 git push --force-with-lease,推送成功后通知其他开发者处理本地变基问题。
    • 灵活使用 mergerebase,保持提交记录整洁清晰。
  3. 强制推送
    • 如果需要强制推送,优先使用 git push --force-with-lease,以避免覆盖远程分支的提交记录。

学习 Git 分支操作


感谢阅读,敬请斧正!