Excluir o último commit no bitbucket

103

Cometi um erro e não sei como excluir meu push mais recente no repositório. Eu puxo as atualizações mais recentes do aplicativo, mas há conflitos e empurro para o repositório.

Como deletar meu último commit? Ou como consertar?

Catarina
fonte

Respostas:

102

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.

asermax
fonte
Obrigado pela informação. E eu sei a consequência se eu deletar o commit, só não sei como desfazer minha ação porque é a primeira vez que cometi um erro. Preciso desfazer meu commit porque o sistema já está ativo. Somos apenas dois trabalhando com esse repositório.
catherine
git backout <REV>? Ou hg backout <REV>:?
Armando Pérez Marqués
Mas e se os commits adicionados após aquele a ser revertido tivessem feito modificações na linha sendo excluída?
rahs 01 de
@RahulSaha, já que o que você está fazendo é basicamente tentar mesclar um commit no branch, tenho certeza de que isso resultará em um conflito de mesclagem que você terá que resolver.
asermax 01 de
98

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.

Se você estiver tentando alterar um branch não mestre:

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

se você está tentando mudar o branch master

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 .

Lidando com colaboradores irritados

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-pickos 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.

naught101
fonte
1
Para aqueles que estão mais familiarizados com o uso do SourceTree: 1) Para alterar o branch principal na IU da web do BitBucket, consulte as Configurações do Repo. 2) Para excluir um branch na IU da web, olhe na página Ramificações. 3) Redefina o repo local conforme acima. 4) Empurre suas mudanças locais para recriar esses ramos.
Richard Le Mesurier
2
Como alguém que revelou acidentalmente um segredo, apreciei muito a eficácia dessa resposta. Obrigado!
Torque em
48

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.

Shubanker
fonte
O Github permitirá isso, mas até o momento em que este livro foi escrito, o Bitbucket não permite empurrões forçados.
JamesQMurphy,
4
na verdade, o bitbucket suporta push push apenas o diff é, em vez de remover completamente os commits não rastreados, ele os marca como excluídos.
Shubanker
A forma recomendada de bitbucket é usando reverter. Mas acho que no meu caso isso é mais apropriado. Uma vez que sou o único a usá-lo, parece mais limpo do que usar reverter. Obrigado.
nafsaka
1
Sim, isso ainda funciona no Bitbucket. Você acabou de me salvar um grande momento! Fiz um commit / push do meu Eclipse e me envolvi com outro projeto que tinha. Em parte devido a uma má prática de minha parte usando linha de comando e eclipse embutido para trabalhar no git.
DarkCygnus
brilhante, ou mais fácil: redefina o branch atual para este commit, então use aquele push forçado para consertar o servidor
Anthony Kal
3

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

SudoPlz
fonte
1
Cortar e colar é muito complicado. Além disso, isso não resolveria o problema da pergunta.
Daniel Lee
1
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.
naught101 01 de
1
A reversão do Git é o mecanismo igual ao anterior.
nafsaka
3

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.

rbento
fonte
2

Como já foi dito, geralmente você deseja usar hg backoutou 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 commitslink.

Remover link de commits nas configurações de bitbucket

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 Confirme 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.

nmichaels
fonte
Qual versão é essa e quais permissões são necessárias? Parece diferente no v6.4.3 que estou vendo, e este item não está lá. Eu sou o administrador do repositório.
Raphael de
1

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)

insira a descrição da imagem aqui

Exclua a última linha do commit inteiramente

3) salvar por ctrl+XouESC:wq

agora seu branch será atualizado sem seu último commit.

Mohideen bin Mohammed
fonte
1

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
invzbl3
fonte
0

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'.

smriti
fonte