Git でマージやリベースの途中に git checkout や git 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 checkout や git 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つずつ解決していく必要があります。
「You have unmerged paths.」と表示されている間は、コンフリクトが未解決の状態です。この状態で
git checkout・git reset・git 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
- エディタでコンフリクトマーカーを削除し、残す内容を決定する
git add ファイル名で解決済みとしてマーク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)
- マージを取り消す:
git merge --abort - マージを続ける:コンフリクト解消 →
git add→git commit - リベースを取り消す:
git rebase --abort - リベースを続ける:コンフリクト解消 →
git add→git rebase --continue
よくある質問
git merge --abort でマージを中断してからブランチを切り替えてください。マージを中断せずに git checkout しようとすると「error: you need to resolve your current index first」が出ます。どうしても作業を保存したい場合は git stash でスタッシュする方法もありますが、コンフリクト中のスタッシュは操作が複雑になるため、--abort でリセットする方が確実です。git diff でコンフリクト箇所だけを確認することもできます。<<<<<<<・=======・>>>>>>>)がファイル内に残っている可能性があります。ファイルをもう一度開いてマーカーが完全に削除されているか確認してください。マーカーが残ったまま git add すると、Git はコンフリクントが解決されたと見なしますが、ファイルにマーカーが残った状態でコミットされてしまいます。Merge branch 'xxx' into yyy)で問題なければそのまま保存して終了してください。vim の場合は :wq、nano の場合は Ctrl+X → Y → Enter で保存・終了できます。エディタを使わずにコミットしたい場合は git commit -m "メッセージ" を使ってください。git add で解決済みとマークしてください。「deleted by them」や「deleted by us」は片方が削除・片方が変更している状態で、残すか削除するかを判断する必要があります。まとめ
- このエラーはコンフリクトが未解決のまま別の Git 操作をしようとしたときに発生する
git statusで「Unmerged paths」に表示されているファイルを確認する- コンフリクトファイルを開き、
<<<<<<<・=======・>>>>>>>マーカーを削除して内容を決定する git add ファイル名で解決済みとしてステージングし、git commitでマージ完了- マージ自体をやめたい場合は
git merge --abortでマージ前に戻る - リベース中の場合は
git rebase --abort(中断)またはgit rebase --continue(続行)を使う
