Eu tenho um submódulo git no meu repositório principal do git. Pelo que entendi, o repositório principal armazena um valor SHA (em algum lugar ...), apontando para o commit específico do submódulo ao qual ele está "vinculado".
Entrei no meu submódulo e digitei git checkout some_other_branch
. Eu não tenho idéia de qual compromisso eu vim.
Gostaria de reverter esse ponteiro para que o repositório principal e o submódulo estejam novamente sincronizados.
Meu primeiro instinto (provavelmente ingênuo) foi dizer git reset --hard
- isso parece funcionar para todo o resto. Para minha surpresa, não funcionou nesse cenário.
Então eu descobri que posso digitar git diff
, anote o SHA ID que o ponteiro do submódulo costumava ter, e então entre no submódulo e git checkout [SHA ID]
... mas certamente deve haver uma maneira mais fácil?
Como ainda estou aprendendo sobre os submódulos git, sinta-se à vontade para corrigir minha terminologia se houver palavras para conceitos que eu não conheça.
fonte
--init
. Sem ele, os submódulos permaneceriam em um estado com(new commits)
. Mesmo que meus submódulos já tenham sido inicializados.--init
opção é crucial em tudo isso. Eu estava recebendo um nome de usuário e senha solicitados desde que meus submódulos foram clonados em https. Entrei nas duas pastas e configurei os controles remotos para usar ossh
protocolo para checkout.Para alterar a confirmação para a qual um submódulo aponta, é necessário fazer check-out dessa versão no submódulo, voltar ao repositório que contém, adicionar e confirmar essa alteração.
Ou, se você quiser que o submódulo esteja na versão para a qual o repositório superior aponta, faça
git submodule update --recursive
. Adicione--init
se você acabou de clonar.Além disso,
git submodule
sem um comando submodule, será mostrado o commit para o qual você está apontando. Haverá um - ou um + na frente do commit, se ele não estiver sincronizado.Se você olhar para uma árvore com um submódulo, poderá ver que o submódulo está marcado como um
commit
ao contrário do resto que são blobs ou árvores.para ver o que uma confirmação específica aponta para submódulos, você pode:
você pode ver o commit ou qualquer outra coisa, se desejar, passando isso para o log, etc (a
git-dir
opção no nível do comando git permite que você pule a necessidade de fazer o cd no submodule):fonte
Outro caso em que acabei de encontrar é se há uma mudança sem estágio no submódulo que você deseja descartar. A atualização do sub-módulo git não removerá essa alteração, nem o git reset --hard no diretório pai. Você precisa ir para o diretório do submódulo e fazer um git reset --hard. Portanto, se eu quiser descartar totalmente as alterações não faseadas no pai e no submódulo, faça o seguinte:
No pai:
No submódulo:
fonte
Use
git ls-tree HEAD
na pasta "superprojeto" para ver em que commit seu submódulo estava originalmente. Em seguida, mude para o diretório do submódulo e usegit log --oneline --decorate
para ver em qual filial o commit original está. Finalmentegit checkout original-commit-branch
.Usando alguns diretórios de teste que eu configurei, aqui está a aparência dos comandos:
O "superprojeto" mostra o submódulo sm2 no commit,
f68bed6
mas o sm2 tem seu HEAD em5b8d48f
. O commit do submódulof68bed6
possui três ramificações que podem ser usadas para checkout no diretório do submódulo.fonte
De alguma forma, a resposta aqui não resolveu meu problema específico com o submódulo. Caso isso aconteça com você, tente o seguinte ...
https://kalyanchakravarthy.net/blog/git-discard-submodule-changes/
fonte
Eu queria desconsiderar quaisquer alterações no submódulo e no meu módulo também
O comando abaixo me ajudou:
fonte