【Git】コンフリクトを解消したのにpullできないときの原因と対策

【Git】コンフリクトを解消したのにpullできないときの原因と対策 Git

Gitでコンフリクトを解消してマージ作業を終えたはずなのに、再度git pullgit pushを試みるとエラーが出て進めないことがあります。
この状況は、コンフリクト解消後の手順抜けや、マージ状態が中途半端なまま残っていることが原因です。
本記事では、その仕組みと具体的な対処方法を解説します。

状況を再現するとどうなるか

例えばgit pullでリモートの変更を取り込んだときにコンフリクトが発生し、手動でファイルの衝突部分を修正します。
修正しただけでgit addgit commitを行わずに再びgit pullすると、次のようなエラーになります。

error: You have not concluded your merge (MERGE_HEAD exists).
hint: Please, commit your changes before merging.

このメッセージは「まだマージ処理が完了していないので続きの作業を終えてください」という意味です。

原因:マージやリベースの中間状態

コンフリクト解消後、GitはMERGE_HEADREBASE_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 pullgit fetchを実行し、正しい手順で取り込み直します。

解決方法3:リベース中のコンフリクトの場合

git pull --rebasegit 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 addgit commitまたはgit rebase --continueで作業を完了させるか、
必要に応じて--abortで中断してやり直しましょう。正しい手順を踏めば、履歴を壊さず安全に同期が取れるようになります。