高度なブランチ統合:Git リベース

高度な Git

Amanda Crawford-Adamo

Software and Data Engineer

Git rebase

  • 変更を統合する方法
  • マージとは異なる
  • マージコミットを除去し履歴を簡潔化
  • 線形のコミットグラフで明瞭化

Git rebase コマンド:

git rebase <branch_name>
高度な Git

リベース例 - 前

データクリーンアップの feature ブランチと main ブランチの画像。feature ブランチは main の2つ目のコミット後に分岐。main にはブランチ作成後に2つのコミットが追加されている。

高度な Git

リベース手順

  1. data-cleanup feature ブランチをチェックアウト。
git checkout data-cleanup
  1. main を data-cleanup にリベース。
git rebase main
  • data-cleanup のコミットは main の最新コミットの後に再作成される
  • リベース後の data-cleanup コミットには新しいハッシュが付く

Note: 競合があれば手動で解決する必要があります。

高度な Git

リベース例 - 後

main にリベースされたデータクリーンアップブランチの画像。main の全コミットの後にデータクリーンアップのコミットが続く。main 自体は変化なし。

高度な Git

インタラクティブリベース

git rebase -i <commit_hash> 

機能

  • 複数コミットを細かく編集できる
  • エディタを開く

注意!

  • 公開ブランチでのリベースはワークフローを乱す恐れ
    • main のような公開ブランチで rebase は使わない
  • リベースの使用ルールをチームで決める
高度な 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

インタラクティブリベースエディタ

開いたエディタで、pick と fixup を使って履歴を編集します。

$ 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

インタラクティブリベース - 後

Before

$ 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

After

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

以下のコミットが1つに統合されました

  • abc1234
  • def5678
  • ghi9101
高度な Git

マージ vs リベース

画像は3つのグラフ(分岐後のブランチ、マージ後、リベース後)を示しています

Merge

  • 履歴とブランチ構造を保持
  • 並行開発の文脈を維持

Rebase

  • 対象ブランチの先頭にコミットを再適用
  • 線形の履歴を作成
  • 一部の文脈情報を失う
高度な Git

マージとリベースの使い分け

Merge

完了した機能を統合し、開発の文脈を保持する用途

Rebase

feature ブランチを main に追随させる、またはマージ前に履歴を整理する用途

覚えておくこと

  • Rebase は履歴を書き換える ― 慎重に使用
高度な Git

Passons à la pratique !

高度な Git

Preparing Video For Download...