高度なブランチ統合: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. maindata-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

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

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

$ 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...