Questão Como posso reverter um commit?


Eu tenho 2 commits que eu não enviei:

$ git status
# On branch master
# Your branch is ahead of 'faves/master' by 2 commits.

Como posso reverter meu primeiro (o mais antigo), mas manter o segundo?

 $ git log
commit 3368e1c5b8a47135a34169c885e8dd5ba01af5bb
...

commit baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e
...

Daqui:

http://friendfeed.com/harijay/742631ff/git-question-how-doi-i-rollback-commit-just-want

Eu só preciso fazer:

git reset --hard baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e

Isso é?


119


origem


Esta questão parece estar fora do tópico, porque se trata de uma ferramenta de programação. Pertence ao Stack Overflow. - Peter Mortensen
@ PeterMortensen concordou. Isso é de escopo para Superusuário - Kolob Canyon


Respostas:


A maneira mais segura e provavelmente mais limpa de ir é para rebase interativamente.

git rebase -i HEAD^^

Ou,

git rebase -i baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e^

De lá você pode esmagar commits, o que coloca um ou mais commits juntos no commit anterior. Para excluir completamente um commit do histórico, exclua a linha da lista.

Você pode reverter um commit com git revert mas vai adicionar mais mensagens de commit ao histórico, o que pode ser indesejável. Use o -n parâmetro para informar ao Git para não cometer a reversão imediatamente. Você pode fazer o rebase de forma interativa e esmagá-los até um ponto anterior para manter as coisas limpas.

Se os dois commits com os quais você está trabalhando afetarem o (s) mesmo (s) arquivo (s), você poderá ver um conflito de mesclagem.

Repor o repositório com git reset --hard deve ser feito com cuidado, pois não pode ser desfeito.

Reescrever a história deve ser feito com cuidado.


92



Como posso deletar um commit durante o 'git rebase'? Existem apenas 3 comandos: escolha, edite, squash. Não há excluir AFAIK. - n179911
excluir a linha da lista completamente e exclui essa confirmação - jtimberman
quando eu quis reverter a mudança, não quis deixar vestígios disso. Se você também não quiser deixar vestígios de sua reversão, esta é a melhor maneira de fazê-lo. - Phillip Whelan
"A maneira mais segura e provavelmente mais limpa de ir é rebase interativamente" Talvez não, se você não usar o vim. Eu tive sorte e resolvi sair dessa bagunça. Ainda estou votando porque eu deveria aprender vim :-) - isimmons
Eu sugeriria usar rebase o menos possível. Se você trabalha com outras pessoas, faça revert. - boldnik


Isso se de http://nakkaya.com/2009/09/24/git-delete-last-commit/  e funcionou para mim

Git Delete Last Commit

De vez em quando, tarde da noite, quando eu ficava sem café, eu cometia coisas   que eu não deveria ter. Então eu passo os próximos 10 - 15 minutos googling   como remover o último commit que fiz. Então, depois da terceira vez eu queria   faça um registro disso para que eu possa me referir a ele mais tarde.

Se você tiver cometido lixo, mas não for empurrado,

git reset --hard HEAD~1

HEAD ~ 1 é uma abreviação para o commit antes da cabeça. Alternativamente você   pode se referir ao SHA-1 do hash que você deseja redefinir. Observe que   ao usar --hard quaisquer alterações nos arquivos rastreados na árvore de trabalho   desde que o commit antes da cabeça é perdido.

Se você não quer acabar com o trabalho que você fez, você pode usar    --soft opção que irá excluir o commit, mas vai deixar todo o seu   arquivos alterados "Alterações a serem confirmadas", como o status do git colocaria.

Agora, se você já empurrou e alguém puxou o que geralmente é meu caso,   você não pode usar o git reset. Você pode no entanto fazer um git reverter,

git revert HEAD

Isso criará um novo commit que reverte tudo o que foi introduzido   o commit acidental.


46



Com a opção --soft, é perfeito para onde você renomeia um arquivo e acidentalmente "git commit -a" ao invés de usar "git add" primeiro. - Aaron Harun


Não. git-reset --hard vai trazer você de volta à história. O que você está procurando é o git revert, que irá desfazer qualquer commit.


8



Bem, isso funciona, mas também polui o commit do log. Se esses commits não foram enviados / puxados, é melhor limpá-los com um rebase interativo. A capacidade de alterar o histórico é uma das principais vantagens do git em relação a outros sistemas de controle de versão. - knweiss


Eu acabei de fazer isso:

git rebase -i HEAD^^

Eu estraguei tudo então eu fiz

git rebase --abort

Então fiz isso de novo. Então eu tive que empurrar assim:

git push origin master -f

E destruiu os commits mais novos que o commit para o qual eu reverta. Funcionou muito bem.


5





Em referência ao comentário de jtimberman sobre git reset --hard sendo desobediente, isso não é inteiramente verdade. Veja aqui: https://stackoverflow.com/questions/5473/undoing-a-git-reset-hard-head1


4





Não, git reset --hard baf8d5e irá apagar o 3368e1c commit e HEAD será no baf8d5e depois.

Se você quiser manter o 3368e1cconfirmar e excluir o bad8d5e comprometer a solução mais fácil é fazer um "git rebase -i HEAD~2"(por exemplo, rebase interativa dos últimos dois commits). Este comando irá lançar o seu editor de mensagens de commit e você verá uma linha para cada um dos últimos dois commits. bad8d5e Confirme a linha e salve. O git então irá reescrever sua história e o segundo commit terá desaparecido.

Existem outros comandos úteis que você pode usar no editor de mensagens de commit, como squash, edit, etc. O rebase interativo é MUITO poderoso!

Não faça isso se alguém já viu esses commits (push ou pull do seu repositório)!


3





git checkout <treeish> -- /path/to/dir

Isso trará de volta o diretório do dado treeish para o diretório / path / to / dir


2





git reset --hard {ref}

é a única maneira de desfazer uma confirmação se houver apenas uma outra confirmação no repositório (por exemplo, confirmação inicial e mais 1). O resto das maneiras (reverter, rebase) se recusam a funcionar, pelo menos a partir do git 1.7.5.1.

Se você seguir o git reset com um git gc então o git irá deletar os dados de commit antigos do repositório completamente.


1





Eu tenho isso para trabalhar editando manualmente os códigos hash dos últimos commits dos arquivos HEAD dentro da pasta do repositório:

"centralRepository\refs\heads\master"
"centralRepository\refs\heads\branch2"

Antes disso, nunca consegui empurrar para originar as operações UNMERGE que fiz localmente. Ele continuou dizendo que "não conseguiu empurrar alguns refs" para o Repositório Central.


0