エラーメッセージ
マージの途中でコードをきれいに修正し、特定の1ファイルだけをコミットしようとしたとします。しかし、成功メッセージの代わりに、Gitから次のような制約(ロードブロック)を突きつけられます。
$ git commit -m "Fix login logic" src/auth.py
fatal: cannot do a partial commit during a merge.
なぜGitにブロックされるのか
Gitはマージ中、厳格なルールに従います。マージを開始すると(git merge または git pull を介して)、Gitは一時的な状態に入り、単一の「アトミック(不可分)」な結果を期待します。すべての競合を解決し、その結果全体を1つのマージコミットとして記録することを求めているのです。
通常のコミットとは異なり、マージコミットには2つの親があります。それは2つの異なる履歴の統合を意味します。そのため、Gitはその統合の*一部(part)*だけをコミットすることを拒否します。もし index.html に競合マーカーが残っている状態で auth.py だけをコミットしようとすると、「中途半端なマージ」状態が生まれてしまい、後に履歴が破損する原因になる可能性があるからです。
解決するための3つの方法
マージを完了させるか、制限を回避するか、あるいはやり直すか、状況に応じて3つの道があります。
解決策 1:確実な方法(すべてをコミットする)
これが標準的な手順です。競合を解決したら、プロジェクト全体が準備完了であることをGitに伝える必要があります。コミットコマンドで特定のファイル名を指定しないでください。
- 解決したすべてのファイルをステージングする(例:
main.pyやstyles.css):
git add .
- ステータスを確認する:
```
git status
*「All conflicts fixed but you are still merging.(すべての競合が解決されましたが、まだマージ中です)」*と表示されるはずです。
- ファイル名を指定せずにマージを完了させる:
git commit -m "Merge feature-login into main"
### 解決策 2:「Include」ショートカットを使用する (-i)
上級者の方で、すでにステージングしたファイルだけをコミットしたい場合は、`-i`(include)フラグを使用できます。これは、指定したファイルをステージングし、現在準備ができているものすべてをコミットするようGitに指示するものです。
git commit -i src/auth.py -m "Partial fix during merge"
**注意:** この方法は控えめに使用してください。他のファイルが保留中だったり壊れていたりする場合、実際にはマージプロセスは完了しません。これは一時的なしのぎであり、複雑なマージに対する恒久的な解決策ではありません。
### 解決策 3:脱出策(中止する)
物事がうまくいかないこともあります。マージが複雑すぎたり、マージを始める5分前にローカルの変更をコミットしておくべきだったと気づいたりした場合は、プロセス全体をキャンセルしましょう。
- マージプロセスを強制終了する:
```
git merge --abort
- ファイルはマージ開始前の状態に戻ります。これで、特定のファイルを通常通りコミットできます:
git commit src/auth.py -m "Save my work before merging"
- 再度マージを試行する:
```
git merge feature-branch
修正を確認する方法
これらの修正を適用したら、クイックチェックを行ってください:
git status
成功していれば、nothing to commit, working tree clean(コミットするものはありません、作業ツリーはクリーンです)と表示されます。まだマージ中の場合は、恐ろしい 「You have unmerged paths(未マージのパスがあります)」 という警告が表示されます。
履歴の結果を確認するには、最新の3つのエントリをチェックします:
git log --oneline -n 3
トラブルを避けるためのプロのヒント
- まずは整理整頓: 未コミットの変更がある状態でマージを開始しないでください。
git pullを実行する前にgit statusを確認し、作業ディレクトリが完全にクリーンであることを確認しましょう。 - ファイル名を指定しない: マージを完了させるときは、引数なしで
git commitと入力する習慣をつけましょう。Gitが自動的にエディタを立ち上げ、入力済みのマージメッセージを表示してくれるので、タイポ(打ち間違い)を防げます。 - こまめにステージング: 各ファイルの競合を修正するたびに、すぐに
git add [ファイル名]を実行しましょう。進捗を見失わずに済みます。

