Git WindowsLinuxmacOS

Git: submodule показывает новый коммит без изменений файлов

  • Обновлено
  • Чтение ≈ 4 минуты

Краткий ответ

Подмодуль Git — это отдельный репозиторий внутри проекта. Родитель хранит не все его файлы, а ссылку на конкретный коммит (gitlink). Поэтому после переключения ветки или обновления подмодуля родитель может показать modified: libs/example (new commits), даже если обычные git diff внутри подмодуля не видят незакоммиченных строк.

В этой статье
  1. Что означает проблема
  2. Как отличить причины
  3. Пошаговая диагностика и решение
  4. Команды для проверки и исправления
  5. Как проверить результат и что делать, если не помогло

#Что означает проблема

Подмодуль Git — это отдельный репозиторий внутри проекта. Родитель хранит не все его файлы, а ссылку на конкретный коммит (gitlink). Поэтому после переключения ветки или обновления подмодуля родитель может показать modified: libs/example (new commits), даже если обычные git diff внутри подмодуля не видят незакоммиченных строк.

#Как отличить причины

Возможная причинаКак узнатьЧто делать
Подмодуль находится на другом коммитеВнешний инструмент или ручной checkout передвинул HEAD подмодуля.git submodule status выводит + перед SHA; --cached показывает другой.Сравнить два SHA, затем решить, какой нужен.
Родительский проект ожидает конкретную версиюПроверенный коммит подмодуля уже записан в текущем коммите основного проекта.git submodule status --cached показывает эталон, а HEAD — другую версию.После копии изменений выполнить штатное submodule update.
Рабочая директория подмодуля измененаПомимо нового SHA есть незакоммиченные или неотслеживаемые файлы внутри подмодуля.git -C libs/example status --short выводит M или ??.Сохранить работу отдельно, не скрывать её настройкой ignore.

#Пошаговая диагностика и решение

  1. Проверьте состояние родительского проектаОткройте корень проекта в VS Code → «Терминал» → «Создать терминал». Запустите git status -sb и git submodule status. Найдите путь проблемного подмодуля, например libs/example. Символ + перед коммитом означает, что проверенный сейчас коммит подмодуля не совпадает с записанным в индексе родительского проекта; - означает неинициализированный подмодуль, U — конфликт. Перед остальными командами выполните git --version: в ответ должна появиться установленная версия Git. Если терминал сообщает, что git не найден, проверьте установку Git и доступность команды в этом терминале; не продолжайте операции наугад.
  2. Сравните ожидаемую и текущую версииЗапустите git submodule status --cached и git submodule status. В первой команде показывается зафиксированный в индексе SHA, во второй — фактически проверенный. Сравните путь и хеши посимвольно. Никакие файлы эти команды не меняют. Если SHA одинаковы, ищите незакоммиченные файлы, другую вложенную папку или изменения только в рабочем дереве.
  3. Узнайте, нет ли локальной работы внутри подмодуляОткройте папку подмодуля в проводнике VS Code или выполните git -C libs/example status -sb, заменив libs/example на фактический относительный путь. Если показаны modified, untracked или собственные локальные коммиты, сохраните их в отдельной ветке этого подмодуля и копии; не выполняйте git submodule update --force и не очищайте папку. Если статус чистый, переходите к сравнению версий.
  4. Посмотрите различия коммитов вместо различий файловВ родительском репозитории выполните git diff --submodule=log -- libs/example и git submodule summary -- libs/example. Вы увидите диапазон коммитов либо краткую сводку. Если diff пуст, но статус сообщает о новом коммите, проверьте, не было ли изменение уже добавлено в индекс: git diff --cached --submodule=log -- libs/example.
  5. Если другой коммит подмодуля оказался случайным, верните ожидаемыйТОЛЬКО после проверки, что внутри подмодуля нет несохранённых файлов или уникальных незакреплённых коммитов, выполните в корне родительского проекта git submodule update --init -- libs/example. Команда получает или выбирает коммит, записанный в родительском проекте, и может изменить файлы внутри подмодуля. Если нужный коммит отсутствует на сервере, не выбирайте другой случайный — попросите автора предоставить его.
  6. Если новая версия подмодуля нужна проекту, сохраните изменение указателяВначале подтвердите с командой, что новый коммит подмодуля действительно опубликован в доступном удалённом хранилище и проходит тесты. После этого в корне родительского проекта выполните git add -- libs/example, посмотрите git diff --cached --submodule=log и создайте коммит изменения указателя. Обычный git add подмодуля НЕ отправляет его локальный коммит на сервер подмодуля; его нужно публиковать в собственном репозитории отдельно.
  7. Проверяйте и собирайте проект с закреплённым SHAПосле решения выполните git status -sb, git submodule status --cached и git submodule status. Хеши должны совпадать, если вы вернули зафиксированную версию. Если новая версия была целенаправленно записана в индекс, после коммита и повторной проверки её хеш должен быть закреплён в основном проекте. Затем запустите штатные тесты приложения.

#Команды для проверки и исправления

Linux · Терминал (Bash)Команда
Все три команды читают состояние родительского проекта. --cached показывает записанный в индексе коммит подмодуля, а не проверенный в файловой системе.
git status -sb
git submodule status
git submodule status --cached
Linux · Терминал (Bash)Команда
Пример пути libs/example нужно заменить своим в обеих командах. -C запускает Git внутри указанной папки, не меняя ваш текущий каталог.
git -C libs/example status -sb
git diff --submodule=log -- libs/example
Linux · Терминал (Bash)С осторожностью
Запускайте только после копии данных и проверки отсутствия важной локальной работы в подмодуле: команда меняет его рабочие файлы на коммит из родительского репозитория. Замените путь.
git submodule update --init -- libs/example

Команда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.

Linux · Терминал (Bash)С осторожностью
Только для осознанного обновления указателя подмодуля, когда новый SHA уже доступен сотрудникам. Команды выполняются последовательно.
git add -- libs/example
git diff --cached --submodule=log -- libs/example

Команда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.

#Как проверить результат и что делать, если не помогло

Нормальное состояние: git submodule status не содержит + для непреднамеренно изменённых подмодулей, а нужный SHA закреплён коммитом родительского проекта. Если восстановление невозможно из-за отсутствующего коммита на сервере, запросите у автора подмодуля публикацию нужного SHA — не подменяйте его автоматически.

Источники и обновления

Последнее обновление статьи: 2 ноября 2026. Версии программ и интерфейсы меняются — если шаги не совпадают с вашей версией, сверяйтесь с документацией производителя.