大規模なコード変更を小さなPRに分割するテクニック
すでに多くの変更を1つのブランチにコミットしてしまった場合でも、それを分解し、小さなPRに分割することが可能です。
本記事では、その手順を詳しく説明します。
1. 現在の状況を確認する
まず、現在のブランチにどのようなコミットがあるか確認します。
git log --oneline
最新のコミットにすべての変更が含まれている場合は、次のステップに進みます。
2. 最新のコミットをリセットする
最新のコミットを解除して変更をステージングエリアに戻します。--soft
オプションを使うことで、作業ディレクトリの変更はそのまま残ります。
git reset --soft [のちのちのマージ先ブランチ]
注釈
-
--soft
:コミットを解除し、変更をインデックスに戻します。
3. 変更を分割してステージングする
次に、git add -p
を使って変更を小さな単位でステージングします。
git add -p
プロンプトの操作方法:
コマンド | 動作 |
---|---|
y |
この変更をステージングする |
n |
この変更をスキップする |
q |
残りの変更をすべてスキップする |
s |
現在の変更をさらに細かく分割する(スプリット) |
4. 小さなコミットを作成
ステージングした内容をコミットします。
これを繰り返すことで、大規模な変更を小さなコミットに分割します。
git commit -m "feat: add feature xxx"
5. 変更をリモートに反映する
リモートリポジトリに既にプッシュ済みのブランチの場合、分割した履歴を上書きする必要があります。
この場合、--force-with-lease
オプションを使って安全に上書きします。
git push --force-with-lease origin feature/large-update
注釈
-
--force-with-lease
:リモートの最新状態を確認し、他の人が変更していない場合のみ強制的にプッシュします。
6. PRを作成する
分割が完了したブランチをリモートリポジトリに反映したらPRを作成します。
7. 別ブランチで同じ手順を繰り返す
1つ目のPRが完了したら、次の新しいブランチを作成し、同じ手順で作業を進めます。
以下はその流れです。
a. 新しいブランチ作成
現在の状態から別ブランチへ切り替えます。
git checkout -b feature/next-small-pr
b. 残りの変更から再度ステージング
未処理の変更について再び git add -p
を使用し、小さく分割してステージングします。
git add -p
c. コミットとプッシュ
適切な単位でコミットし、新しいブランチとしてリモートへプッシュします。
今回のブランチでは git reset
したわけではないので、普通の git push
で問題ないです。
git commit -m "Refactor module Y"
git push origin feature/next-small-pr
d. 次のPR作成
新しいブランチからPRを作成しレビュー依頼を出します。
この手順を必要な数だけ繰り返すことで、大規模なコード変更全体がいくつかの小さなPRとして整理されます。
全体の流れをまとめた表
ステップ | コマンド例 | 説明 |
---|---|---|
現在の状況確認 | git log --oneline |
現在のコミット履歴を確認します。 |
リセット | git reset --soft [のちのちのマージ先ブランチ] |
そのブランチのコミットをすべて解除して変更をステージングエリアに戻します。 |
変更を分割してステージング | git add -p |
対話的に変更を選択し、細かく分割します。 |
リモートに反映 | git push --force-with-lease origin feature/large-update |
履歴を上書きし、リモートに反映します。 |
新しいブランチ作成 | git checkout -b feature/next-small-pr |
次回用に新しいブランチで作業開始。 |
注意点
-
強制プッシュは慎重に
--force-with-lease
を使用することで、他人の変更上書きリスクは軽減できますが、必ず最新状態で実行してください。 -
小さく分割しすぎない
意味ある単位で分割することが重要です。「1つの論理的まとまり」を基準としてください。
これで、すでに多くの変更が1つのコミットにまとまってしまった場合でも、安全かつ効率的に小さなPRに分割できます!
ぜひ試してみてください。
Discussion