Gitのリベースが停滞状態(Limbo)に陥ったとき
フィーチャーブランチで作業を進め、mainと同期する準備が整いました。git rebase mainを実行しますが、履歴がクリーンになる代わりにGitが処理をブロックします。rebase-mergeディレクトリが既に存在するというエラーが表示され、技術的な行き詰まり状態になってしまいます。
これは、以前のリベースが完了しなかった場合に発生します。面倒なマージコンフリクトの途中で作業を中断したり、ターミナルがクラッシュしたり、コマンドの実行中にノートパソコンのバッテリーが切れたりした可能性があります。Gitは現在「ゾンビ」状態にあります。アクティブに作業していなくても、Gitはまだリベース中であると思い込んでいます。
fatal: It seems that there is already a rebase-merge directory, and I wonder if you are in the middle of another rebase. If that is the case, please try
git rebase (--continue | --abort | --skip)
If that is not the case, please
rm -fr ".git/rebase-merge"
根本原因:.gitフォルダに残った記録
リベースを開始すると、Gitは.gitフォルダ内に隠し一時ディレクトリを作成します。通常、名前は.git/rebase-mergeまたは.git/rebase-applyになります。このフォルダはスクラッチパッド(一時的な作業領域)として機能し、head-name、onto、orig-headなど、どこから開始してどこへ向かっているのかを追跡するための10〜15個のメタデータファイルを保存します。
リベースが完了すると、Gitはこのフォルダを自動的に削除します。しかし、プロセスが外部から強制終了されたり、リベースが「アクティブ」な状態で手動でブランチを削除したりすると、これらのファイルが残ってしまいます。新しくリベースを開始しようとすると、Gitはそのフォルダを見つけて、重要な作業を上書きしないように処理を停止します。
ステップ1:現在の状態を確認する
破壊的なコマンドを実行する前に、Gitが何が起きていると認識しているかを確認しましょう。次のコマンドを実行します。
git status
Gitがまだリベースの途中であると認識している場合、出力は以下のようになります。
rebase in progress; onto 1a2b3c4
You are currently rebasing branch 'feature-branch' on '1a2b3c4'.
(fix conflicts and then run "git rebase --continue")
(use "git rebase --abort" to check out the original branch)
ステップ2:最もクリーンな終了方法(git rebase --abort)
これを修正する最も安全な方法は、中断されたリベースを破棄するようGitに指示することです。これにより、リポジトリは問題が発生する前の元の状態に戻ります。以下を実行してください。
git rebase --abort
このコマンドはHEADをリセットし、.git/rebase-mergeディレクトリを消去します。通常、これでエラーは即座に解消され、99%のユーザーにとって最適な最初のステップとなります。
ステップ3:手動での削除(--abortが失敗する場合)
まれに、リポジトリの状態が非常に混乱し、git rebase --abortを実行しても「No rebase in progress(リベースは進行中ではありません)」というメッセージで失敗することがあります。しかし、「rebase-merge directory already exists」というエラーは消えません。この特定のシナリオでは、一時ディレクトリを手動で削除する必要があります。
LinuxまたはmacOSの場合:
rm -rf .git/rebase-merge
注:エラーメッセージにrebase-applyと明記されている場合は、代わりにそのフォルダを削除してください。
Windows(PowerShell)の場合:
Remove-Item -Recurse -Force .git/rebase-merge
Windows(コマンドプロンプト)の場合:
rd /s /q .git\rebase-merge
このディレクトリがなくなれば、Gitはリベースが進行中であると認識しなくなります。これで自由に新しいgit rebaseを開始できます。
ステップ4:確認
再試行する前に、環境がクリーンであることを確認します。
git statusを実行します。リベースの警告がなく、クリーンなブランチステータスが表示されるはずです。- リベースを再開します:
git rebase main。
よくある特殊なケース
1. 複数のワークツリー
git worktreeを使用している場合、別のフォルダで同じブランチに対してリベースを実行している可能性があります。Gitはデータの破損を防ぐためにこれらの操作をロックします。他のプロジェクトフォルダを確認して、そこでターミナルがコンフリクトの解消を待っていないか確認してください。
2. ロックされたファイル
Windowsでは、VS CodeやIntelliJなどのIDEが.gitフォルダ内のファイルをロックすることがあります。rm -rfが「Permission Denied(アクセス拒否)」エラーで失敗する場合は、エディタを閉じてからコマンドを再試行してください。ゾンビ状態のリベースが残り続けるには、ファイルが1つロックされているだけで十分です。
学んだ教訓
- 「X」ボタンで閉じない: コンフリクトの最中にターミナルをそのまま閉じないでください。完了させるか、明示的に
--abortを実行しましょう。 - 分かりやすいプロンプトを使用する: Oh My ZshやStarshipなどのシェルテーマは、コマンドラインに
(REBASE 1/5)のように表示できます。これにより、リベースの途中であることを忘れることがなくなります。 - 手動削除は安全:
rebase-mergeフォルダを削除しても、その特定のリベース試行の進行状況が破棄されるだけです。実際のコミットやソースコードは影響を受けません。

