У меня есть подмодуль git в моем основном репозитории git. Насколько я понимаю, в основном репо хранится значение SHA (где-то ...), указывающее на конкретный коммит подмодуля, с которым он «связан».
Я вошел в свой подмодуль и набрал git checkout some_other_branch
. Понятия не имею, из какого коммита я пришел.
Я хотел бы вернуть этот указатель, чтобы основное репо и подмодуль снова синхронизировались.
Моим первым (вероятно, наивным) инстинктом было сказать git reset --hard
- похоже, это работает для всего остального. К моему удивлению, для этого сценария это не сработало.
Итак, я понял, что могу печатать git diff
, запомнить идентификатор SHA, который использовался указателем подмодуля, а затем перейти к подмодулю и git checkout [SHA ID]
... но, конечно, должен быть более простой способ?
Поскольку я все еще изучаю подмодули git, пожалуйста, не стесняйтесь исправлять мою терминологию, если есть слова для понятий, которых я не знаю.
источник
--init
. Без него субмодули остались бы в состоянии с(new commits)
. Хотя мои подмодули уже были инициализированы.--init
опция во всем этом решающая. Мне предлагали ввести имя пользователя и пароль, так как мои подмодули были клонированы по https. Я вошел в обе папки и настроил пульты на использованиеssh
протокола для проверки.Чтобы изменить фиксацию, на которую указывает подмодуль, вам необходимо проверить эту версию в подмодуле, затем вернуться к содержащему репо, добавить и зафиксировать это изменение.
Или, если вы хотите, чтобы подмодуль был в версии, на которую указывает верхний репо, сделайте это
git submodule update --recursive
. Добавьте,--init
если вы только что клонировали.Кроме того,
git submodule
без подмодуля команда покажет вам фиксацию, на которую вы указываете. Перед коммитом будет - или +, если он не синхронизирован.Если вы посмотрите на дерево с подмодулем в нем, вы увидите, что подмодуль помечен как
commit
в отличие от остальных, которые являются каплями или деревьями.чтобы увидеть, какие точки фиксации связаны с подмодулями, вы можете:
затем вы можете увидеть фиксацию или что-то еще, если хотите, передав это в журнал и т.д. (
git-dir
опция на уровне команды git позволяет вам пропустить необходимость перехода к подмодулю с cd):источник
Другой случай, с которым я только что столкнулся, - это если есть неустановленное изменение в подмодуле, которое вы хотите отменить. Обновление подмодуля git не удалит это изменение, равно как и git reset --hard в родительском каталоге. Вам нужно перейти в каталог подмодуля и выполнить команду git reset --hard. Поэтому, если я хочу полностью отказаться от неустановленных изменений как в родительском, так и в подмодуле, я делаю следующее:
В родительском:
В подмодуле:
источник
Используйте
git ls-tree HEAD
в папке «superproject», чтобы увидеть, в каком коммите изначально находился ваш подмодуль. Затем перейдите в каталог подмодуля и используйте,git log --oneline --decorate
чтобы увидеть, в какой ветви находится исходный коммит. И, наконец,git checkout original-commit-branch
.Используя некоторые тестовые каталоги, которые я настроил, вот как могут выглядеть команды:
«Суперпроект» показывает подмодуль sm2 при фиксации,
f68bed6
но sm2 имеет его HEAD в5b8d48f
. У фиксации подмодуляf68bed6
есть три ветви, которые можно использовать для проверки в каталоге подмодуля.источник
Ответ здесь как-то не решил мою конкретную проблему с подмодулем, поэтому, если это произойдет и с вами, попробуйте следующее ...
https://kalyanchakravarthy.net/blog/git-discard-submodule-changes/
источник
Я хотел игнорировать любые изменения в подмодуле, а также в моем модуле
Следующая команда мне помогла:
источник