Resgatando arquivos e confirmações de "sem ramificação" no git

11

Comecei a trabalhar em alguns arquivos que eu tinha em um submódulo git em outro projeto. No entanto, como era um sub-módulo git, ele nunca fez check-out de "master" e, em vez disso, apenas fez check-out da cabeça e colocou todos os arquivos na pasta em "no branch".

Agora que fiz algumas alterações acidentalmente nesses arquivos, percebi que estava trabalhando em um submódulo "sem ramificação" do meu projeto.

Como faço para colocar esses arquivos em uma ramificação (como mestre) para que eu possa resgatá-los?

Xeoncross
fonte

Respostas:

28

Você pode usar git reflogpara encontrar as confirmações "perdidas":

$ cd submodule_dir
$ git reflog          # Find the commit
$ git checkout master
$ git cherry-pick $SHA_OF_MISSING_CMMIT
mipadi
fonte
Sim, isso funcionou muito bem! exceto que fiz uma git merge $COMMIT_SHAvez que estava no outro ramo.
Xeoncross
3

O estado "sem ramificação" é chamado de HEAD desanexado. Isso é chamado porque a referência HEAD não está anexada a nenhum ramo, mas está apontando diretamente para uma confirmação. Para anexar HEAD a uma ramificação que aponta para o commit HEAD atual, use git checkout -b branchname.

Você pode atualizar com segurança uma ramificação existente para incluir as confirmações no HEAD com esta sequência:

git branch temp
git checkout branchname
git merge temp
git branch -d temp

Ou, de forma equivalente, usando a notação de reflog HEAD@{1}para evitar a criação da ramificação temporária:

git checkout branchname
git merge HEAD@{1}

Usar a ramificação temporária seria uma boa idéia se você não fizesse a mesclagem imediatamente.

Se você deseja sobrescrever uma ramificação existente para apontar para o commit em HEAD, você pode usar git branch -f branchname && git checkout branchname. Se a confirmação no HEAD não for baseada na ponta atual do nome da filial, isso resultará em uma alteração sem avanço rápido do nome da filial que você normalmente deseja evitar (é vista como um histórico de reescrita).

Chris Johnsen
fonte
Observe que esta resposta assume que o HEAD ainda está apontando para o último commit que não estava em uma ramificação. Se você moveu o HEAD desde então e só agora percebeu o que aconteceu, pode ser necessário procurar o commit perdido no reflog (consulte a resposta do mipadi).
LarsH
1

Para adicionar às respostas anteriores:

Enquanto você ainda está em um HEAD desanexado, você pode adicionar uma tag:

git tag <some-tag>

Isso adicionará uma marca ao commit, que o tornará visível em gitke em outras ferramentas.

dados
fonte