Tengo un submódulo git en mi repositorio principal de git. Según tengo entendido, el repositorio principal almacena un valor SHA (en algún lugar ...), apuntando a la confirmación específica del submódulo al que está "vinculado".
Entré en mi submódulo y escribí git checkout some_other_branch
. No tengo idea de qué compromiso vengo.
Me gustaría revertir ese puntero para que el repositorio principal y el submódulo estén sincronizados nuevamente.
Mi primer instinto (probablemente ingenuo) fue decir git reset --hard
: eso parece funcionar para todo lo demás. Para mi sorpresa, no funcionó para este escenario.
Entonces descubrí que puedo escribir git diff
, anotar la ID de SHA que solía tener el puntero del submódulo, y luego dirigirme al submódulo y git checkout [SHA ID]
... ¿pero seguramente debe haber una manera más fácil?
Como todavía estoy aprendiendo sobre los submódulos git, siéntase libre de corregir mi terminología si hay palabras para conceptos que no conozco.
fuente
--init
. Sin él, los submódulos permanecerían en un estado con(new commits)
. Aunque mis submódulos ya estaban inicializados.--init
opción es crucial en todo esto. Se me solicitó el nombre de usuario y la contraseña ya que mis submódulos se clonaron a través de https. Fui a ambas carpetas y configuré los controles remotos para usar elssh
protocolo de pago.Para cambiar la confirmación a la que apunta un submódulo, debe verificar esa versión en el submódulo, luego volver al repositorio que contiene, agregar y confirmar ese cambio.
O, si desea que el submódulo esté en la versión a la que apunta el repositorio superior, hágalo
git submodule update --recursive
. Agregue--init
si acaba de clonar.Además,
git submodule
sin un comando de submódulo le mostrará la confirmación a la que está apuntando. Habrá un - o un + delante del commit si no está sincronizado.Si observa un árbol con un submódulo, puede ver que el submódulo está marcado
commit
como opuesto al resto que son manchas o árboles.para ver qué puntos de confirmación en particular se escriben en submódulos, puede:
luego puede ver el commit o cualquier otra cosa si lo desea pasando eso al registro, etc. (la
git-dir
opción en el nivel de comando git le permite omitir tener que bajar el CD al submódulo):fuente
Otro caso que acabo de encontrar es si hay un cambio sin etapas en el submódulo que desea descartar. git submodule update no eliminará ese cambio, ni git reset --hard en el directorio padre. Debe ir al directorio de submódulos y hacer un restablecimiento de git --hard. Entonces, si deseo descartar por completo los cambios no escalonados tanto en mi padre como en mi submódulo, hago lo siguiente:
En padre:
En submódulo:
fuente
Úselo
git ls-tree HEAD
en la carpeta "superproyecto" para ver en qué estado se encontraba originalmente su submódulo. Luego cambie al directorio de submódulos y usegit log --oneline --decorate
para ver en qué rama se encuentra el commit original. Finalmente,git checkout original-commit-branch
.Utilizando algunos directorios de prueba que configuré, así es como se verían los comandos:
El "superproyecto" muestra el submódulo sm2 en commit
f68bed6
pero sm2 tiene su HEAD en5b8d48f
. La confirmación de submódulof68bed6
tiene tres ramas que pueden usarse para pagar en el directorio de submódulos.fuente
La respuesta aquí de alguna manera no resolvió mi problema específico con el submódulo, por lo que en caso de que también te suceda, prueba lo siguiente ...
https://kalyanchakravarthy.net/blog/git-discard-submodule-changes/
fuente
Quería ignorar cualquier cambio en el submódulo y en mi módulo también
El siguiente comando me ayudó:
fuente