✅ Objective
- Gitのcommit履歴の可読性と保守性を向上させるため,複数の小さな中間commitを1つの意味のあるまとまりに統合する
- コードレビューやメインブランチへのマージの前に,履歴をクリーンで理解しやすいものにする
🎯 Goal
📘 Guideline
Note
以下の条件を満たしていることが望ましいです:
- commitがまだリモートリポジトリ(GitHubなど)にプッシュされていない.
- ローカルブランチで作業している.
そうでない場合,git rebase
後に強制プッシュ(git push -f
)が必要になる可能性が高く,リモートの履歴が上書きされる可能性があります. プッシュ済みのcommitの履歴を書き換えると,コラボレーションに支障をきたす可能性があるため,注意して進めてください.
commitを統合するための手順
最近のcommitを確認
git log --oneline
対話型
git rebase
を開始最後の3つのcommitをsquashするには:
git rebase -i HEAD~3
構文
構文は以下の通りです:
git rebase -i <base-commit>
git rebase
先として指定できるベースcommitは1つだけですgit rebase -i <commit-id1> to <commit-id2>
のように動作するコマンドは実行できません
git rebase
指示リストを編集git rebase
を実行すると,以下のような出力が表示されます:pick abc123 fix typonew test case pick def456 add pick ghi789 finalize logic
commitIDは上から下へ = 古いものから新しいものへとソートされています.上記の例では,最初の行(
abc123
)がgit rebase
対象のcommitの中で最も古いものです.最新の2つのcommitを最も古いものにsquashする場合は,以下のように修正します:
pick abc123 fix typonew test case squash def456 add squash ghi789 finalize logic
commitメッセージを編集
新しいエディタ画面でcommitメッセージの結合を求められます.必要に応じて編集してください:
Finalize logic with test case - Fixed typo - Added test case - Finalized core logic
その後,保存して終了します.新しいcommit履歴を以下のコマンドで確認することをお勧めします:
git log --oneline
ヒント
git rebase
中に何か問題が発生した場合は,キャンセルできます:
git rebase --abort
Appendix: git rebase
で可能な操作は?
コマンド | 説明 |
---|---|
pick |
commitをそのまま使用(メッセージや内容の変更なし) |
reword |
commitの内容はそのままで,commitメッセージを編集 |
edit |
一時停止してcommitの修正を可能にする(ファイル,メッセージなど) |
squash |
このcommitを前のcommitと結合し,メッセージを編集 |
fixup |
squash と同様だが,このcommitのメッセージは破棄(前のメッセージを使用) |
drop |
このcommitを履歴から完全に削除 |