Como posso reverter para um commit específico no git ?
A melhor resposta que alguém poderia me dar era usar git revert
X vezes até atingir o commit desejado.
Então, digamos que eu queira reverter para um commit com 20 commit antigo, eu teria que executá-lo 20 vezes.
Existe uma maneira mais fácil de fazer isso?
Não consigo usar a redefinição porque este repositório é público.
git
git-checkout
git-revert
David
fonte
fonte
Respostas:
Tente o seguinte:
onde
[revision]
está o hash de confirmação (por exemplo12345678901234567890123456789012345678ab
:).Não se esqueça
.
do final, muito importante. Isso aplicará alterações em toda a árvore. Você deve executar este comando na raiz do projeto git. Se você estiver em qualquer subdiretório, esse comando alterará apenas os arquivos no diretório atual. Então comprometa e você deve ser bom.Você pode desfazer isso
que excluirá todas as modificações do diretório de trabalho e da área de preparação.
fonte
Para reverter para uma confirmação específica:
Para retroceder 10 confirma novamente:
Você pode usar "git revert" como na postagem a seguir, se não quiser reescrever o histórico
Como reverter o repositório Git para um commit anterior?
fonte
Bem, acho que a pergunta é: o que você quer dizer com 'reverter'? Se você não pode,
reset
porque é público e deseja manter intacto o histórico de consolidação, você quer dizer que apenas deseja que sua cópia de trabalho reflita uma consolidação específica? Usegit checkout
e o hash de confirmação.Editar: Como foi indicado nos comentários, o uso
git checkout
sem especificar uma ramificação o deixará no estado "sem ramificação". Usegit checkout <commit> -b <branchname>
para fazer checkout em uma ramificação ougit checkout <commit> .
fazer check-out na ramificação atual.fonte
git checkout
- ele está livre para verificar em qualquer ramo (atual ou novo) que desejar. Vou atualizar minha resposta para que não seja ambígua.git reset
excluir esses arquivos, o que você diz que não deseja fazer. Tente fazer isso em um ramo separado:,git checkout <commit> -b <branchname>
você não terá arquivos estagnados nesse ramo .checkout
é que ele não excluirá os arquivos adicionados em uma confirmação anterior.O pôster original declara:
Não é necessário usar
git revert
X vezes.git revert
pode aceitar um intervalo de confirmação como argumento, portanto, você só precisa usá-lo uma vez para reverter um intervalo de confirmações. Por exemplo, se você deseja reverter as últimas 20 confirmações:O comprometer gama
HEAD~20..
é curto paraHEAD~20..HEAD
, e significa "começar a partir da 20 ª pai da cabeça submeter, e reverter todos os commits depois até a cabeça".Isso reverterá os últimos 20 confirmados, assumindo que nenhum deles seja confirmado por mesclagem. Se houver confirmações de mesclagem, não será possível revertê-las todas em um comando, será necessário revertê-las individualmente com
Observe também que eu testei usando um intervalo com o
git revert
uso da versão 1.9.0 do git. Se você estiver usando uma versão mais antiga do git, usar um intervalo comgit revert
pode ou não funcionar.Nesse caso,
git revert
é preferível agit checkout
.Observe que, diferentemente da resposta que diz para usar
git checkout
,git revert
na verdade, os arquivos adicionados em qualquer consolidação que você está revertendo serão removidos , o que torna a maneira correta de reverter uma série de revisões.Documentação
fonte
Etapa 1: buscar a lista de confirmações:
Você receberá uma lista como neste exemplo:
Etapa 2: copie o hash de confirmação necessário e cole-o para checkout:
Isso é tudo.
fonte
vai fazer isso. É "git checkout", mas sem atualizar o HEAD.
Você pode obter o mesmo efeito com
se você preferir encadear comandos de conveniência juntos.
Isso deixa você com sua árvore de trabalho e índice no estado desejado, basta
git commit
finalizar.fonte
Deseja o modo desconectado HEAD?
Se você deseja reverter o tempo X para um determinado commit com um DETACHED HEAD (o que significa que você não pode estragar nada), então, por todos os meios, use o seguinte:
(substitua X por quantas confirmações você deseja voltar)
IE para voltar um commit:
fonte
Digamos que você trabalhe em um projeto e depois de um dia ou mais. Você percebe que um recurso ainda está apresentando erros. Mas você não sabe que alteração você fez que causou o erro. Então você tem que pescar commits de trabalho anteriores. Para reverter para um commit específico:
Ok, para que o commit funcione para você. Não há mais erro. Você identificou o problema. Agora você pode voltar ao último commit:
E faça o checkout de um arquivo específico antes que ele tenha causado o erro (no meu caso, uso o exemplo Gemfile.lock):
E essa é uma maneira de lidar com os erros que você criou nas confirmações sem perceber os erros até mais tarde.
fonte
Você pode encontrar o ID de confirmação relacionado a cada confirmação na seção de confirmações do GitHub / BitBucket / Gitlab. É muito simples, suponha que seu ID de confirmação seja 5889575; se você quiser voltar a esta parte do seu código, basta digitar
Isso levará você a esse ponto do tempo no seu código.
fonte
Eu não tenho certeza o que mudou, mas eu sou incapaz de fazer o checkout de um commit específico sem a opção
--detach
. O comando completo que funcionou para mim foi:git checkout --detach [commit hash]
Para voltar do estado desanexado, tive que fazer checkout da minha filial local:
git checkout master
fonte
master
resolve o problema de permanecer individual, ao fazergit reset --hard
ougit checkout -- .
que funcionou, mas permaneceu isoladaAqui está um exemplo para fazer isso
fonte