Excluir commits de um ramo na Git

votos
2k

Eu gostaria de saber como excluir um commit.

Por delete, quero dizer, é como se eu não fiz que cometem, e quando eu faço um empurrão no futuro, as minhas alterações não vai empurrar para o ramo remoto.

Eu li git ajuda, e eu acho que o comando que eu deveria usar é git reset --hard HEAD. Isso é correto?

Publicado 27/08/2009 em 04:39
fonte usuário
Em outras línguas...                            


27 respostas

votos
3k

Cuidado: git reset --hard excluirá seus TRABALHO alterações de diretório . Certifique-se de guardar quaisquer alterações locais que você deseja manter antes de executar este comando.

Supondo que você está sentado em que cometeu, então este comando irá wack-lo ...

git reset --hard HEAD~1

Os HEAD~1meios a confirmação antes de cabeça.

Ou, você pode olhar para a saída git log, encontrar o id do commit que você deseja fazer backup e, em seguida fazer isso comprometer:

git reset --hard <sha1-commit-id>

Se você já empurrou-o, você vai precisar fazer um empurrão força para se livrar dele ...

git push origin HEAD --force

No entanto , se outros podem ter puxado-lo, então você seria melhor começar um novo ramo. Porque quando eles puxam, ela só vai fundi-lo em seu trabalho, e você vai buscá-la empurrado para trás de novo.

Se você já empurrou, pode ser melhor usar git revert, para criar uma "imagem de espelho" comprometer que irá desfazer as alterações. No entanto, ambos os commits será no log.


FYI - git reset --hard HEADé ótimo se você quiser se livrar de trabalho em andamento. Ele irá repor de volta para o mais recente cometer, e apagar todas as mudanças em sua árvore de trabalho e índice.


Por último, se você precisa encontrar um commit que você "excluído", que está normalmente presente em git reflogmenos que você tenha coletado seu repositório.

Respondeu 27/08/2009 em 04:44
fonte usuário

votos
588

Se você ainda não se empurrou a cometer qualquer lugar, você pode usar git rebase -ipara remover que cometeu. Em primeiro lugar, descobrir o quão longe que cometem é (aproximadamente). Então faça:

git rebase -i HEAD~N

Os ~Nmeios rebase últimos Ncommits ( Ndeve ser um número, por exemplo HEAD~10). Em seguida, você pode editar o arquivo que Git apresenta-lhe para apagar o agressor cometeu. Em salvar esse arquivo, Git, então, reescrever todas as seguintes commits como se o que você excluiu não existia.

O Livro Git tem uma boa seção sobre rebasing com imagens e exemplos.

Tenha cuidado com isso, porém, porque se você mudar algo que você ter empurrado em outros lugares, será necessária outra abordagem a menos que você está planejando fazer um empurrão vigor.

Respondeu 27/08/2009 em 04:51
fonte usuário

votos
406

Outra possibilidade é um dos meus comandos favoritos pessoais:

git rebase -i <commit>~1

Isto irá iniciar o rebase no modo interativo -ino ponto logo antes da submissão você quer bater. O editor irá iniciar listando todos os commits desde então. Excluir a linha que contém a confirmação de que quer apagar e salvar o arquivo. Rebase fará o resto do trabalho, excluindo apenas a cometer, e repetindo todos os outros de volta para o log.

Respondeu 27/08/2009 em 04:49
fonte usuário

votos
276

Estou anexando esta resposta, porque eu não vejo por que alguém que acaba tentou cometer o trabalho iria querer eliminar todo esse trabalho por causa de algum erro usando Git!

Se você quiser manter o seu trabalho e apenas 'desfazer' que cometem comando (você pegou antes de empurrar para repo):

git reset --soft HEAD~1

Não use o --hard bandeira a menos que queira destruir o seu trabalho em andamento desde o último commit.

Respondeu 15/10/2012 em 19:17
fonte usuário

votos
46

Se você não publicar as alterações, para remover mais recente cometer, você pode fazer

$ git reset --hard HEAD^

(Note que isso também iria remover todas as alterações não confirmadas; use com cuidado).

Se você já publicou a-ser-excluídos cometer, uso git revert

$ git revert HEAD
Respondeu 27/08/2009 em 11:47
fonte usuário

votos
40

Remoção de um commit todo

git rebase -p --onto SHA^ SHA

Obviamente substituir "SHA" com a referência que você quer se livrar. O "^" nesse comando é literal.

http://sethrobertson.github.io/GitFixUm/fixup.html

Respondeu 31/08/2015 em 19:36
fonte usuário

votos
31
git reset --hard commitId

git push <origin> <branch> --force

PS: CommitId refere-se a uma que você quiser voltar a

Respondeu 16/10/2014 em 10:51
fonte usuário

votos
29

Se você quiser corrigir o seu mais recente cometer, você pode desfazer a cometer, e unstage os arquivos nele, fazendo:

git reset HEAD~1

Isso irá retornar seu repositório ao seu estado antes do git add comandos que protagonizaram os arquivos. Suas alterações serão em seu diretório de trabalho. CABEÇA ~ 1 refere-se ao comprometer abaixo da ponta actual do ramo.

Se você quiser uncommit N compromete, mas manter as alterações de código no seu diretório de trabalho:

git reset HEAD~N

Se você quiser se livrar de sua mais recente cometer, e não deseja manter as alterações de código, você pode fazer um "hard" reset.

git reset --hard HEAD~1

Da mesma forma, se você deseja descartar a última N comete, e não deseja manter as alterações de código:

git reset --hard HEAD~N
Respondeu 31/05/2014 em 08:19
fonte usuário

votos
19

Histórico de Alterações à força

Supondo que você não apenas quer apagar a última confirmação, mas que deseja excluir commits específicas da última n compromete, ir com:

git rebase -i HEAD~<number of commits to go back>, Então git rebase -i HEAD~5se você quiser ver os últimos cinco commits.

Em seguida, no editor de texto alterar a palavra pickao droplado de cada submissão que você gostaria de remover. Salve e saia do editor. Voila!

Histórico de Alterações aditiva

Experimente git revert <commit hash>. Reverter irá criar um novo commit que desfaz o especificado cometer.

Respondeu 15/06/2017 em 23:01
fonte usuário

votos
15

Digamos que deseja remover commits 2 e 4 do repo.

commit 0 : b3d92c5
commit 1 : 2c6a45b
commit 2 : <any_hash>
commit 3 : 77b9b82
commit 4 : <any_hash>

Nota: Você precisa ter direitos de administrador sobre o repo desde que você está usando --harde -f.

  • git checkout b3d92c5 Checkout da última utilizável cometer.
  • git checkout -b repair Criar um novo ramo para trabalhar.
  • git cherry-pick 77b9b82 Executado através de cometer 3.
  • git cherry-pick 2c6a45b Executado através de cometer 1.
  • git checkout master mestre Checkout.
  • git reset --hard b3d92c5 Redefinição mestre para durar utilizável cometer.
  • git merge repair Mesclar a nossa nova filial em mestre.
  • git push -f origin master Empurre mestre para o repo remoto.
Respondeu 05/09/2017 em 07:19
fonte usuário

votos
14
git rebase -i HEAD~2

Aqui '2' é o número de commits que você deseja rebase.

'git rebase -i HEAD`

se você quiser rebase todos os commits.

Então, você será capaz de escolher uma destas opções.

p, pick = use commit

r, reword = use commit, but edit the commit message

e, edit = use commit, but stop for amending

s, squash = use commit, but meld into previous commit

f, fixup = like "squash", but discard this commit's log message

x, exec = run command (the rest of the line) using shell

d, drop = remove commit

Estas linhas podem ser re-ordenada; eles são executados de cima para baixo. Se você remover uma linha aqui que cometem serão perdidos. No entanto, se você remover tudo, o rebase será abortado. Note-se que commits vazias são comentadas

Você pode simplesmente remover que cometem usando a opção "d" ou removendo uma linha que tem o seu cometer.

Respondeu 18/05/2016 em 23:39
fonte usuário

votos
11

Para excluir na filial local, use

git reset --hard HEAD~1

Para apagar de uma filial remota, use

git push origin HEAD --force
Respondeu 28/08/2014 em 17:06
fonte usuário

votos
7

O erro:

I git rebase -i --root'ed meu ramo, ignorantemente pensando que eu poderia reformular o primeiro cometer diferindo do master (o GitHub para Windows modo de exibição padrão é a comparação de dominar, escondendo sua totalidade).

Eu cresci uma barba Silicon Valley enquanto 900+ commits carregado se em Sublime. Sair sem alterações, I cobrada meu bateria então começou a fazer a barba, como todos 900+ indivíduo comete indiferente rebased - redefinindo suas vezes cometem agora.

Determinado a vencer Git e preservar as vezes originais, eu apaguei este repositório local e re-clonado a partir do controle remoto.

Agora que tinha adicionado novamente a mais recente desnecessário comprometer a dominar desejei para remover, assim que procedeu assim.

Esgotar as opções:

Eu não queria git revert- ela criaria cometer um adicional, dando Git a mão superior.

git reset --hard HEADnão fez nada, depois de verificar o reflog, o último e único HEADfoi o clone - Git ganha.

Para obter o mais recente SHA, eu verifiquei o repositório remoto em github.com - menor vitória.

Depois de pensar git reset --hard <SHA>tinha trabalhado, eu atualizei outro ramo de dominar e 1 ... 2 ... puf! o commit estava de volta - Git ganha.

A verificação de volta para mestre, tempo para tentar git rebase -i <SHA>, em seguida, remova a linha ... sem sucesso, é triste dizer. " Se você remover uma linha aqui que cometem SERÃO PERDIDAS ". Ah ... encoberto novo recurso vasculham a n00b nos 2.8.3 notas de lançamento .

A solução:

git rebase -i <SHA>então d, drop = remove commit.

Para verificar, eu verifiquei para outro ramo, e voila - sem esconder comprometem a buscar / pull do mestre.

https://twitter.com/holman/status/706006896273063936

Bom dia para você.

Respondeu 25/05/2016 em 20:33
fonte usuário

votos
7

Aqui está outra maneira de fazer isso:

Saída do ramo que deseja reverter, em seguida, redefinir a sua cópia de trabalho local de volta para o commit que você quer ser o mais recente no servidor remoto (tudo depois ele vai bye-bye). Para fazer isso, no SourceTree eu cliquei direito sobre o e selecionou "Reset BRANCHNAME a esta cometer". Eu acho que a linha de comando é:

git reset --hard COMMIT_ID

Desde que você acabou de check-out seu ramo de controle remoto, você não vai ter quaisquer alterações locais se preocupar em perder. Mas isso iria perdê-los se você fez.

Em seguida, navegue até o diretório local do seu repositório e execute este comando:

git -c diff.mnemonicprefix=false -c core.quotepath=false \
push -v -f --tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME

Isto irá apagar todas as submissões após o atual em seu repositório local, mas apenas para que um ramo.

Respondeu 13/05/2013 em 18:20
fonte usuário

votos
7

Todos os comandos acima restaurar o estado da sua árvore de trabalho e índice de como eram antes de fazer o commit, mas não restaurar o estado do repositório. Se você olhar para ele, a "removido" comprometer não é realmente removido, não é simplesmente a da ponta do ramo atual.

Eu acho que não há meios para remover um commit com comandos de porcelana . A única maneira é para removê-lo do registro e reflog e, em seguida, para executar um git prune --expire -now.

Respondeu 04/10/2012 em 08:19
fonte usuário

votos
5

Se você quiser manter a história, mostrando a cometer e a reversão, você deve usar:

git revert GIT_COMMIT_HASH

digite a mensagem explicando por que você está revertendo e, em seguida:

git push  

Quando você emite git logvocê verá ambos os "errados" mensagens de log cometem e reverter.

Respondeu 07/01/2015 em 15:13
fonte usuário

votos
5

Se você apenas desarrumada seu último commit (mensagem errada, esqueceu de acrescentar algumas mudanças) e deseja corrigi-lo antes de empurrá-lo para um repositório público por que não usar:

git commit --amend -m "New message here"

Se você tiver recentemente mudanças encenado eles vão ser combinado com o último commit (que você está tentando se livrar de) e irá substituir que cometeu.

Claro, se você alterar um commit depois que você empurrou-o, você está reescrevendo a história então se você fizer isso certifique-se de compreender as implicações.

Você também pode passar a opção '--no-edit' em vez de '-m' se você preferir usar o anterior mensagem de cometer.

Docs: http://git-scm.com/docs/git-commit.html

Respondeu 27/05/2014 em 00:24
fonte usuário

votos
3

Fonte: https://gist.github.com/sagarjethi/c07723b2f4fa74ad8bdf229166cf79d8

Excluir o último commit

Por exemplo seu último commit

origem git push + aa61ab32 ^: mestre

Agora você deseja excluir esta comprometer em seguida, uma maneira fácil de fazer isso seguinte

Passos

  1. Primeiro redefinir o ramo para o pai do atual cometer

  2. Force-empurrá-lo para o controle remoto.

git reset HEAD^ --hard

git push origin -f

Para commit particular, pretende repor está seguindo

git reset bb676878^ --hard

git push origin -f
Respondeu 22/06/2018 em 13:40
fonte usuário

votos
2

O que eu faço geralmente quando eu cometer e push (se alguém empurrou a cometer este resolver o problema):

git reset --hard HEAD~1

git push -f origin

Esperamos que esta ajuda

Respondeu 14/06/2017 em 09:22
fonte usuário

votos
1

Se você já empurrou, primeiro encontrar o commit você quer ser em CABEÇA ($ GIT_COMMIT_HASH_HERE) , em seguida, execute o seguinte:

git reset --hard $GIT_COMMIT_HASH_HERE
git push origin HEAD --force

Em seguida, cada lugar do repo foi clonado, execute:

git reset --hard origin/master
Respondeu 30/01/2017 em 00:25
fonte usuário

votos
0

excluir locais cometer

Como você pode ver na imagem acima i deseja excluir revert "mudança de teste 2" commit (ID SHA1: 015b5220c50e3dfbb1063f23789d92ae1d3481a2 (você pode obter ID SHA1 usando gitkcomando em bash git)).

Para que eu possa usar (. Todos abaixo comando trabalho em apenas local que você precisa para empurrar após delete):

  1. git reset --hard 515b5220c50e3dfbb1063f23789d92ae1d3481a2//-lo back-up você que cometem (ID SHA1 de mudança de teste 4 cometer é 515b5220c50e3dfbb1063f23789d92ae1d3481a2 )
  2. git reset --hard HEAD~1 //-lo back-up antes um commit.
  3. git reset --hard HEAD^ // Para remover a última confirmação de git

após eliminar:

após eliminar cometer

Respondeu 03/07/2018 em 06:51
fonte usuário

votos
0

Repor na filial local

git reset --hard HEAD~<Number of commit> So git reset --hard HEAD~3

empurrão força a origem

git push -f origin
Respondeu 29/05/2018 em 07:38
fonte usuário

votos
0

usar git reverter https://git-scm.com/docs/git-revert .Ele irá reverter todo o código, então você pode fazer a seguir cabeça commit.Then irá apontar para essa última cometer. revertidos não compromete excluir, mas isso não afetará em você último commit.

Respondeu 01/03/2017 em 15:15
fonte usuário

votos
0

git redefinir --hard

git push --force origem CABEÇA

Se um ou mais dos commits é marcado, exclua a tag (s) em primeiro lugar. Caso contrário os marcado comprometer não é removido.

Respondeu 24/07/2015 em 14:45
fonte usuário

votos
0

Supondo que você não empurrou para o repositório remoto, você poderia re-clonar o repositório. Este tem sido o meu método de escolha algumas vezes.

Respondeu 31/12/2014 em 06:54
fonte usuário


votos
-1

Ter backup de seu código para a pasta temporária. Seguinte comando irá repor mesmo servidor.

git reset --hard HEAD
git clean -f
git pull

Em seguida, copie os arquivos necessários sozinho de pasta temporária, em seguida, confirmar

Respondeu 14/07/2016 em 11:25
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more