✅ 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
Note構文
構文は以下の通りです:
git rebase -i <base-commit>git rebase先として指定できるベースcommitは1つだけですgit rebase -i <commit-id1> to <commit-id2>のように動作するコマンドは実行できません
git rebase指示リストを編集git rebaseを実行すると,以下のような出力が表示されます:pick abc123 fix typo pick def456 add new test case pick ghi789 finalize logiccommitIDは上から下へ = 古いものから新しいものへとソートされています.上記の例では,最初の行(
abc123)がgit rebase対象のcommitの中で最も古いものです.最新の2つのcommitを最も古いものにsquashする場合は,以下のように修正します:
pick abc123 fix typo squash def456 add new test case squash ghi789 finalize logiccommitメッセージを編集
新しいエディタ画面でcommitメッセージの結合を求められます.必要に応じて編集してください:
Finalize logic with test case - Fixed typo - Added test case - Finalized core logicその後,保存して終了します.新しいcommit履歴を以下のコマンドで確認することをお勧めします:
git log --oneline
Noteヒント
git rebase中に何か問題が発生した場合は,キャンセルできます:
git rebase --abortAppendix: git rebaseで可能な操作は?
| コマンド | 説明 |
|---|---|
pick |
commitをそのまま使用(メッセージや内容の変更なし) |
reword |
commitの内容はそのままで,commitメッセージを編集 |
edit |
一時停止してcommitの修正を可能にする(ファイル,メッセージなど) |
squash |
このcommitを前のcommitと結合し,メッセージを編集 |
fixup |
squashと同様だが,このcommitのメッセージは破棄(前のメッセージを使用) |
drop |
このcommitを履歴から完全に削除 |