「You have not concluded your merge」が出たとき、git add . を叩く前に一呼吸置いた話

結論から言う。MERGE_HEAD exists エラーが出たら、まず git status で何が起きているかを確認してから、必要なファイルだけを git add <ファイル名> で指定してコミットするだけで解決する。

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

ここで焦って git add . を打つと、数GBのデータファイルまで全部コミットする羽目になる。実際に自分がやりかけた。

なぜ止まるのか

git pullgit merge の途中でコンフリクトが発生すると、Git は .git/MERGE_HEAD というファイルを作って「まだマージ中だよ」と記録する。そのまま放置して次の git pull を打つと、上のエラーが出る。

コンフリクトを自分で解消しても、マージを「完了」させるコミットをしていない限り、このファイルは残り続ける。

状況の確認

まず git status を打つ。

Terminal window
git status

こんな出力が出るはずだ。

All conflicts fixed but you are still merging.
(use "git commit" to conclude merge)
Changes not staged for commit:
modified: src/analysis_script.ipynb
Untracked files:
.ipynb_checkpoints/
data/large_dataset_202X.zip
...(大量の設定ファイルやデータ群)

「コンフリクトは直したけどマージコミットがまだ」という状態。自分のケースではマージ中に analysis_script.ipynb を少し編集していた。

ここで問題になるのが Untracked files の一覧だ。エディタの自動保存ファイル、数GBになり得るデータのZIP、大量のローカル設定ファイルが並んでいる。

罠:思考停止の git add .

マージコミットのためにステージングが必要なのはわかっている。で、git add . を打ちたくなる気持ちもわかる。でも待て。

. は「今いるディレクトリ以下の全ファイル」を追加する。Untracked files に並んでいたあのZIPファイルも、設定ファイルも、全部。リモートリポジトリに数GBのデータが突っ込まれると、最悪プッシュ自体が通らなくなる。

対処:必要なものだけを狙い撃ちで add する

必要なファイルだけをファイル名で指定する。ワイルドカードも使える。

Terminal window
git add *analysis_script*.ipynb

これで不要なファイルはステージングに乗らない。あとはコミットを打つだけ。

Terminal window
git commit

エディタが開いたらそのまま保存して閉じる。マージコミットのメッセージは Git が自動で入れてくれる。

完了後に git status を確認すると、エラーは消えている。

On branch main
Your branch is ahead of 'origin/main' by 2 commits.

最後にプッシュして終わり。

Terminal window
git push

そもそも git status がうるさくなる前に .gitignore を整える

解決後、毎回 git status を打つたびに大量の Untracked files が出るのはノイズになる。それ以上に、今回のように焦った場面でのミスを誘発する。

.gitignore に除外パターンを書いておくだけで防げる。

.gitignore
data/
*.ipynb_checkpoints/
configs/*.toml

Git の視界から外れていれば、git add . を打っても追加されない。

まとめ

  • MERGE_HEAD exists エラーはマージが未完了の状態で次の操作をしようとしたときに出る
  • git status で状況を確認してから動く
  • git add .Untracked files も全部追加するので、巨大ファイルが混ざっているときは特に危険
  • git add <ファイル名> でピンポイントにステージングして git commit
  • 根本対策は .gitignore を整えること