Acabei de comprometer a fonte errada para o meu projeto usando --force
opção.
É possível reverter? Eu entendo que todos os branches anteriores foram sobrescritos usando a -f
opção, então posso ter bagunçado minhas revisões anteriores.
git
git-commit
git-push
David van Dugteren
fonte
fonte
Respostas:
Git geralmente não joga nada fora, mas se recuperar disso ainda pode ser complicado.
Se você tiver a fonte correta, basta colocá-la no controle remoto com a
--force
opção. O Git não terá excluído nenhum branch a menos que você mande. Se você realmente perdeu commits, dê uma olhada neste guia útil para recuperar commits . Se você conhece o SHA-1 dos commits que deseja, provavelmente está bem.Melhor coisa a fazer: faça backup de tudo e veja o que ainda está em seu repositório local. Faça o mesmo no controle remoto, se possível. Use
git fsck
para ver se consegue recuperar coisas e acima de tudo NÃO executegit gc
.Acima de tudo, nunca use a
--force
opção a menos que seja realmente sincero.fonte
git reflog show remotes/origin/master
,. Você deve ser capaz de ver seu empurrão lá; o commit na linha anterior está onde estava antes de você estragar tudo. Você pode então apenas empurrar essa revisão (com--force
) para a origem e voltar para onde estava!git fetch
edição há muito tempo) você pode exibir o reflog do lado do GitHub e se recuperar!Se você conhece o hash do commit, é fácil, apenas recrie seu branch.
Exclua o branch remoto:
em seguida, recrie seu branch com os seguintes comandos:
fonte
A solução já foi mencionada aqui
fonte
git reflog show remotes/origin/master
se o git reflog for necessário (conforme mencionado por @Cascabel acima)Se você não estiver no repositório local de onde o push forçado veio, no nível de origem / mestre não há como recuperar. Mas se você tiver sorte o suficiente para usar GitHub ou GitHub for Enterprise , você pode dar uma olhada na API REST e recuperar o commit perdido como patch, exemplo:
fonte
Outra maneira de recuperar o commit perdido ou mesmo descobrir quais commits foram perdidos, se o push anterior não veio de seu repositório local, é olhar para sua máquina de CI.
Se você tem um trabalho que testa o branch master após cada commit (ou série de commits consecutivos), o que você deveria ter, você pode dar uma olhada no que ele testou por último. Esse é o commit que você precisa restaurar.
A máquina de CI pode até mesmo manter um clone local do repo, a partir do qual você poderá realizar essa recuperação.
Fonte: provavelmente entrega contínua: lançamentos de software confiáveis por meio de construção, teste e automação de implantação (Addison-Wesley Signature Series (Fowler))
fonte
Sim, você pode recuperar commits depois
git push -f your_branch
Então você pode fazer:
1-
git reflog
2- você escolhe Head_Number com o qual deseja recuperar
git reset –hard HEAD@{HEAD-NUMBER}
3- você pode ver todos os commits neste cabeçalho por
git cherry -v branch_name
4- no final você deve forçar o push
git push -f branch_name
OU
1- obtenha o número de SHA de seu cliente GIT (interface)
2- forçar empurrar
Espero que isto ajude
fonte
Eu fiz a mesma coisa ao desfazer um último push para apenas um arquivo. Acabou voltando ao estado original do repositório. Eu estava usando comandos git do Linus porque tinha a cópia local no Linux. Felizmente, essa cópia ainda estava intacta.
Tudo o que fiz foi (depois de fazer freneticamente mais algumas cópias do repositório local):
(dizia que origin / master estava à frente de 68 commits, tudo bem ... esses foram todos os commits que eu deletei)
E tudo foi restaurado do jeito que estava antes de eu fazer um empurrão forte. A coisa mais importante a lembrar é nunca fazer uma verificação do git. depois de ter empurrado com força. Mas a prática recomendada é desabilitar a opção push. Eu nunca vou usá-lo novamente. Aprendeu minha lição !!
fonte
Aqui você pode ler as decisões https://evilmartians.com/chronicles/git-push---force-and-how-to-deal-with-it
O segundo me ajudou. Errei esses comandos
Após esses comandos, perdi três commits. Para recuperá-los, olhei para o terminal onde fiz 'git pull' incorretamente e vi uma saída como
60223bf ... 0b258eb algum-ramo -> origem / algum-ramo
O segundo hash 0b258eb era exatamente o que eu precisava. Então, peguei esse hash e produzi o comando
fonte
Para pessoas em situações realmente ruins como eu (por exemplo, se você estiver recebendo
bad object
erros durante a execuçãogit reset --hard
):Eu escrevi um script chamado treesaver que puxa todos os seus arquivos da API do GitHub como último recurso. Veja como usá-lo:
treesaver
script ecd
para ele.SHA
seqüência da árvore que você gostaria de restaurar acessandohttps://api.github.com/repos/<your_username_or_org>/<repo>/events
.payload
propriedade correspondente ao seu evento push, encontre ocommit
para o qual você gostaria de reverter e clique neleurl
.commit.tree
, copie otree
'surl
.python3 main.py <tree_url> <path_to_save_to>
.Por exemplo, no meu caso, eu executaria:
Claro, os PRs são bem-vindos.
fonte