「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 pull や git merge の途中でコンフリクトが発生すると、Git は .git/MERGE_HEAD というファイルを作って「まだマージ中だよ」と記録する。そのまま放置して次の git pull を打つと、上のエラーが出る。
コンフリクトを自分で解消しても、マージを「完了」させるコミットをしていない限り、このファイルは残り続ける。
状況の確認
まず git status を打つ。
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 する
必要なファイルだけをファイル名で指定する。ワイルドカードも使える。
git add *analysis_script*.ipynbこれで不要なファイルはステージングに乗らない。あとはコミットを打つだけ。
git commitエディタが開いたらそのまま保存して閉じる。マージコミットのメッセージは Git が自動で入れてくれる。
完了後に git status を確認すると、エラーは消えている。
On branch mainYour branch is ahead of 'origin/main' by 2 commits.最後にプッシュして終わり。
git pushそもそも git status がうるさくなる前に .gitignore を整える
解決後、毎回 git status を打つたびに大量の Untracked files が出るのはノイズになる。それ以上に、今回のように焦った場面でのミスを誘発する。
.gitignore に除外パターンを書いておくだけで防げる。
data/*.ipynb_checkpoints/configs/*.tomlGit の視界から外れていれば、git add . を打っても追加されない。
まとめ
MERGE_HEAD existsエラーはマージが未完了の状態で次の操作をしようとしたときに出るgit statusで状況を確認してから動くgit add .はUntracked filesも全部追加するので、巨大ファイルが混ざっているときは特に危険git add <ファイル名>でピンポイントにステージングしてgit commit- 根本対策は
.gitignoreを整えること