Como posso reverter 1 commit?

119

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:

link

Eu só preciso fazer:

git reset --hard baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e

Isso é?

    
por n179911 03.09.2009 / 23:23

9 respostas

92

A maneira mais segura e provavelmente mais limpa de ir é fazer o rebase de forma interativa.

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 uma confirmação do histórico, exclua a linha da lista.

Você pode reverter uma confirmação com git revert , mas adicionará mais mensagens de confirmação ao histórico, o que pode ser indesejável. Use o parâmetro -n 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 de encontro 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.

A redefinição do repositório com git reset --hard deve ser feita com cuidado, pois não pode ser desfeita.

A história de reescrita deve ser feita com cuidado.

    
por 03.09.2009 / 23:32
47

Isso se de link e funcionou para mim

Git Delete Last Commit

Once in a while late at night when I ran out of coffee, I commit stuff that I shouldn't have. Then I spend the next 10 - 15 minutes googling how to remove the last commit I made. So after third time I wanted to make a record of it so I can refer to it later.

If you have committed junk but not pushed,

git reset --hard HEAD~1

HEAD~1 is a shorthand for the commit before head. Alternatively you can refer to the SHA-1 of the hash you want to reset to. Note that when using --hard any changes to tracked files in the working tree since the commit before head are lost.

If you don't want to wipe out the work you have done, you can use --soft option that will delete the commit but it will leave all your changed files "Changes to be committed", as git status would put it.

Now if you already pushed and someone pulled which is usually my case, you can't use git reset. You can however do a git revert,

git revert HEAD

This will create a new commit that reverses everything introduced by the accidental commit.

    
por 05.08.2011 / 19:52
8

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.

    
por 03.09.2009 / 23:26
5

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 isso destruiu os commits mais recentes que o commit para o qual eu reverta. Funcionou muito bem.

    
por 12.12.2011 / 05:39
4

Em referência ao comentário de jtimberman sobre git reset --hard ser desfeito, isso não é inteiramente verdade. Veja aqui: link

    
por 28.01.2010 / 04:48
3

Não, git reset --hard baf8d5e excluirá a 3368e1c commit e a HEAD estará em baf8d5e depois.

Se você quiser manter o 3368e1c commit e excluir o bad8d5e commit, a solução mais fácil é fazer um " git rebase -i HEAD~2 " (ou seja, um rebase interativo 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 dois últimos commits. Lá você apenas exclui a linha de confirmação bad8d5e e salva. O git então irá reescrever sua história e o segundo commit terá ido embora.

Existem outros comandos úteis que você pode usar no editor de mensagens de confirmação, 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)!

    
por 03.09.2009 / 23:46
2
git checkout <treeish> -- /path/to/dir

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

    
por 12.10.2012 / 11:23
1
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 git gc , o git excluirá os dados de confirmação antigos do repositório completamente.

    
por 28.02.2012 / 21:17
0

Eu consegui que isso funcionasse 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, eu nunca fui capaz de empurrar para originar as operações UNMERGE que fiz localmente. Ele continuou dizendo que "não conseguiu empurrar alguns refs" para Repositório Central.

    
por 13.06.2014 / 02:08

Tags