マージ種別を理解する

高度な Git

Amanda Crawford-Adamo

Software and Data Engineer

私は Amanda です

Amanda の写真

高度な Git

git merge とは?

Git merge コマンド:

git merge
  • あるブランチの変更を別のブランチへ統合
  • 2 ブランチの共通の基点を特定
  • 複数のマージ戦略を利用可能

2 本の道が合流し、2 台の車が同じ道に入る様子

高度な Git

ファストフォワード マージ

ファストフォワード マージとは?

  • 単純で直線的な履歴を維持
  • 小さな変更の短命ブランチに最適

$$

避けるべき場合

  • ブランチ履歴を保持したい
  • 長寿命ブランチでの複雑な機能開発
  • ブランチ間に競合があると即失敗
高度な Git

ファストフォワード(前)

2 つのブランチ(main と feature)。main にコミット2つ。feature は main の最新後に分岐し1コミット。

高度な Git

ファストフォワードの構文

Git のデフォルト: ファストフォワード マージ

git checkout main
git merge feature_branch

ファストフォワードを強制

git merge <branch> --ff-only

git checkout main
git merge feature_branch --ff-only
高度な Git

ファストフォワード(後)

2 つのブランチ(main と feature)。main にコミット3つ。feature は main の2個目後に分岐し1コミット。main の3個目は feature の最新のコピー。

高度な Git

リカーシブマージ

リカーシブマージとは?

  • 親が2つのマージコミットを作成
  • 履歴を完全に保持
  • 長寿命ブランチに最適
  • ブランチ構造を維持

$$

避けるべき場合

  • 単純で直線的な履歴を保ちたいとき
  • 迅速で小規模な変更
高度な Git

リカーシブマージ(前)

2 つのブランチ(main と feature)。main にコミット3つ。feature は main の1個目後に分岐し2コミット。

高度な Git

リカーシブの構文

リカーシブマージのコマンド:

git merge --no-ff <branch>

$ git checkout main
Switched to branch 'main'
Your branch is up to date with 'origin/main'.

$ git merge --no-ff feature_branch
Merge made by the 'recursive' strategy.
...
高度な Git

リカーシブマージ(後)

2 つのブランチ(main と feature)。main にコミット6つ。feature は main の最新後に分岐し2コミット。main の6コミットは両ブランチのコミットが交互。最新は2親を持つマージコミット(feature の最新と main の直前)。

高度な Git

まとめ

  • ファストフォワードは履歴を単純・直線に保つ
  • リカーシブは履歴の文脈を保持
  • 複雑な開発にはリカーシブが適する

ファストフォワードのコマンド

git merge <branch_name> # 既定
git merge --ff-only <branch_name> # FF を強制

リカーシブのコマンド

git merge --no-ff <branch_name>
高度な Git

練習してみましょう!

高度な Git

Preparing Video For Download...