Quero descartar todas as alterações feitas após a confirmação <commit-hash>
. Então eu fiz:
git reset --hard <commit-hash>
Agora eu quero fazer o mesmo com o meu controle remoto. Como posso fazer isso? Fiz alguns commit (e empurra) depois <commit-hash>
e só quero descartar todos. É apenas algo que deu muito errado no caminho e eu não quero piorar as coisas do que já são. ; (
Basicamente, eu quero rebobinar minha origin/master
para<commit-hash>
origin/master
que não foi puxado e pressionado por outros usuários? Alterar o histórico de um repositório público (ou seja, não local) é algo que você deseja evitar o tempo todo.Respostas:
Supondo que sua ramificação seja chamada
master
aqui e remotamente, e que seu controle remoto seja chamado,origin
você pode:No entanto, você deve evitar fazer isso se mais alguém estiver trabalhando com seu repositório remoto e tiver feito suas alterações. Nesse caso, seria melhor reverter as confirmações que você não deseja e depois pressionar normalmente.
Atualização: você explicou abaixo que outras pessoas realizaram as alterações que você enviou, por isso é melhor criar um novo commit que reverta todas essas alterações . Há uma boa explicação de suas opções para fazer isso nesta resposta de Jakub Narębski . Qual é o mais conveniente depende de quantos commits você deseja reverter e qual método faz mais sentido para você.
Como a partir de sua pergunta, é claro que você já usou
git reset --hard
para redefinir suamaster
ramificação, pode ser necessário começar usando-agit reset --hard ORIG_HEAD
para mover sua ramificação de volta para onde estava antes. (Como sempregit reset --hard
, verifique segit status
está limpo, se você está no ramo certo e se conhecegit reflog
como uma ferramenta para recuperar confirmações aparentemente perdidas.) Você também deve verificar seORIG_HEAD
aponta para a confirmação corretagit show ORIG_HEAD
.Solução de problemas:
Se você receber uma mensagem como " ! [Rejeitado remotamente] a60f7d85 -> master (gancho de pré-recebimento recusado) "
é necessário permitir a reescrita do histórico da ramificação para a ramificação específica. No BitBucket, por exemplo, dizia "Não é permitido reescrever o histórico de ramificações". Há uma caixa de seleção com o nome
Allow rewriting branch history
que você deve verificar.fonte
git update-ref
vez dereset --hard
; ele permitirá que você a fazer o mesmo sem ter uma árvore de trabalho / check-out branchrevert
mas digamos que eu queira reverter os últimos 4 commits, então devo fazergit revert comit1; git push; git revert comit2; git push; ...
ou simplesmentegit revert commit4; git push
?git revert commit4
criar uma nova confirmação que apenas desfaz as alterações introduzidascommit4
. Como a resposta a que vinculei, porém, você pode transformá-las em um único commit.git reset --hard
mas excluí meu local e retirei da origem novamente, para poder fazergit revert ...
agora. Minha dúvida agora é: tenho que reverter cada commit e push (um por um) ou apenas reverter o primeiro commit após o certo comprometer apenas?.git
diretório com referências que elas não pretendiam criar. Eu errei ao dizer que não há verificações de segurança. Você pode encontrar a classificação nos comandos "encanamento" e "porcelana" na página de manual do git .Use as outras respostas se não se importar em perder alterações locais. Esse método ainda pode destruir seu controle remoto se você escolher o hash de confirmação errado para o qual voltar.
Se você quiser apenas fazer com que o controle remoto corresponda a um commit que esteja em qualquer lugar do seu repositório local:
git log
para encontrar a confirmação na qual você deseja que o controle remoto esteja.git log -p
para ver mudanças ougit log --graph --all --oneline --decorate
para ver uma árvore compacta.Execute um comando como:
por exemplo
ou
Eu uso o alias conveniente (
git go
) para visualizar o histórico como na etapa 2, que pode ser adicionada da seguinte forma:fonte
git config --global alias.graph 'log --graph --all --decorate --oneline'
é menos confuso e você ainda pode limitá-lo, por exemplo:git graph -5
q
para sair do log do git. 2 minutos eu nunca voltarei.less
eq
é a maneira normal de sair dele. O Git Bash é como um terminal * nix.Resolvi um problema como o seu com estes comandos:
fonte
No GitLab, talvez você precise configurar sua ramificação para desprotegida antes de fazer isso. Você pode fazer isso em [repositório]> Configurações> Repositório> Ramos protegidos. Então o método da resposta de Mark funciona.
fonte
Se você deseja uma versão anterior do arquivo, eu recomendaria o uso do git checkout.
Isso enviará você de volta no tempo, não afeta o estado atual do seu projeto, você pode acessar a linha principal do git checkout mainline
mas quando você adiciona um arquivo no argumento, esse arquivo é trazido de volta de uma hora anterior para a hora atual do seu projeto, ou seja, seu projeto atual é alterado e precisa ser confirmado.
A vantagem disso é que ele não exclui o histórico e nem reverte uma alteração específica de código (git revert)
Confira mais aqui https://www.atlassian.com/git/tutorials/undoing-changes#git-checkout
fonte
Meus dois centavos para as respostas anteriores: se
ainda não funciona, convém editar
<your-remote-repo>.git/config
a seção de recebimento do arquivo:fonte
Se o seu ramo não for desenvolvimento ou produção, a maneira mais fácil de conseguir isso é redefinir para um determinado commit localmente e criar um novo ramo a partir daí. Você pode usar:
git checkout 000000
(onde 000000 é o ID de confirmação para onde você deseja ir) em sua ramificação problemática e, em seguida, simplesmente crie uma nova ramificação:
git remote add [nome_do_seu_remote]
Então você pode criar um novo PR e tudo funcionará bem!
fonte
Faça uma coisa, obtenha o SHA do commit não. como 87c9808 e, em seguida,
git push --force origin master
fonte
Sourcetree: redefinindo o controle remoto para um determinado commit
Envie esta confirmação para uma nova origem / recurso / 1337_MyAwesomeFeature
Seu ramo de recursos local e seu ramo de recursos remotos agora estão no commit anterior (de sua escolha)
fonte