長期間にわたるフィーチャー開発ブランチは、試行錯誤の結果として多数のWIPコミット(WIP: 途中経過
など)を含みがちです。本記事では、その元の開発履歴を完全に非破壊的に保持しつつ、最終的な開発成果(修正されたファイル)だけを抜き出し、Pull Request(PR)のために単一のクリーンなコミットとして再構築する体系的な手法を解説します。
典型的な課題パターン
レビュー負荷増大を引き起こす「コミットログ過多」
PRのソースブランチが以下のような状態の場合、レビュアーは最終的な差分ではなく、開発過程のすべてのコミットを追うことになり、レビューの焦点がぼやけます。
|
|
この課題を解決し、**「元の履歴は保持したいが、PRはクリーンにしたい」**という相反する要求を満たすのが、以下の手法です。
段階的クリーンアップ手法
ステップ1: コマンドの核心理解
この手法の鍵は、git checkout <source_branch> -- .
コマンドにあります。このコマンドは、ブランチの履歴を操作するのではなく、指定したブランチのファイル内容を現在のワーキングツリーに物理的に上書きすることで、履歴を分離します。
重要な確認ポイント:
|
|
これらの情報から、元のブランチのファイル内容だけが、現在のブランチの変更点として特定できることを確認できます。
ステップ2: ベースとなるブランチの準備
コミットを統合するための新しいブランチは、必ずPRのターゲット(例: main
)から分岐させ、クリーンな状態からスタートします。
|
|
ステップ3: 開発成果の非破壊的取り込み
元のブランチ (feature/old-dev
) のすべてのファイル内容を、現在いるブランチのワーキングツリーに上書きします。この操作は、コミット履歴を参照しません。
|
|
ステップ4: 単一コミットとして記録しプッシュ
ワーキングツリーにある変更全体をステージングし、単一の新しいコミットとして記録します。
|
|
よくある設定ミスと解決法
1. git merge --squash
との混同
症状: 「merge --squash
を使えば良いのでは?」という疑問
原因: merge --squash
もコミットを単一化しますが、ブランチ全体をマージする文脈で使われます。今回の手法は**「特定のファイル内容だけを取り出す」**というより汎用的なファイル操作コマンドを使用しており、元のブランチに影響を与えない分離性が特長です。
解決法:
checkout -- .
は、マージやリベースとは独立した、ファイル単位の操作です。元のブランチの変更がまだマージ段階ではない、あるいはレビュー前に完全に分離したい場合に最適です。
2. コミットログなしで変更を反映した後のコンフリクト
症状: feature/clean-pr-ready
を main
にマージする際にコンフリクトが発生する
原因: feature/clean-pr-ready
の作成中にベースブランチ (main
) が更新されたため。
解決法:
通常のGit操作と同様に、マージ前に最新の main
を取り込みます。
|
|
まとめ
git checkout <ブランチ> -- .
を用いたこの「成果凝縮ワークフロー」は、元のブランチの開発記録としての価値を損なうことなく、レビューアが確認すべき最終的な成果物の差分を最もクリーンな形で提供します。
Gitの柔軟性を最大限に活かしたこの手法は、長期開発プロジェクトやリファクタリングにおいて、PRの質とチームの生産性を向上させるための極めて有効なデバッグワークフローとなります。