Коммитить node_modules в git проекта - безусловное зло. Помимо .gitignore часто бывает и .dockerignore и многие другие фильтры настроенные по умолчанию игнорировать все что лежит в ней. Специально для таких случаев npm умеет ссылаться на git напрямую, при необходимости на конкретный коммит. Таким образом если что-то нужно поправить - оптимально сделать форк в github, его же прописать себе в package.json, после чего желательно сделать pull request (или не делать если стыдно за код :) ) помимо этого npm умеет работать с приватными npm registry - к примеру proget, или даже с папка ми локальными файлами может быть источником пакета (npm link, используется при написании пакетов, для дебага в основном). По поводу глобальной папки node_modules - внимательное чтение доки по ней подскажет что любая папка выше уровнем, при наличии в ней node_modules вполне себе будет источником модулей (этот факт часто используют когда пишут несколько приложений на ноде в рамках одного репозитория, к примеру микросервисы на ноде. Тогда помимо персональных зависимостей у них могут быть ещё и глобальные зависимости уровня проекта)