Eu tenho 2 confirmações que não forcei:
$ 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-do-i-rollback-commit-just-want
Eu só preciso fazer:
git reset --hard baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e
Isso é?
Respostas:
A maneira mais segura e provavelmente mais limpa de se fazer é se recuperar de forma interativa.
Ou,
A partir daí, você pode compactar confirmações, o que coloca uma ou mais confirmações juntas na confirmação anterior. Para excluir completamente uma confirmação do histórico, exclua a linha da lista.
Você pode reverter uma confirmação com,
git revert
mas ela adicionará mais mensagens de confirmação ao histórico, o que pode ser indesejável. Use o-n
parâmetro para dizer ao Git para não confirmar a reversão imediatamente. Você pode refazer a interação de maneira interativa e compactá-los em uma confirmação anterior para manter as coisas limpas.Se as duas confirmações com as quais você trabalha aqui afetam os mesmos arquivos, é possível que ocorra um conflito de mesclagem.
A redefinição do repositório com
git reset --hard
deve ser feita com cuidado, pois não pode ser desfeita.O histórico de reescrita deve ser feito com cuidado.
fonte
rebase
o menos possível. Se você trabalha com outras pessoas, basta fazerrevert
.Isso se http://nakkaya.com/2009/09/24/git-delete-last-commit/ e funcionou para mim
fonte
Não. O git-reset --hard o trará de volta à história. O que você está procurando é git revert, que desfará qualquer confirmação.
fonte
Acabei de fazer isso:
Eu estraguei tudo, então eu fiz
Então fiz isso de novo. Então eu tive que empurrar assim:
E destruiu os commits mais recentes que o commit para o qual eu havia revertido. Trabalhou muito bem.
fonte
Não,
git reset --hard baf8d5e
excluirá o3368e1c
commit e o HEAD serábaf8d5e
posteriormente.Se você deseja manter a
3368e1c
confirmação e excluir abad8d5e
confirmação, a solução mais fácil é fazer uma "git rebase -i HEAD~2
" (ou seja, rebase interativa das duas últimas confirmações). Este comando iniciará o editor de mensagens de confirmação e você verá uma linha para cada um dos dois últimos commit. Lá, você apenas exclui abad8d5e
linha de confirmação e salva. O git reescreverá seu histórico e o segundo commit desaparecerá.Existem outros comandos úteis que você pode usar no editor de mensagem de commit como
squash
,edit
, etc. rebase interativo é muito poderoso!Não faça isso se alguém já viu esses commits (empurre ou puxe do seu repositório)!
fonte
Em referência ao comentário de jtimberman sobre
git reset --hard
ser desfazível, isso não é inteiramente verdade. Veja aqui: https://stackoverflow.com/questions/5473/undoing-a-git-reset-hard-head1fonte
é a única maneira de desfazer um commit se houver apenas outro commit no repositório (por exemplo, commit inicial e mais 1). O restante das formas (revert, rebase) se recusa a trabalhar, pelo menos a partir do git 1.7.5.1.
Se você seguir o comando
git reset
comgit gc
, o git excluirá completamente os dados de confirmação antigos do repositório.fonte
Isso trará de volta o diretório do “treeish” especificado para o / path / to / dir
fonte
Eu consegui isso editando manualmente os códigos de hash dos últimos commits dos arquivos HEAD dentro da pasta do repositório:
Antes disso, nunca consegui forçar a origem das operações UNMERGE que fiz localmente. Ele continuou dizendo que "falhou em enviar alguns árbitros" ao Repositório Central.
fonte