🕌

大規模なコード変更を小さなPRに分割するテクニック

2024/11/27に公開

すでに多くの変更を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