Respostas:
Em primeiro lugar, se você está trabalhando com outras pessoas no mesmo repositório de código, você não deve excluir um commit, pois quando você força a atualização no repositório, isso deixará os repositórios locais de seus colegas de trabalho em um estado ilegal (por exemplo, se eles fez commits após aquele que você excluiu, esses commits serão inválidos, pois foram baseados em um commit inexistente).
Dito isso, o que você pode fazer é reverter o commit. Este procedimento é feito de forma diferente (comandos diferentes) dependendo do CVS que você está usando:
No git :
git revert <commit>
No mercurial :
hg backout <REV>
EDITAR: A operação de reversão cria um novo commit que faz o oposto do commit revertido (por exemplo, se o commit original adicionou uma linha, o commit de reversão deleta essa linha), efetivamente removendo as mudanças do commit indesejado sem reescrever o histórico do repositório.
git backout <REV>
? Ou hg backout <REV>
:?
Se você não está trabalhando com outros (ou está feliz em causar-lhes um aborrecimento significativo) , então é possível remover os commits dos branches do bitbucket.
git reset HEAD^ # remove the last commit from the branch history
git push origin :branch_name # delete the branch from bitbucket
git push origin branch_name # push the branch back up again, without the last commit
No git geralmente, o branch master não é especial - é apenas uma convenção. No entanto, bitbucket e github e sites semelhantes geralmente exigem que haja um branch principal (presumivelmente porque é mais fácil do que escrever mais código para lidar com o evento de que um repositório não tem branches - não tenho certeza). Portanto, você precisa criar um novo branch e torná-lo o principal:
# on master:
git checkout -b master_temp
git reset HEAD^ # undo the bad commit on master_temp
git push origin master_temp # push the new master to Bitbucket
No Bitbucket, vá para as configurações do repositório e altere o "Branch principal" para master_temp
(no Github, altere o "branch padrão").
git push origin :master # delete the original master branch from Bitbucket
git checkout master
git reset master_temp # reset master to master_temp (removing the bad commit)
git push origin master # re-upload master to bitbucket
Agora vá para o Bitbucket e deverá ver o histórico que deseja. Agora você pode ir para a página de configurações e alterar o branch principal de volta para master
.
Este processo também funcionará com quaisquer outras alterações de histórico (por exemplo git filter-branch
). Você apenas tem que se certificar de redefinir os commits apropriados, antes que o novo histórico se separe do antigo.
editar : aparentemente, você não precisa ter todo esse trabalho no github, já que pode forçar um push de reset .
Da próxima vez que alguém tentar fazer um pull de seu repositório (se já tiver puxado o commit incorreto), o pull falhará. Eles terão que redefinir manualmente para um commit antes do histórico alterado, e então puxar novamente.
git reset HEAD^
git pull
Se eles retiraram o commit ruim e se comprometeram em cima dele , então eles terão que reiniciar, e então git cherry-pick
os commits bons que eles querem criar, recriando efetivamente todo o branch sem o commit ruim.
Se eles nunca retiraram o commit ruim, todo esse processo não os afetará e eles podem fazer o pull normalmente.
você pode redefinir para, em HEAD^
seguida, force push.
git reset HEAD^
git push -u origin master --force
Ele irá deletar seu último commit e irá refletir no bitbucket como commit deletado, mas ainda permanecerá em seu servidor.
Tive problemas com git revert no passado (principalmente porque não tenho certeza de como funciona). Tive problemas para reverter por causa de problemas de mesclagem.
Minha solução simples é esta.
Passo 1.
git clone <your repos URL> .
seu projeto em outra pasta, então:
Passo 2.
git reset --hard <the commit you wanna go to>
em seguida, Etapa 3.
em seu diretório de projeto mais recente (e principal) (aquele que tem o último commit problemático) cole os arquivos da etapa 2
Passo 4.
git commit -m "Fixing the previous messy commit"
Etapa 5.
Aproveitar
git revert
é simples: ele cria um novo commit que faz o reverso das mudanças em um commit anterior (ou commits múltiplos). Ele não exclui commits, então não é relevante para esta questão. Além disso, a etapa de clonagem aqui não é realmente necessária.
Aqui está uma abordagem simples em até 4 etapas:
0 - Avise a equipe que você vai consertar o repositório
Conecte-se com a equipe e informe-os sobre as próximas mudanças.
1 - Remova o último commit
Supondo que seu branch alvo seja master
:
$ git checkout master # move to the target branch
$ git reset --hard HEAD^ # remove the last commit
$ git push -f # push to fix the remote
Neste ponto, você terá concluído se estiver trabalhando sozinho.
2 - Corrija os repositórios locais do seu colega de equipe
No de seu colega de equipe:
$ git checkout master # move to the target branch
$ git fetch # update the local references but do not merge
$ git reset --hard origin/master # match the newly fetched remote state
Se o seu companheiro de equipe não tinha novos commits, você terminou neste ponto e deve estar sincronizado.
3 - Trazendo de volta commits perdidos
Digamos que um colega de equipe tivesse um commit novo e não publicado que foi perdido neste processo.
$ git reflog # find the new commit hash
$ git cherry-pick <commit_hash>
Faça isso para quantos commits forem necessários.
Usei essa abordagem com sucesso muitas vezes. Exige um esforço de equipe para garantir que tudo esteja sincronizado.
Como já foi dito, geralmente você deseja usar hg backout
ou git revert
. No entanto, às vezes você realmente deseja se livrar de um commit.
Primeiro, você vai querer ir para as configurações do seu repositório. Clique no Strip commits
link.
Insira a ID do changeset para o changeset que deseja destruir e clique em Preview strip
. Isso permitirá que você veja que tipo de dano está prestes a causar antes de fazê-lo. Em seguida, basta clicar Confirm
e seu commit não é mais história. Certifique-se de dizer a todos os seus colaboradores o que você fez, para que eles não atrasem acidentalmente o commit ofensivo.
Uma vez que as alterações foram confirmadas, não será possível excluí-las. porque a natureza básica do commit é não deletar.
O que você pode fazer (método fácil e seguro),
Rebase interativo:
1) git rebase -i HEAD~2
#will mostrará seus 2 commits recentes
2) Seu commit irá listar como, Recente aparecerá na parte inferior da página LILO (último na última saída)
Exclua a última linha do commit inteiramente
3) salvar por ctrl+X
ouESC:wq
agora seu branch será atualizado sem seu último commit.
Você pode escrever o comando também para o Bitbucket, conforme mencionado por Dustin :
git push -f origin HEAD^:master
Nota: em vez de master você pode usar qualquer branch. E ele exclui basta empurrar o Bitbucket.
Para remover o último commit localmente no git, use:
git reset --hard HEAD~1
Até agora, o cloud bitbucket (não tenho certeza de qual versão) permite reverter um commit do sistema de arquivos da seguinte maneira (não vejo como reverter a partir da interface do Bitbucket no navegador Chrome).
-backup de todo o seu diretório para proteger as alterações que você inadvertidamente cometeu
-selecionar diretório retirado
-botão direito do mouse: menu git tartaruga
-repo-browser (a opção de menu 'reverter' apenas desfaz as alterações não confirmadas)
- pressione o botão HEAD
-selecione a linha superior (o último commit)
-botão direito do mouse: reverter alteração por este commit
- depois de desfazer as mudanças no sistema de arquivos, pressione commit
- isso atualiza o GIT com uma mensagem 'Reverter (sua mensagem anterior). Isso reverte o commit fulano de tal '
-selecione 'confirmar e enviar'.