Devido a algumas más escolhas, meu repositório Git local está atualmente cinco commits à frente da origem e não está em bom estado. Eu quero me livrar de todos esses commits e começar de novo.
Obviamente, excluir meu diretório de trabalho e re-clonar faria isso, mas fazer o download de tudo do GitHub novamente parece exagero e não é um bom uso do meu tempo.
Talvez git revert
seja o que eu preciso, mas não quero acabar com 10 confirmações antes da origem (ou mesmo seis), mesmo que ele retorne o código ao estado correto. Eu só quero fingir que a última meia hora nunca aconteceu.
Existe um comando simples que fará isso? Parece um caso de uso óbvio, mas não estou encontrando nenhum exemplo disso.
Observe que esta pergunta é especificamente sobre confirmações , não sobre:
- arquivos não rastreados
- mudanças sem estágio
- mudanças encenadas, mas não confirmadas
Respostas:
Se o excesso de confirmações estiver visível apenas para você, basta fazer
git reset --hard origin/<branch_name>
o retorno para onde está a origem. Isso redefinirá o estado do repositório para a confirmação anterior e descartará todas as alterações locais.Fazer um
git revert
faz novas confirmações para remover as confirmações antigas de uma maneira que mantém a história de todos sã.fonte
git reset --hard <commit hash, branch, or tag>
se você quiser ir para uma referência específica que não seja uma filial remota.master
, mas em outro ramo, você deve executargit reset --hard origin/<your-branch-name>
git reset --hard origin/<branch_name>
Ele também redefinirá a configuração do projeto, portanto, cuide disso. Eu tenho um.cfg
arquivo grande que foi redefinido para o padrão. Eu tive que passar horas nisso novamente.Simplesmente exclua seu ramo mestre local e recrie-o da seguinte maneira:
fonte
git reset --hard origin/<branch_name>
Tentar:
para repor a cabeça onde quer que você esteja. Use o gitk para ver em qual commit você deseja estar. Você também pode redefinir no gitk.
fonte
Exclua a confirmação mais recente:
git reset --hard HEAD~1
Exclua a confirmação mais recente, sem destruir o trabalho que você fez:
git reset --soft HEAD~1
fonte
Se você estiver usando o aplicativo Atlassian SourceTree , poderá usar a opção de redefinição no menu de contexto.
fonte
Na sua tentativa de ramificação:
Valide a reversão (para o estado, sem confirmações locais), usando "
git log
" ou "git status
".fonte
Just to be clear, if you're not working on master but on another branch, you should run git reset --hard origin/<your-branch-name>
git reset --hard @{u}
* exclui todas as suas alterações locais na ramificação atual, incluindo confirmações. Estou surpreso que ninguém tenha postado isso ainda, considerando que você não precisará procurar o que se comprometer a reverter ou brincar com os ramos.* Ou seja, redefina a ramificação atual em -
@{upstream}
geralmenteorigin/<branchname>
, mas nem semprefonte
Para ver / obter o ID SHA-1 do commit, você também quer voltar
Para reverter para esse commit
!Nota. Todas as confirmações feitas após essa confirmação serão excluídas (e todas as suas modificações no projeto). Então, primeiro é melhor clonar o projeto em outra ramificação ou copiar em outro diretório.
fonte
Eu tive uma situação em que queria remover uma confirmação que não foi enviada por push, mas a confirmação foi antes de outra. Para fazer isso, usei o seguinte comando
git rebase -i HEAD~2
-> irá refazer os dois últimos commitsE usei 'drop' para a assinatura de confirmação que eu queria remover.
fonte
Remover arquivos não rastreados (alterações locais não confirmadas)
Excluir permanentemente todas as confirmações locais e obter a confirmação remota mais recente
fonte
Para confirmações locais que não estão sendo enviadas por push, você também pode usar
git rebase -i
para excluir ou compactar uma confirmação.fonte
git rebase -i
é uma maneira mais genérica de resolver muitos problemas semelhantes e pode ser útil em diversas situações.drop
palavra - chave (em vez de excluir uma linha) ao remover todas as confirmações para evitar a interrupção da rebase.A solução simples será combinar o ramo principal local HEAD com a origem / ramo principal HEAD
PS: origem / mestre - é um ponteiro remoto para o ramo principal. Você pode substituir o mestre por qualquer nome de filial
fonte
Antes de responder, vamos adicionar alguns antecedentes, explicando o que é isso
HEAD
. uma vez que algumas das opções abaixo resultarão em desanexação da cabeçaFirst of all what is HEAD?
HEAD
é simplesmente uma referência ao commit atual (mais recente) no branch atual.Só pode haver um single
HEAD
a qualquer momento. (excluindogit worktree
)O conteúdo de
HEAD
é armazenado dentro.git/HEAD
e contém os 40 bytes SHA-1 da confirmação atual.detached HEAD
Se você não está no último commit, o que significa que
HEAD
está apontando para um commit anterior no históricodetached HEAD
.Na linha de comando, será semelhante a este- SHA-1 em vez do nome do ramo, pois ele
HEAD
não está apontando para a ponta do ramo atualAlgumas opções sobre como recuperar de um HEAD desanexado:
git checkout
Isso fará o checkout do novo ramo apontando para o commit desejado.
Este comando fará checkout para um determinado commit.
Nesse ponto, você pode criar uma ramificação e começar a trabalhar a partir deste ponto.
git reflog
Você sempre pode usar o
reflog
também.git reflog
exibirá qualquer alteração que tenha atualizadoHEAD
e o check-out da entrada de reflog desejadaHEAD
retornará a esta confirmação.Sempre que o HEAD for modificado, haverá uma nova entrada no
reflog
Isso o levará de volta ao seu commit desejado
git reset --hard <commit_id>
"Mova" seu HEAD de volta para o commit desejado.
você também pode usá-lo
git rebase --no-autostash
.git revert <sha-1>
"Desfazer" o intervalo de confirmação ou confirmação fornecido.
O comando reset irá "desfazer" quaisquer alterações feitas no commit fornecido.
Um novo commit com o patch de desfazer será confirmado enquanto o commit original também permanecerá no histórico.
Este esquema ilustra qual comando faz o quê.
Como você pode ver lá,
reset && checkout
modifique o arquivoHEAD
.fonte
Para os interessados na solução do Visual Studio, aqui está o detalhamento:
Team Explorer
janela, conecte-se ao repositório de destino.Branches
, em , clique com o botão direito do mouse na filial de interesse e selecioneView history
.History
janela e escolhaReset -> Delete changes (--hard)
.Isso descartará as confirmações locais e redefinirá o estado do seu repo para a confirmação selecionada. Ou seja, suas alterações após a retirada do repositório serão perdidas.
fonte
Se o seu ramo está à frente de '
origin/XXX
' em 5 confirma.Você pode emitir:
E deve remover os últimos 5 commits.
fonte
Isso será útil se você cometeu alguns erros em sua cópia local e deseja garantir que não seja enviado por push à sua filial remota.
O Código SHA pode ser obtido consultando a versão web do seu painel git para o último commit na ramificação.
Dessa forma, você pode ser sincronizado com a última confirmação na ramificação.
Você pode fazer isso
git pull
depois de concluir com êxito a reinicialização completa para confirmar que não há nada novo em sin.Sua filial está atualizada com
Origin/<Branch Name>
fonte
Se você deixar seu repositório local em uma bagunça completa, uma maneira confiável de jogar fora os commits locais no Git é ...
Na minha experiência, o Eclipse lida com o mundo mudando muito bem. No entanto, pode ser necessário selecionar projetos afetados no Eclipse e limpá-los para forçar o Eclipse a reconstruí-los. Eu acho que outros IDEs também podem precisar de uma reconstrução forçada.
Um benefício secundário do procedimento acima é que você descobrirá se o seu projeto depende de arquivos locais que não foram colocados no git. Se você achar que estão faltando arquivos, poderá copiá-los de "my_broken_local_repo" e adicioná-los ao git. Depois de ter certeza de que seu novo repositório local tem tudo o que você precisa, é possível excluir "my_broken_local_repo".
fonte
Se você quiser apenas jogar fora as confirmações locais e manter as modificações feitas nos arquivos,
git reset @ ~
Outras respostas abordaram a reinicialização completa
fonte