Como reverter um repositório do github para um commit específico?

431

Meu github tem 100 confirmações no momento. Preciso reverter o repositório para confirmar 80 e remover todos os subsequentes.

Por quê? Esse repositório deve ser usado para mesclar usuários diversos. Um monte de fusões foram confirmadas por mim, devido à edição excessiva. Isso ocorreu devido a uma identificação incorreta de minhas ramificações remotas, onde três desenvolvedores foram rotulados entre si. Preciso redefinir para esse ponto e, em seguida, puxar para frente.

Eu queria refazer a recuperação, como neste exemplo: Como remover uma confirmação no GitHub?

No entanto, o git quer que eu faça muita gestão de conflitos. Existe uma maneira mais simples?

Jonathan Vanasco
fonte

Respostas:

883
git reset --hard <old-commit-id>
git push -f <remote-name> <branch-name>

Nota: Conforme escrito nos comentários abaixo, Usar isso é perigoso em um ambiente colaborativo: você está reescrevendo o histórico

jtdubs
fonte
43
pessoas, faça git push -f origin branch. Só tive um mau momento, porque senti falta disso.
Sumit M Asok 26/03
21
Cuidado com isso! você vai perder todos os seus commits localmente, e se você empurrar não haverá caminho de volta
Thomas
8
Isso não é verdade, você pode obter os antigos commits usando reflog git
Jan Schaefer
27
você pode precisar de fazer git push origin HEAD --force, em vez de git push -f origin branchcomo isso estava me dando um error: src refspec branch does not match any.erro
sprocket12
1
Sim, obrigado pessoal. Consegui fazer o que queria. Primeiro criei uma ramificação separada da que antecede o commit que eu queria reverter. Clonou localmente. Em seguida, aplicou suas recomendações sobre essa cópia, desta forma, eu não comprometida a minha principal ramo ...
Gauthier Boaglio
21

Para desfazer o commit mais recente, faço o seguinte:

Primeiro:

git log

obtenha o ID mais recente do SHA para desfazer.

git revert SHA

Isso criará um novo commit que faz exatamente o oposto do seu commit. Em seguida, você pode enviar esse novo commit para levar seu aplicativo ao estado em que estava antes, e seu histórico do git mostrará essas alterações de acordo.

Isso é bom para refazer imediatamente algo que você acabou de cometer, o que eu acho que é mais frequente para mim.

Como Mike mencionou, você também pode fazer isso:

git revert HEAD
Nick Res
fonte
8
git revert HEADreverterá o último commit sem precisar procurar o hash.
Mike Baranczak
Esta é uma solução se você não deseja excluir confirmações. No entanto, nesse caso, todo o lixo confirmado ainda estará lá e permitirá que um clonador redefina ou faça o checkout para eles. Se você quiser evitar isso, você terá que forçar.
cst1992
19

Outra maneira:

Faça o checkout da filial que você deseja reverter e, em seguida, redefina sua cópia de trabalho local de volta para a confirmação de que você deseja ser a mais recente no servidor remoto (tudo depois que ela se despedir). Para fazer isso, no SourceTree, cliquei com o botão direito do mouse e selecionei "Redefinir BRANCHNAME para este commit".

Em seguida, navegue até o diretório local do seu repositório e execute este comando:

git -c diff.mnemonicprefix=false -c core.quotepath=false push -v -f -- tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME 

Isso apagará todas as confirmações após a atual no seu repositório local, mas apenas para essa ramificação.

CommaToast
fonte
1
FYI "REPOSITORY_NAME" será algo como https: /[email protected]/me/repo_name.git
tim
3
Seria mais útil se você quebrar esse comando e explicá-lo.
cst1992
3

A maioria das sugestões pressupõe que você precisa destruir de alguma forma os últimos 20 commits, e é por isso que significa "reescrever o histórico", mas você não precisa.

Basta criar um novo ramo a partir do commit # 80 e trabalhar nesse ramo daqui para frente. Os outros 20 commits permanecerão no antigo ramo órfão.

Se você deseja absolutamente que seu novo ramo tenha o mesmo nome, lembre-se de que o ramo é basicamente apenas rótulos. Apenas renomeie sua ramificação antiga para outra coisa e crie a nova ramificação no commit # 80 com o nome que você deseja.

Ion Lesan
fonte
Suponho que isso também mexa problemático com as versões locais de todos da história do ramo de interesse.
ragerdl
2

Ao fazer atualizações de ramificação a partir do mestre, percebo que às vezes clico demais e faço com que a ramificação se mescle também ao mestre. Encontrei uma maneira de desfazer isso.

Se o seu último commit foi uma mesclagem, é necessário um pouco mais de amor:

git revert -m 1 HEAD

Richard Nader
fonte
1

No github, a maneira mais fácil é excluir a ramificação remota na interface do usuário do github, na guia Ramificações. Você precisa remover as seguintes configurações para excluir a ramificação:

  1. Não é um ramo padrão
  2. Nenhuma solicitação de pesquisa de abertura.
  3. O ramo não está protegido.

Agora, recrie-o em seu repositório local para apontar para o ponto de confirmação anterior. e adicione-o novamente ao repositório remoto.

git checkout -b master 734c2b9b   # replace with your commit point

Em seguida, empurre a ramificação local para o controle remoto

git push -u origin master

Adicione novamente a proteção padrão de ramificação e ramificação, etc.

Jianwu Chen
fonte