【Git】error: you need to resolve your current index first の原因と解決方法|コンフリクト解消・abort・エディタでの修正まで

Git でマージやリベースの途中に git checkoutgit reset などを実行しようとすると、「error: you need to resolve your current index first」というエラーが表示されることがあります。

このエラーは コンフリクト(競合)が解決されていない状態 で別の操作をしようとしたときに発生します。この記事では、エラーの原因・git status での状況確認・コンフリクトの解消手順・マージを取り消す方法まで順を追って解説します。

この記事でわかること

  • 「error: you need to resolve your current index first」の意味と発生ケース
  • git status でコンフリクト状況を確認する方法
  • コンフリクトマーカー(<<<<<<<=======>>>>>>>)の読み方
  • エディタで編集 → git add → git commit でコンフリクトを解消する手順
  • git merge --abort でマージを丸ごと取り消す方法
  • git rebase --abort でリベースを取り消す方法
スポンサーリンク

エラーが発生するケース

このエラーは、主に以下の状況で発生します。

ケース1:マージ中にコンフリクトが起きた状態で別操作をしようとした

git merge を実行してコンフリクトが発生し、解決しないまま git checkoutgit reset などを実行するとこのエラーが出ます。

$ git merge feature/login
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.

# コンフリクトを解決しないまま checkout しようとすると...
$ git checkout main
error: you need to resolve your current index first

ケース2:コンフリクトが残ったままリセットしようとした

$ git reset HEAD
error: you need to resolve your current index first

ケース3:リベース中にコンフリクトが発生した

git rebase 実行中にコンフリクトが起きた場合も同様のエラーが発生します。git rebase --abort か、コンフリクトを解消して git rebase --continue を使います(後述)。

git status でコンフリクト状況を確認する

まず git status でどのファイルがコンフリクトしているか確認します。

git status

コンフリクトが発生している場合、以下のような出力になります。

On branch main
You have unmerged paths.
  (fix conflicts and run "git commit")
  (use "git merge --abort" to abort the merge)

Unmerged paths:
  (use "git add <file>..." to mark resolution)
        both modified:   index.html
        both modified:   style.css

no changes added to commit (use "git add" and/or "git commit -a")

「both modified」と表示されているファイルがコンフリクトしているファイルです。これらを1つずつ解決していく必要があります。

「Unmerged paths」が表示されたら要注意
「You have unmerged paths.」と表示されている間は、コンフリクトが未解決の状態です。この状態で git checkoutgit resetgit stash などを実行すると「error: you need to resolve your current index first」が出ます。

コンフリクトマーカーの読み方

コンフリクトが発生したファイルを開くと、以下のような コンフリクトマーカー が挿入されています。

<<<<<<< HEAD
この内容は現在のブランチ(マージ先)のもの
=======
この内容はマージしようとしているブランチのもの
>>>>>>> feature/login

各マーカーの意味は次のとおりです。

マーカー 意味
<<<<<<< HEAD 現在チェックアウトしているブランチ(マージ先)の内容
======= 区切り線。上が HEAD、下がマージしてきたブランチの内容
>>>>>>> feature/login マージしようとしているブランチ(feature/login)の内容
どちらの内容を残すか自分で決める
コンフリクトの解決は、マーカー行を含む不要な部分を削除して、残したい内容だけを残す作業です。「HEADの内容だけ残す」「マージ側の内容だけ残す」「両方をうまく組み合わせる」など、状況に応じて選択してください。

コンフリクトを解決する手順(3ステップ)

コンフリクトを解決してマージを完了させる手順を説明します。

ステップ1:エディタでコンフリクトマーカーを編集して解決

コンフリクトしているファイルをエディタで開き、マーカー部分を手動で編集します。

編集前(コンフリクトマーカーあり):

<<<<<<< HEAD
<h1>ようこそ</h1>
=======
<h1>Welcome</h1>
>>>>>>> feature/login

編集後(マーカーを削除して内容を決定):

<h1>ようこそ / Welcome</h1>
マーカー行(<<<<<<<=======>>>>>>>)は必ず削除すること
マーカー行が残ったままコミットすると、ファイルにマーカー文字列が残ってしまいます。編集後はファイル内を検索して、マーカーが残っていないか確認してください。

ステップ2:git add で解決済みとしてステージング

コンフリクトを解決したファイルを git add でステージングします。これが「このファイルのコンフリクトを解決した」という Git への通知になります。

# 特定のファイルをステージング
git add index.html
git add style.css

# すべての変更をまとめてステージング
git add .
# git status で確認
git status

# 出力例(すべて解決済みの場合)
# On branch main
# All conflicts fixed but you are still merging.
#   (use "git commit" to conclude merge)

「All conflicts fixed」と表示されればコンフリクトはすべて解決されています。

ステップ3:git commit でマージ完了

最後に git commit を実行してマージを完了させます。

# マージコミットを作成(メッセージは自動生成される)
git commit

# または -m でメッセージを指定
git commit -m "Merge branch 'feature/login' into main"
[main a1b2c3d] Merge branch 'feature/login' into main
コンフリクト解消の3ステップまとめ

  1. エディタでコンフリクトマーカーを削除し、残す内容を決定する
  2. git add ファイル名 で解決済みとしてマーク
  3. git commit でマージコミットを作成して完了

git merge –abort でマージを取り消す方法

コンフリクトを解決するのが難しい・一旦マージ自体をやめたい場合は、git merge --abort でマージ前の状態に戻せます。

# マージを取り消してマージ前の状態に戻す
git merge --abort
# 実行後 git status で確認
$ git status
On branch main
nothing to commit, working tree clean
git merge --abort が使えない場合
マージ開始前から変更があった場合、--abort が失敗することがあります。その場合は git merge --quit を試すか、git reset --hard HEAD でマージ前のコミットに強制リセットしてください。(reset --hard は未コミットの変更がすべて消えるため注意)

マージを完全に取り消してやり直したい場合は、【Git】マージの取り消し方法(merge –abort / reset)も参考にしてください。

git rebase 中のエラーの場合

git rebase 中にコンフリクトが発生した場合も同様のエラーが出ることがあります。リベースの場合は git rebase --abort または git rebase --continue を使います。

# リベースを取り消してリベース前の状態に戻す
git rebase --abort
# コンフリクトを解決して git add した後、リベースを続行する
git add 解決済みファイル
git rebase --continue
# リベース中の状態を確認
$ git status
interactive rebase in progress; onto a1b2c3d
You are currently rebasing branch 'feature/login' on 'a1b2c3d'.
  (fix conflicts and then run "git rebase --continue")
  (use "git rebase --skip" to skip this patch)
  (use "git rebase --abort" to check out the original branch)
merge と rebase の中断コマンド対応表

  • マージを取り消す:git merge --abort
  • マージを続ける:コンフリクト解消 → git addgit commit
  • リベースを取り消す:git rebase --abort
  • リベースを続ける:コンフリクト解消 → git addgit rebase --continue

よくある質問

Q. コンフリクトを解決する前に別のブランチに切り替えたい場合はどうすればいいですか?
A. まず git merge --abort でマージを中断してからブランチを切り替えてください。マージを中断せずに git checkout しようとすると「error: you need to resolve your current index first」が出ます。どうしても作業を保存したい場合は git stash でスタッシュする方法もありますが、コンフリクト中のスタッシュは操作が複雑になるため、--abort でリセットする方が確実です。
Q. コンフリクトしているファイルが多くて手動で確認するのが大変です。
A. VS Code や JetBrains IDE などのエディタには、コンフリクトを視覚的に解決する「マージエディタ」機能があります。「Accept Current Change」「Accept Incoming Change」「Accept Both Changes」のボタンで簡単に選択できます。また git diff でコンフリクト箇所だけを確認することもできます。
Q. git add したのに「Unmerged paths」が消えません。
A. コンフリクトマーカー(<<<<<<<=======>>>>>>>)がファイル内に残っている可能性があります。ファイルをもう一度開いてマーカーが完全に削除されているか確認してください。マーカーが残ったまま git add すると、Git はコンフリクントが解決されたと見なしますが、ファイルにマーカーが残った状態でコミットされてしまいます。
Q. コンフリクトを解決した後 git commit を実行したらエディタが開きました。
A. マージコミットのメッセージを編集するためのエディタ(通常 vim または nano)が開きます。デフォルトのメッセージ(Merge branch 'xxx' into yyy)で問題なければそのまま保存して終了してください。vim の場合は :wq、nano の場合は Ctrl+X → Y → Enter で保存・終了できます。エディタを使わずにコミットしたい場合は git commit -m "メッセージ" を使ってください。
Q. git status で確認したら「both modified」以外に「both added」「both deleted」なども表示されました。
A. コンフリクトにはいくつかの種類があります。「both modified」は両方のブランチで同じファイルを変更、「both added」は両方で同名のファイルを新規追加、「both deleted」は両方で同じファイルを削除しようとしている状態です。いずれもファイルの内容を確認して解決方針を決め、git add で解決済みとマークしてください。「deleted by them」や「deleted by us」は片方が削除・片方が変更している状態で、残すか削除するかを判断する必要があります。

まとめ

「error: you need to resolve your current index first」の解決まとめ

  • このエラーはコンフリクトが未解決のまま別の Git 操作をしようとしたときに発生する
  • git status で「Unmerged paths」に表示されているファイルを確認する
  • コンフリクトファイルを開き、<<<<<<<=======>>>>>>> マーカーを削除して内容を決定する
  • git add ファイル名 で解決済みとしてステージングし、git commit でマージ完了
  • マージ自体をやめたい場合は git merge --abort でマージ前に戻る
  • リベース中の場合は git rebase --abort(中断)または git rebase --continue(続行)を使う

あわせて読みたい