パッケージロックファイルのコンフリクト処理

package-lock.json、yarn.lock、pnpm-lock.yamlのコンフリクトを解決します。手動解決の代わりに再生成戦略を学びます。

Common Patterns

詳細な説明

ロックファイルのコンフリクト

ロックファイルのコンフリクト(package-lock.jsonyarn.lockpnpm-lock.yaml)は、手動で解決しようとするべきではないという点でユニークです。これらのファイルは自動生成され、数千行を含み、手動で正しくマージすることがほぼ不可能な精密な内部構造を持っています。

ロックファイルがコンフリクトする理由

2つのブランチが異なるパッケージをインストールまたは更新すると、各ブランチが正確な依存関係バージョンと整合性ハッシュをピン留めする独自のロックファイルを生成します。Gitはこれらを同じ行への競合する変更として認識します。

正しい解決戦略

oursとtheirsから選ぶ通常のコンフリクトとは異なり、ロックファイルのコンフリクトは再生成で解決すべきです:

  1. どちらか一方を受け入れる(Accept TheirsでもAccept Oursでも — どちらでも構いません)。
  2. package.jsonが正しいことを確認: 実際の依存関係リストが希望する内容を反映していることを確認します(両ブランチの追加をマージ)。
  3. ロックファイルを削除して再生成します:
    • npm install(package-lock.json用)
    • yarn install(yarn.lock用)
    • pnpm install(pnpm-lock.yaml用)
  4. 再生成されたロックファイルをコミットします。

手動マージが失敗する理由

ロックファイルにはダウンロードされたパッケージの内容と正確に一致する必要がある整合性チェックサム(SHA-512ハッシュ)が含まれています。2つのロックファイルを手動で結合すると、ほぼ確実にチェックサムの不一致が生じ、インストール失敗につながります。

専用ツール

Yarnはyarn installを実行することでインストール中にロックファイルのコンフリクトを自動的に解決します。npm 7以降もどちらか一方を受け入れた後にnpm installを実行すると、ロックファイルのコンフリクトを適切に処理します。

ユースケース

3つの新しいパッケージを追加したブランチのマージ後、package-lock.jsonに何百もの競合行があります。手動で解決する代わりに、再生成戦略を使用します。

試してみる — Git Conflict Resolver

フルツールを開く