Se eu executar git branch -d XYZ
, existe uma maneira de recuperar a ramificação? Existe uma maneira de voltar como se eu não tivesse executado o comando delete branch?
git
branch
git-branch
prosseek
fonte
fonte
Respostas:
Sim, você deve conseguir
git reflog
encontrar o SHA1 para o commit na ponta do seu ramo excluído e, em seguida, apenasgit checkout [sha]
. E quando você estiver nessa submissão, poderágit checkout -b [branchname]
recriar a ramificação a partir daí.Os nossos agradecimentos a @Cascabel por esta versão condensada / one-liner.
Você pode fazer isso em uma etapa:
fonte
git checkout -b <branch> <sha>
.<sha>
. Por exemplo, como mencionado acima -git checkout -b <branch> <sha>
CMD+K
)git reflog --no-abbrev
para ver o total<sha>
que está sendo abreviado por padrão.git checkout remotes/origin/deleted_branch
.Na maioria das vezes, as confirmações inacessíveis estão no reflog. Portanto, a primeira coisa a tentar é olhar para o reflog usando o comando
git reflog
(que exibe o reflogHEAD
).Talvez algo mais fácil se a cometer fazia parte de um ramo específico ainda existente é usar o comando
git reflog name-of-my-branch
. Também funciona com um controle remoto, por exemplo, se você forçar o envio (conselhos adicionais: sempre prefiragit push --force-with-lease
que evite erros e seja mais recuperável).Se suas confirmações não estiverem no seu reflog (talvez porque excluídas por uma ferramenta de terceiros que não escreva no reflog), recuperei com êxito uma ramificação redefinindo minha ramificação para o sha da confirmação encontrada usando um comando como esse (ele cria um arquivo com todos os commits dangling):
Se você deve usá-lo mais de uma vez (ou quiser salvá-lo em algum lugar), também pode criar um alias com esse comando ...
e use-o com
git rescue
Para investigar confirmações encontradas, você pode exibir cada confirmação usando alguns comandos para procurá-las.
Para exibir os metadados de confirmação (autor, data de criação e mensagem de confirmação):
Para ver também as diferenças:
Depois de encontrar seu commit, crie um branch nesse commit com:
Para aqueles que estão no Windows e gostam de GUIs, você pode recuperar facilmente confirmações (e também arquivos temporários não confirmados) com GitExtensions usando o recurso
Repository
=>Git maintenance
=>Recover lost objects...
Um comando semelhante para recuperar facilmente arquivos temporários excluídos: https://stackoverflow.com/a/58853981/717372
fonte
Se você gosta de usar uma GUI, pode executar toda a operação com o gitk.
Isso permitirá que você veja o histórico de consolidação do ramo como se o ramo não tivesse sido excluído. Agora, basta clicar com o botão direito do mouse no commit mais recente do ramo e selecionar a opção de menu
Create new branch
.fonte
A melhor solução votada realmente é mais do que o solicitado:
ou
mova você para o novo ramo junto com todas as alterações recentes que você pode ter esquecido de confirmar. Esta pode não ser a sua intenção, especialmente quando está no "modo de pânico" depois de perder o ramo.
Uma solução mais limpa (e mais simples) parece ser a única opção (depois que você encontrou o
<sha>
comgit reflog
):Agora, nem sua ramificação atual nem as alterações não confirmadas são afetadas. Em vez disso, apenas uma nova ramificação será criada até o
<sha>
.Se não for a dica, ainda funcionará e você obterá uma ramificação mais curta, e poderá tentar novamente com o novo
<sha>
e o novo nome da ramificação até acertar.Por fim, você pode renomear o ramo restaurado com sucesso para o que foi nomeado ou qualquer outra coisa:
Escusado será dizer que a chave para o sucesso foi encontrar o commit certo
<sha>
, então nomeie seus commits com sabedoria :)fonte
Somando-se TFE resposta : há também a git-resurrect.sh script na
contrib/
área das fontes do Git (em repositório git.git), o que pode ajudá-lo.fonte
Eu usei os seguintes comandos para encontrar e recuperar minha ramificação excluída. Os primeiros passos são da descrição do gcb.
Agora procure o ID de confirmação do git (GIT-SHA) com base nos comentários de confirmação e use-o no comando abaixo. Faça o checkout de uma nova filial chamada NEW-BRANCH com o GIT-SHA encontrado anteriormente:
fonte
Se você não tem um reflog, por exemplo. porque você está trabalhando em um repositório vazio que não tem o reflog ativado e a confirmação que você deseja recuperar foi criada recentemente, outra opção é encontrar objetos de confirmação criados recentemente e examiná-los.
De dentro do
.git/objects
diretório, execute:Ele localiza todos os objetos (confirmações, arquivos, tags etc.) criados nas últimas 12 horas e os filtra para mostrar apenas confirmações. Verificá-las é um processo rápido.
Eu tentaria o script git-ressurect.sh mencionado na resposta de Jakub primeiro.
fonte
man find
: "-ctime n - o status do arquivo foi alterado pela última vez há * 24 horas." Portanto, também devemos mudar de 12 para 0,5 para ter o comportamento esperado das últimas 12 horas.Para usuários do GitHub sem o Git instalado:
Se você quiser restaurá-lo no site do GitHub , poderá usar a API deles para obter uma lista de eventos relacionados a repo:
Primeiro
encontre esses SHAs (confirmar hashes):
curl -i https://api.github.com/repos/PublicUser/PublicRepo/events
... ou para acordos privados:
curl -su YourUserName https://api.github.com/repos/YourUserName/YourProject/events
(será solicitada a senha do GitHub)
Próximo
• Vá para as ramificações e exclua essa.
• Na mesma página, sem recarregar , abra o DevTools, painel Rede. Agora prepare ...
• Clique em restaurar. Você notará uma nova "linha". Clique com o botão direito do mouse e selecione "Copiar como cURL" e salve este texto em algum editor.
• Anexar ao final da linha copiada de código, um presente:
-H "Cookie="
.Agora você deve obter algo como:
Passo final
PS
Sei que essa pode não ser a "solução mais simples" ou a "certa", mas é oferecida no caso de alguém achar útil.
fonte
git reflog
e, portanto, foi útil, por exemplo, ao excluir uma ramificação remota e perder o acesso ao computador que foi feito, para que não seja possível obter nada útil a frioreflog
. Observe que ao usar a autenticação OAuth ou de dois fatores no Github, ocurl
comando fica no formato:curl -u username:token https://api.github.com/user
oucurl -H "Authorization: token TOKEN" https://api.github.com/repos/USER_OR_ORG_NAME/REPO_NAME/events
Pelo meu entendimento, se o ramo a ser excluído pode ser alcançado por outro ramo, você pode excluí-lo com segurança usando
e seu trabalho não está perdido. Lembre-se de que um ramo não é um instantâneo, mas um ponteiro para um. Então, quando você exclui uma ramificação, exclui um ponteiro.
Você nem perderá o trabalho se excluir um ramo que não pode ser alcançado por outro. É claro que não será tão fácil quanto verificar o hash de confirmação, mas você ainda pode fazê-lo. É por isso que o Git não consegue excluir um ramo que não pode ser alcançado usando
-d
. Em vez disso, você tem que usarIsso faz parte de um vídeo obrigatório de Scott Chacon sobre o Git. Verifique o minuto 58:00 quando ele fala sobre galhos e como excluí-los.
Introdução ao Git com Scott Chacon do GitHub
fonte
reflog
são apenas um exagero.Certifique-se de executar tudo isso localmente e confirme se o seu repositório está no estado desejado antes de enviar para o Bitbucket Cloud. Também pode ser uma boa ideia clonar seu repo atual e testar essas soluções primeiro.
2.Para restaurar a ramificação, use:
Se você não conhece o 'sha' no topo da sua cabeça, pode:
Se seus commits não estão no seu reflog:
2. Você pode exibir cada confirmação usando um destes:
fonte
Para recuperar uma ramificação excluída, primeiro passe pelo histórico de reflog,
Onde n se refere ao último n confirma. Em seguida, encontre a cabeça adequada e crie um galho com essa cabeça.
fonte
Eu refiz uma ramificação do controle remoto para tentar limpar alguns commits que eu não queria e iria escolher os que eu queria. Claro que escrevi os SHAs errado ...
Aqui está como os encontrei (principalmente uma interface / interação mais fácil com base nas respostas aqui):
Primeiro, gere uma lista de confirmações soltas no seu log. Faça isso o mais rápido possível e pare de trabalhar, pois esses podem ser despejados pelo coletor de lixo.
Isso cria um
lost
arquivo com todas as confirmações que você precisará examinar. Para simplificar nossa vida, vamos cortar apenas o SHA:Agora você tem um
commits
arquivo com todas as confirmações que precisa procurar.Supondo que você esteja usando o Bash, a etapa final:
Isso mostrará as informações diff e commit de cada um deles. E espere você pressionar Enter. Agora anote todos os que você deseja e, em seguida, escolha-os. Depois de terminar, basta pressionar Ctrl-C.
fonte
GRANDE SIM
se você estiver usando o GIT, siga estas etapas simples https://confluence.atlassian.com/bbkb/how-to-restore-a-deleted-branch-765757540.html
se você estiver usando o smartgit e já enviar essa ramificação para a origem, localize essa ramificação e clique com o botão direito do mouse e faça o checkout
fonte
Primeiro, vá para git batch, a mudança para o seu projeto, como:
Todos vocês têm uma lista das alterações e o número de referência recebe o número de referência e, em seguida, efetua o checkout
no android studio ou no git betcha. outra solução, pegue o número de referência e vá para o android studio, clique em git branches e clique na etiqueta de checkout ou na revisão após o número de referência.
fonte
Adicionando à resposta do tfe, você pode se recuperar com esse processo mencionado, a menos que os commit não sejam coletados como lixo. A ramificação Git é simplesmente um ponteiro para um commit específico na árvore de commit. Mas se você excluir o ponteiro e as confirmações nesse ramo não forem mescladas com outro ramo existente, o git o tratará como confirmações pendentes e os removerá durante a coleta de lixo, que pode ser executada automaticamente periodicamente.
Se sua ramificação não foi mesclada a uma ramificação existente e se foi coletada com lixo, você perderá todas as confirmações até o ponto em que a ramificação foi bifurcada em uma ramificação existente.
fonte
Um problema relacionado: cheguei a esta página depois de pesquisar "como saber o que são ramificações excluídas".
Ao excluir muitos ramos antigos, senti que excluí por engano um dos ramos mais novos, mas não sabia o nome para recuperá-lo.
Para saber quais ramificações foram excluídas recentemente, faça o seguinte:
Se você for ao seu URL do Git, será algo assim:
Então você pode ver o feed do que é excluído e por quem, no passado recente.
fonte
Eu fiz isso no computador que eu excluo o ramo:
git reflog
resposta:
e eu recupero o ramo com este comando:
git checkout -b newBranchName 74b2383
fonte
Apenas usando
git reflog
não retornou osha
para mim. Apenas ocommit id
(que tem 8 caracteres e um sha é muito mais longo)Então eu usei
git reflog --no-abbrev
E então faça o mesmo como mencionado acima:
git checkout -b <branch> <sha>
fonte
SE você estiver usando o VSCode ... e você sincronizou sua filial com o servidor em algum momento antes de excluí-lo ...
Observe que git branch delete exclui apenas a cópia local, não a cópia no servidor. Primeiro, no painel Git (ícone git na barra de ferramentas esquerda), examine as ramificações e veja se sua ramificação ainda está lá em "origin / your_branch_name". Nesse caso, basta selecionar isso e você deverá recuperar seu código (sugira que você copie / cole / salve imediatamente localmente em outro lugar).
Se você não viu uma "origin / your_branch_name", instale a extensão GitLens. Isso permite que você vasculhe visualmente os repositórios do servidor e localize a cópia que sincronizou com o servidor. Se você possui vários repositórios, observe que pode ser necessário ter pelo menos um arquivo aberto no repositório desejado para fazer com que o repositório apareça no GitLens. Então:
Abra o painel GitLens
Expanda o repositório
Você deve ver uma lista de categorias: Ramos / Contribuintes / Remotos / Stashes / etc
Você deve encontrar YourLostTreasure em "Ramos" ou possivelmente em "Remotos -> Origens". Felizmente, você verá uma ramificação com o nome desejado - se você a expandir, deverá ver os arquivos alterados nessa ramificação. Clique duas vezes nos nomes dos arquivos para abri-los e faça backup imediato desse código.
Se você não vir imediatamente seu ramo perdido, dê uma olhada e, se encontrar algo promissor, abra-o imediatamente e pegue o código. Eu tive que bisbilhotar um pouco até encontrar TheGoldenBranch, e mesmo assim o código estava faltando nos últimos um ou dois salvos (possivelmente porque eu não sincronizei com o servidor antes de tentar fazer uma mesclagem de filial, mas clicar acidentalmente) Branch-Delete). Minha pesquisa foi desnecessariamente prolongada porque, quando eu encontrei o ramo pela primeira vez, não tinha certeza absoluta de que o nome estava correto, então continuei procurando, e levou algum tempo para encontrar esse primeiro ramo. (Assim, Carpe Carpum e depois continue procurando.)
fonte