复杂合并场景

Git 高级

Amanda Crawford-Adamo

Software and Data Engineer

航班数据管道仓库

航班出行数据管道仓库的目录与文件结构图。Git 工作目录含 4 个文件:etl.py、load.py、transform.py、ingest.py。data 目录含 flight_data.csv 数据文件;同时显示 .git 文件夹。

Git 高级

Git 压缩合并(squash)

$$

功能

  • 在目标分支上创建一个新提交
  • 合并源分支的所有更改
    • 添加一个单父的常规提交(不同于递归策略)
  • 提交到目标分支(非功能分支)
    • 不保留源分支的详细提交历史

$$

优点

  • 历史干净、线性
  • 简化大型特性的代码评审
  • 更易整体回退该特性
Git 高级

压缩合并示例

data-cleanup 分支在 main 第二次提交后分叉。main 又有一次提交;data-cleanup 还有两次提交。

Git 高级

压缩合并流程

  1. 切换到 main 分支

    $ git checkout main
    
  2. 对 data-cleanup 的更改创建压缩提交

    $ git merge --squash data-cleanup
    
  3. 将压缩提交提交到 main 历史

    $ git commit -m "Implement and optimize data cleanup"
    
Git 高级

压缩合并结果

一张图示:main 和 data-cleanup 两个分支。main 有四次提交。功能分支在 main 最新提交后分叉并有一次额外提交。main 的最新提交是单父提交对象,包含了 data-cleanup 的压缩提交。

Git 高级

Git 章鱼合并(octopus)

$$

功能

  • 一次合并三条或以上分支
  • 生成一个多父的合并提交
  • 适用于分支之间无冲突时

$$

优点

  • 同时集成多个相互独立的特性
  • 用于同步多个版本的发布分支
Git 高级

章鱼合并示例

一张图示:四个开发分支 main、ingestion、transform、load。后三者在 main 第一次提交后分叉,各有一次额外提交;main 也有一次额外提交。

Git 高级

章鱼合并命令

Git 章鱼合并命令

git merge -s octopus

示例

$ git merge -s octopus ingest transform load
Trying simple merge with ingest
Trying simple merge with transform
Trying simple merge with load
Merge made by the 'octopus' strategy.
...
Git 高级

章鱼合并结果

一张图示:四个开发分支 main、ingestion、transform、load。后三者在 main 第一次提交后分叉,各有一次额外提交。main 有五次提交,包含其他分支的提交;最后一个合并提交有四个父:main 先前的最新提交,以及 ingest、transform、load 的最新提交。

Git 高级

小结

压缩合并(squash)

  • 简化历史,将多次提交合并为一次
  • 用于保持历史干净精简
    git merge --squash <source_branch>
    

章鱼合并

  • 保留分支结构
  • 同时合并多个分支
  • 高效集成多条并行开发
    git merge -s octopus <branch 1> <branch 2> <branch 3>
    
Git 高级

Passons à la pratique !

Git 高级

Preparing Video For Download...