Isso é o que aconteceu:
Eu tenho um ramo A. No ramo, o AI cometeu várias alterações. Como eu não estava satisfeito com o código, verifiquei o commit anterior no ramo A. Fiz várias alterações e o comprometi no ramo A. Agora, não consigo encontrar esse commit em nenhum lugar. Perdi esse código?
git reset
melhor do quegit checkout
?HEAD
e o ramo A permaneceria no commit anterior. Exatamente quais comandos você executou?Respostas:
O antigo commit ainda está no reflog.
Isso mostrará uma lista de confirmações, e a confirmação "perdida" deve estar lá. Você pode transformá-lo em uma nova ramificação. Por exemplo, se o SHA-1 for ba5a739, você poderá criar uma nova ramificação denominada "nova ramificação" na confirmação antiga com:
Observe que as confirmações "perdidas" serão excluídas quando o banco de dados for removido.
fonte
git cherry-pick [SHA]
para mover a cometer em um ramo existente no caso de você cometeu acidentalmente enquanto no estado cabeça destacadaprune
excluiria também confirmações desanexadas que estão sendo referenciadas em mensagens de confirmação? Ou isso os torna acessíveis ?Seus commits ainda estão disponíveis no reflog, como já indicado. Além das outras respostas, aqui está uma maneira de assumir o controle HEAD desanexado diretamente em sua ramificação atual , sem criar e mesclar uma nova ramificação:
Procure os hashes SHA-1 dos commits que você fez no estado HEAD desanexado com
Em seguida, execute, com todos os hashes de confirmação ordenados do mais antigo para o mais recente:
Por exemplo, se eu tivesse apenas um, fornecido no formato de hash "primeiros 7 caracteres":
Isso criará novas confirmações para sua ramificação atual, uma confirmação por hash desanexado-HEAD-commit que você mencionou no comando. Ele também assume as mensagens de confirmação originais.
fonte
Você pode encontrar confirmações perdidas (dangling) com o seguinte comando:
Observe que, se o seu cabeçalho atual estiver comprometido, ele não será listado como perdido.
Você pode encontrar mais informações em git-fsck (1) Página do manual
Em seguida, você pode criar ramificação nesse commit perdido:
fonte
A linguagem Git para o estado do seu diretório de trabalho é uma " CABEÇA desanexada ". Aqui está outro lugar que
git reflog
faz a economia.Se eu tentar fazer checkout de um ramo diferente, o git-1.7.5.1 dará uma sugestão útil.
fonte
Você não o perdeu, o Git ainda mantém uma cópia (mas atualmente é inacessível por qualquer cabeçalho de ramificação). Você pode encontrar sua confirmação ausente usando o
git reflog
comando O reflog monitora as posições históricas de uma cabeça de ramificação e você pode usá-lo para encontrar coisas que a cabeça de ramificação estava apontando anteriormente.fonte
Siga estas etapas para vincular sua cabeça desanexada ao repositório git
git checkout "your branch with path but without remote name"
por exemplo, se o nome remoto for origem e o nome do ramo for
bugfix/somebranch
usadogit checkout bugfix/somebranch
git reflog
obtenha os SHA de confirmação listados em sua lista de confirmação do ramo desanexado.git cherry-pick "commit hash1" "commit hash2" "commit hash3"
git push
TUDO PRONTO!!
fonte
No Sourcetree, descobri que o git reflog não funcionava, então descobri como fazer isso usando a GUI.
Primeiro, tente encontrar o commit "perdido" procurando uma mensagem no Histórico de Comandos (exibição: Mostrar Saída de Comando). Esperamos que esteja no comando "Switching Branch" após a confirmação que você perdeu e você verá o comentário de confirmação com um ID de confirmação 1234567.
Leve esse Commit ID para a próxima etapa.
Aperte o botão "Ramificação" na barra de ferramentas superior e você deve obter uma caixa de diálogo "Nova ramificação", onde você pode especificar uma certa confirmação. Coloque esse ID de confirmação lá, especifique um novo nome de filial, pressione Criar filial e você deverá obter uma nova filial com sua confirmação perdida!
Isso trouxe de volta algum trabalho perdido para mim!
fonte