2009-09-03 21:23:58 +0000 2009-09-03 21:23:58 +0000
133
133

Como posso fazer recuar 1 commit?

Tenho 2 commits que não empurrei:

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

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

$ git log
commit 3368e1c5b8a47135a34169c885e8dd5ba01af5bb
...

commit baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e
...

A partir daqui: http://friendfeed.com/harijay/742631ff/git-question-how-do-i-rollback-commit-just-want

Só preciso de fazer:

git reset --hard baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e

Isto é?

Respostas (9)

99
99
99
2009-09-03 21:32:01 +0000

A forma mais segura e provavelmente a mais limpa de se fazer é rebasear interactivamente.

git rebase -i HEAD^^

Ou,

git rebase -i baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e^

A partir daí, pode abafar os commits, o que coloca um ou mais commits juntos no commit anterior. Para apagar completamente um commit do histórico, apague 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. Utilize o parâmetro -n para dizer ao Git para não cometer o committ imediatamente. Podes rebasear interactivamente e comprimir as mensagens até um compromisso anterior para manter as coisas limpas.

Se os dois commits com que estás a trabalhar aqui afectarem o(s) mesmo(s) ficheiro(s), poderás ver um conflito de merge.

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

A reescrita do histórico deve ser feita com cuidado.

54
54
54
2011-08-05 17:52:58 +0000

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

Git Delete Last Commit

De vez em quando, à noite, quando o café acabou, eu cometo coisas que não devia. Depois passo os próximos 10 - 15 minutos a pesquisar no Google como remover o último compromisso que fiz. Por isso, depois da terceira vez quis fazer um registo para poder referir-me a ele mais tarde.

Se cometeu lixo mas não empurrou,

git reset --hard HEAD~1

HEAD~1 é uma abreviatura para o compromisso antes da cabeça. Em alternativa, pode consultar o SHA-1 do hash para o qual pretende repor. Note que ao usar –hard quaisquer alterações para rastrear ficheiros na árvore de trabalho desde que o commit antes da cabeça é perdido.

Se não quiser apagar o trabalho que fez, pode usar a opção --soft que apagará o commit mas deixará todos os seus ficheiros alterados “Changes to be committed”, como o estado do git o colocaria.

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

git revert HEAD

Isto irá criar um novo commit que reverte tudo o que foi introduzido pelo commit acidental.

8
8
8
2009-09-03 21:26:55 +0000

Não. git-reset –hard-hard vai trazê-lo de volta para a história. O que você procura é o git-reset, que vai desfazer qualquer compromisso.

6
6
6
2011-12-12 04:39:48 +0000

Acabei de fazer isto:

git rebase -i HEAD^^

Fiz asneira, por isso fiz

git rebase --abort

Depois fi-lo novamente. Depois tive de fazer assim:

git push origin master -f

E destruiu os compromissos mais recentes do que os compromissos a que eu tinha voltado. Funcionou muito bem.

4
4
4
2010-01-28 03:48:38 +0000

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

4
4
4
2009-09-03 21:46:37 +0000

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

Se quiser manter o 3368e1c commit e apagar o bad8d5e commit a solução mais fácil é fazer um “git rebase -i HEAD~2” (ou seja, rebase interactivo dos dois últimos commits). Este comando irá lançar o seu editor de mensagens de commit e verá uma linha para cada uma das duas últimas commits. Aí basta apagar a linha de commit bad8d5e e salvar. git irá então reescrever o seu histórico e o 2º commit desaparecerá.

Existem outros comandos úteis que pode usar no editor de mensagens de commit como squash, edit, etc. A rebase interactiva é MUITO poderosa!

Não faças isto se alguém já viu estes commits (empurra ou puxa do teu repositório)!

1
1
1
2012-10-12 09:23:13 +0000
git checkout <treeish> -- /path/to/dir

Que trará de volta o directório a partir do “treeish” dado para o /caminho/para/dir

1
1
1
2012-02-28 20:17:27 +0000
git reset --hard {ref}

é a única forma de anular um compromisso se houver apenas um outro compromisso no acordo de recompra (por exemplo, compromisso inicial e mais 1). As outras formas (reverter, rebase) recusam-se a trabalhar, pelo menos a partir do 1.7.5.1.

Se seguir o git reset com um git gc, então o git irá realmente apagar completamente os dados antigos do commit do reporte.

0
0
0
2014-06-13 00:08:14 +0000

Consegui que isto funcionasse editando manualmente os códigos hash dos últimos commits dos ficheiros HEAD dentro da pasta do repositório:

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

Antes disso, nunca fui capaz de empurrar para a origem das operações UNMERGE que fiz localmente. Continuava a dizer que “não conseguia empurrar alguns refs” para o Repositório Central.