まず結論
node_modulesが大きいのは、自分で追加したパッケージだけでなく、そのパッケージが必要とする依存関係も入るためです。

直接依存と推移的依存
package.jsonに自分で書いたものを直接依存と呼びます。たとえばastroを追加すると、Astroが必要とする多くのパッケージも一緒に入ります。これが推移的依存です。
自分のアプリ
└─ astro(直接依存)
└─ 別のパッケージ(推移的依存)
複数のパッケージが同じ依存先を必要とすることもあります。版の条件が合えば共有され、合わなければ複数の版が必要になることがあります。
Gitに入れない理由
node_modulesはlockfileから再作成できます。ファイル数が多く環境差も出やすいため、通常は.gitignoreに入れ、package.jsonとlockfileを共有します。
壊れた時の確認
依存関係がおかしいと感じたら、まず使うパッケージマネージャーとlockfileを確認します。次に、プロジェクトのディレクトリで依存関係を入れ直します。別のプロジェクトやホームディレクトリを対象にしないよう、現在地を確認してから操作します。
pwd
npm ci
npm ciにはlockfileが必要です。日常の依存追加にはnpm installを使います。
まとめ
node_modulesは依存関係の展開結果です。直接依存だけを見て容量を判断せず、lockfileで再現し、Gitには通常含めません。