進階合併情境

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 合併

$$

功能

  • 在目標分支建立單一新 commit
  • 合併來源分支的所有變更
    • 新增一個只有單一父節點的一般 commit(不同於遞迴策略)
  • 加入目標分支(非 feature 分支)
    • 不保留來源分支的詳細提交歷史

$$

優點

  • 乾淨且線性的歷史
  • 簡化大型功能的程式碼審查
  • 輕鬆回復整個功能
Git 進階

Squash 合併範例

data-cleanup 分支在第二個提交後自 main 分支分岔。main 分支又多了一個提交。data-cleanup 有兩個額外提交。

Git 進階

Squash 合併流程

  1. 切換到 main 分支

    $ git checkout main
    
  2. 將 data-cleanup 的全部變更做成 squash 提交

    $ git merge --squash data-cleanup
    
  3. 將該 squash 提交提交到 main 歷史

    $ git commit -m "Implement and optimize data cleanup"
    
Git 進階

Squash 合併結果

顯示兩個分支:main 與 data-cleanup。main 有四個提交。功能分支在 main 最新提交後分岔,且在自身分支上多一個提交。main 的最新提交為單一父節點的提交物件,內含 data-cleanup 的壓縮提交。

Git 進階

Git octopus 合併

$$

功能

  • 一次合併三個以上分支
  • 建立一個具有多個父節點的合併提交
  • 適用於彼此不衝突的分支

$$

優點

  • 同步整合多個獨立功能
  • 用於同步多個版本的發行分支
Git 進階

Octopus 合併範例

四個開發分支示意:main、ingestion、transform、load。ingestion、transform、load 在第一個提交後自 main 分岔,各自多一個提交。main 也再多一個提交。

Git 進階

Octopus 合併指令

Git Octopus 合併指令

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 進階

Octopus 合併結果

四個開發分支示意:main、ingestion、transform、load。這三個分支在第一個提交後自 main 分岔,各自多一個提交。main 有五個提交,包含其他分支的提交。最後的合併提交物件有四個父節點:main 先前的最新提交,以及 ingest、transform、load 的最新提交。

Git 進階

重點整理

Squash 合併

  • 歷史更精簡,將多個提交合為一個
  • 需要乾淨、簡化歷史時使用
    git merge --squash <source_branch>
    

Octopus 合併

  • 保留分支結構
  • 同時合併多個分支
  • 有效整合多個平行開發
    git merge -s octopus <branch 1> <branch 2> <branch 3>
    
Git 進階

一起來練習吧!

Git 進階

Preparing Video For Download...