複雑なマージのシナリオ

高度な Git

Amanda Crawford-Adamo

Software and Data Engineer

フライト旅行データパイプラインのリポジトリ

フライト旅行データパイプラインのリポジトリ構成図。作業ディレクトリに etl.py、load.py、transform.py、ingest.py。data ディレクトリに flight_data.csv。git フォルダも表示。

高度な Git

Git の squash マージ

$$

機能

  • ターゲットブランチに新規コミットを1つ作成
  • ソースブランチの変更をすべて統合
    • 親が1つの通常コミットを追加(recursive と異なる)
  • 追加先はターゲットブランチ(feature ブランチではない)
    • ソースブランチの詳細な履歴は保持しない

$$

利点

  • 履歴がクリーンで直線的
  • 大きな機能のコードレビューが楽
  • 機能全体のリバートが容易
高度な Git

squash マージの例

data-cleanup ブランチが2つ目のコミット後に main から分岐。main に1コミット、data-cleanup に2コミット。

高度な Git

squash マージの手順

  1. main ブランチをチェックアウト

    $ git checkout main
    
  2. data-cleanup の変更を squash で1つにまとめる

    $ git merge --squash data-cleanup
    
  3. まとめた変更を main の履歴にコミット

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

squash マージの結果

2つのブランチ(main と data-cleanup)のグラフ。main に4つのコミット。feature ブランチは最新の main から分岐し、さらに1コミット。最新の main の単一親コミットに、data-cleanup の複数コミットを squash した内容が含まれる。

高度な Git

Git の Octopus マージ

$$

機能

  • 3本以上のブランチを同時にマージ
  • 複数の親をもつ1つのマージコミットを作成
  • ブランチ間で競合がない場合に最適

$$

利点

  • 複数の独立機能を一度に統合できる
  • 複数バージョンのリリースブランチを同期するのに有用
高度な Git

Octopus マージの例

4つの開発ブランチ(main、ingestion、transform、load)の図。ingestion・transform・load は最初のコミット後に main から分岐し各1コミット。main にも1コミット。

高度な 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 マージの結果

4つの開発ブランチ(main、ingestion、transform、load)の図。ingestion・transform・load は最初のコミット後に main から分岐し各1コミット。main には他ブランチのコミットを含む5コミット。最後のマージコミットは4つの親(main の直前最新、ingest・transform・load の各最新)をもつ。

高度な Git

まとめ

squash マージ

  • 履歴を簡素化。複数コミットを1つに集約
  • きれいな履歴にしたいときに使用
    git merge --squash <source_branch>
    

Octopus マージ

  • ブランチ構造を保持
  • 複数ブランチを同時にマージ
  • 並行開発を効率的に統合
    git merge -s octopus <branch 1> <branch 2> <branch 3>
    
高度な Git

練習しましょう!

高度な Git

Preparing Video For Download...