保存の競合が発生する理由
保存がブロックされることほど、コーディングのフローを乱すものはありません。Ctrl+Sを押したとき、いつもの素早い反応の代わりに、右下に通知が表示されることがあります。これはディスク上のファイルの方が新しいことを示しています。これはバグではなく、安全装置です。
VS Codeはファイルを開いたときに「スナップショット」を保持します。未保存の編集がある間に、バックグラウンドプロセスや他の誰かがハードドライブ上のそのファイルを変更すると、タイムスタンプが一致しなくなります。まだ確認していない作業を誤って上書きしてしまわないよう、VS Codeは保存プロセスを停止し、ユーザーに判断を仰ぎます。
主な原因
多くの場合、このエラーの原因は明確です。通常、以下の4つのシナリオのいずれかが原因です。
- Gitの操作: ファイルを開いたまま、外部ターミナルで最新の変更をプル(
git pull)したり、ブランチを切り替えたりした場合。 - ツールの自動実行:
huskyのpre-commitフックや、外部のprettier --writeコマンドなどのバックグラウンドスクリプトがコードを自動修正した場合。 - クラウドの同期遅延: DropboxやOneDriveがチームメンバーからの更新を同期し、OSから見てローカルバージョンが「古く」なった場合。
- 重複インスタンス: 2つの異なるVS Codeウィンドウ、またはVimなどの別のエディタで同じプロジェクトを開いている場合。
ステップバイステップの解決策
方法1:比較ツールを使用する(最も推奨)
ディスク上で何が変更されたか確信が持てない場合に使用します。両方の変更を確認することで、コードの消失を防げます。
- エラー通知のCompare(比較)をクリックします。
- VS Codeが左右に並んだ差分(Diff)ビューを表示します。左側にはディスク上のファイル(変更された内容)、右側には現在のバージョン(作業中の内容)が表示されます。
- 各行を確認します。左側に必要な関数などがあれば、右側にコピーします。
- 右側の内容が完成したら、上部のアクションバーにあるOverwrite(上書き)をクリックします。
方法2:強制的に上書きする(最も早い)
現在のエディタの内容が「正解」であると確信している場合にのみ行ってください。
- 通知内にあるOverwrite(上書き)ボタンを探します。
- これを選択すると、ハードドライブ上のバージョンが破棄され、現在のバッファの内容に置き換わります。外部で行われた変更は永久に失われます。
方法3:変更を元に戻す
ローカルでの編集が不要で、ディスク上のファイルの方が正しいと判断した場合に選択します。
- Revert(元に戻す)をクリックします。
- VS Codeは未保存の作業を破棄し、ディスクからファイルを再読み込みします。**注意:**この操作は「元に戻す」(Ctrl+Z)ことができないため、実行前に必ず確認してください。
設定のカスタマイズ
このエラーが頻繁に発生する場合、ワークフローがVS Codeのデフォルトの動作と衝突している可能性があります。settings.jsonでエディタの反応を変更できます。
競合解決の戦略を変更する
設定でSave Conflict Resolutionを検索してください。デフォルトはaskUser(ユーザーに確認)です。これをoverwriteFileOnDiskに変更すると警告は出なくなりますが、保存時に外部の変更を自動的に上書きするようになります。
// settings.json
"files.saveConflictResolution": "askUser" // 安全のためこのままにすることを推奨
自動保存を有効にする
競合は、ファイルを長時間未保存のままにしておくことで発生しやすくなります。タブを切り替えたときに自動保存するように設定することで、そのリスクを軽減できます。
// settings.json
"files.autoSave": "onFocusChange"
予防のためのプロのヒント
ワークスペースを整理された状態に保つには、ツールをエディタ内に統合しましょう。Prettierを使用している場合は、ターミナルのウォッチャーを実行する代わりにVS Code拡張機能をインストールしてください。これにより拡張機能がエディタと直接通信し、タイムスタンプの不一致を防げます。また、ターミナルで大きなGitコマンドを実行する前に、すべてのファイルを保存(ファイル > すべて保存)する習慣をつけましょう。これにより、ディスクとエディタを完全に同期させることができます。

