高级分支集成:Git 变基

Git 高级

Amanda Crawford-Adamo

Software and Data Engineer

Git 变基

  • 集成更改的方法
  • 与合并不同
  • 去除合并提交,历史更清晰
  • 保持线性提交图,便于理解

Git 变基命令:

git rebase <branch_name>
Git 高级

变基示例 - 前

一张图,显示数据清理功能分支与主分支。功能分支在主分支第二次提交后分叉。主分支在创建数据清理分支后又有两个提交。

Git 高级

变基流程

  1. 切换到 data-cleanup 功能分支。
git checkout data-cleanup
  1. main 变基到 data-cleanup 上。
git rebase main
  • data-cleanup 的提交会在 main 最新提交之后重建
  • 变基后的 data-cleanup 提交会有新的哈希

注意: 如有冲突,需手动解决。

Git 高级

变基示例 - 后

一张图,显示数据清理分支已变基到主分支之上。数据清理分支现在包含主分支的全部提交,其提交开始于主分支全部提交之后。主分支未改变。

Git 高级

交互式变基

git rebase -i <commit_hash> 

功能

  • 允许对多个提交进行细粒度修改
  • 打开编辑器

警告!

  • 对公共分支变基会破坏工作流
    • 不要对公共分支(如 main)使用变基
  • 团队需约定何时使用变基
Git 高级

交互式变基 - 前

$$

这是编辑提交历史前的 data-validation 分支历史

$ git log --oneline data-validation
abc1234 Optimize validation performance
def5678 Fix validation bug
ghi9101 Add data validation function
xyz1234 New Main Branch Commit
vwx7890 Main Branch Commit
jkl2345 Initial commit
Git 高级

交互式变基编辑器

以下是在打开的编辑器中用 pickfixup 编辑提交历史的方法。

$ git rebase -i HEAD~3 
pick ghi9101 Add data validation function
fixup def5678 Fix validation bug
fixup abc1234 Optimize validation performance

# Rebase xyz1234..abc1234 onto HEAD~3(xyz1234) (3 commands)
#
# Commands:
# p, pick <commit> = use commit
# f, fixup <commit> = like "squash", but discard this commit's log message
...
Git 高级

交互式变基 - 后

之前

$ git log --oneline data-validation
abc1234 Optimize validation performance
def5678 Fix validation bug
ghi9101 Add data validation function
xyz1234 New Main Branch Commit
vwx7890 Main Branch Commit
jkl2345 Initial commit

之后

$ git log --oneline data-validatoin
mno6789 Add data validation function
xyz1234 New Main Branch Commit
vwx7890 Main Branch Commit
jkl2345 Initial commit

以下提交已合并为一个:

  • abc1234
  • def5678
  • ghi9101
Git 高级

合并 vs 变基

图片显示三张图:分叉的分支图、合并后的图、变基后的图

合并(Merge)

  • 保留完整历史和分支结构
  • 维持并行开发的上下文

变基(Rebase)

  • 将提交重放到目标分支之上
  • 形成线性历史
  • 丢失部分上下文信息
Git 高级

何时用合并或变基

合并(Merge)

用于集成已完成的功能,并保留开发上下文

变基(Rebase)

用于让功能分支跟上主分支,或在合并前清理历史

请记住

  • 变基会改写历史,请谨慎使用
Git 高级

Passons à la pratique !

Git 高级

Preparing Video For Download...