Gitでコンフリクトを解消してマージ作業を終えたはずなのに、再度git pull
やgit push
を試みるとエラーが出て進めないことがあります。
この状況は、コンフリクト解消後の手順抜けや、マージ状態が中途半端なまま残っていることが原因です。
本記事では、その仕組みと具体的な対処方法を解説します。
状況を再現するとどうなるか
例えばgit pull
でリモートの変更を取り込んだときにコンフリクトが発生し、手動でファイルの衝突部分を修正します。
修正しただけでgit add
やgit commit
を行わずに再びgit pull
すると、次のようなエラーになります。
error: You have not concluded your merge (MERGE_HEAD exists).
hint: Please, commit your changes before merging.
このメッセージは「まだマージ処理が完了していないので続きの作業を終えてください」という意味です。
原因:マージやリベースの中間状態
コンフリクト解消後、GitはMERGE_HEAD
やREBASE_HEAD
といった一時ファイルを残し、「作業途中の状態」であることを記録します。
この状態では他のマージやpull操作ができず、まずは現在の作業を完了または中断する必要があります。
解決方法1:解消後にステージングとコミットを行う
修正が終わったファイルをgit add
でステージし、マージコミットを作成します。
これでマージ状態が解消され、次のpullやpushが可能になります。
# 修正済みファイルをステージ
git add path/to/conflicted_file
# マージコミットを作成
git commit
コミットメッセージは自動でマージ用のテンプレートが入るため、そのまま保存して問題ありません。
解決方法2:マージを中断してやり直す
修正が複雑でやり直したい場合や、意図しないpullをしてしまった場合は、中断して元の状態に戻せます。
# マージの中断
git merge --abort
# リベースの中断(rebase中の場合)
git rebase --abort
中断後は再度git pull
やgit fetch
を実行し、正しい手順で取り込み直します。
解決方法3:リベース中のコンフリクトの場合
git pull --rebase
やgit rebase
中にコンフリクトが起きた場合は、修正後にgit rebase --continue
で作業を進めます。
# 修正したファイルをステージ
git add path/to/conflicted_file
# リベースを続行
git rebase --continue
複数回コンフリクトが発生する場合もあり、そのたびに同様の手順で進めます。
解決方法4:作業ツリーの不要な競合マーカーを消す
コンフリクト解消が中途半端で、ファイル内に<<<<<<<
や=======
といった競合マーカーが残っていると、
Gitはまだ解消されていないと判断します。エディタやマージツールで正しい内容に修正し、再ステージします。
再発防止のポイント
コンフリクト解消後は必ず「修正 → ステージ → コミット」までを完了させることを習慣化しましょう。
また、pull時に不要なマージを避けたい場合は、git fetch
で差分を確認してからマージやリベースを行うのが安全です。
# 差分を確認してからマージ
git fetch origin
git diff main origin/main
git merge origin/main
まとめ
コンフリクトを解消したのにpullできない場合、多くはマージやリベースが未完了のまま残っていることが原因です。
git add
とgit commit
またはgit rebase --continue
で作業を完了させるか、
必要に応じて--abort
で中断してやり直しましょう。正しい手順を踏めば、履歴を壊さず安全に同期が取れるようになります。