Pergunta

Eu gostaria de saber como excluir um compromisso.

Por delete, Quero dizer, é como se eu não tivesse feito esse compromisso e, quando fiz um empurrão no futuro, minhas alterações não empurrarão para o ramo remoto.

Eu li ajuda git e acho que o comando que devo usar é git reset --hard HEAD. Isso está correto?

Foi útil?

Solução

Cuidadoso: git reset --hard Excluirá suas mudanças no diretório de trabalho. Tenha certeza de esconder todas as alterações locais que você deseja manter antes de executar este comando.

Supondo que você esteja sentado nesse compromisso, então este comando vai me mal

git reset --hard HEAD~1

o HEAD~1 significa o compromisso antes da cabeça.

Ou, você pode olhar para a saída de git log, Encontre o ID de confirmação do compromisso que você deseja fazer backup e depois faça isso:

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

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

git push origin HEAD --force

No entanto, se outros possam ter puxado, seria melhor iniciar um novo ramo. Porque quando eles puxam, ele apenas a mescla no trabalho deles, e você o empurrará novamente.

Se você já empurrou, pode ser melhor usar git revert, para criar uma confirmação de "imagem espelhada" que desfazerá as alterações. No entanto, ambas as confirmações estarão no log.


PARA SUA INFORMAÇÃO -- git reset --hard HEAD é ótimo se você quiser se livrar do trabalho em andamento. Ele o redefinirá de volta ao comprometimento mais recente e apagará todas as mudanças em sua árvore e índice de trabalho.


Por fim, se você precisar encontrar um compromisso que "excluiu", normalmente está presente em git reflog A menos que você tenha lixo coletado seu repositório.

Outras dicas

Se você ainda não pressionou o compromisso em nenhum lugar, pode usar git rebase -i para remover esse compromisso. Primeiro, descubra até que ponto esse comprometimento está (aproximadamente). Então faça:

git rebase -i HEAD~N

o ~N significa rebase o último N CONFIMENTOS (N deve ser um número, por exemplo HEAD~10). Em seguida, você pode editar o arquivo que o Git apresenta a você para excluir a confirmação ofensiva. Ao salvar esse arquivo, o GIT reescreverá todas as seguintes começos como se o que você excluiu não existisse.

O livro Git tem um bom Seção sobre Rebasing com fotos e exemplos.

Tenha cuidado com isso, porque se você mudar algo que você tenho Em outros lugares, será necessária outra abordagem, a menos que você planeje fazer um empurrão de força.

Outra possibilidade é um dos meus comandos favoritos:

git rebase -i <commit>~1

Isso começará a rebase no modo interativo -i No momento, pouco antes do compromisso, você deseja bater. O editor iniciará listando todas as confirmações desde então. Exclua a linha que contém a confirmação que você deseja obliterar e salvar o arquivo. Rebase fará o restante do trabalho, excluindo apenas esse comprometimento e reproduzindo todos os outros de volta ao tronco.

Estou anexando essa resposta porque não vejo por que alguém que acabou de tentar cometer trabalho gostaria de excluir todo esse trabalho por causa de algum erro usando o Git!

Se você deseja manter seu trabalho e apenas 'desfazer' esse comando comando (você pegou antes de pressionar para o repositório):

git reset --soft HEAD~1

Não use o -hard Sinalize a menos que você queira destruir seu trabalho em andamento desde a última confirmação.

Removendo uma confirmação inteira

git rebase -p --onto SHA^ SHA

Obviamente, substitua "sha" pela referência de que deseja se livrar. O "^" nesse comando é literal.

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

Se você não publicou alterações, para remover o último compromisso, você pode fazer

$ git reset --hard HEAD^

(Observe que isso também removeria todas as alterações não comprometidas; use com cuidado).

Se você já publicou comprometimento a ser excluído, use Git reverter

$ git revert HEAD
git reset --hard commitId

git push <origin> <branch> --force

PS: CommitID refere -se ao que você deseja reverter

Digamos que queremos remover as confirmações 2 e 4 do repositório.

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

Observação: Você precisa ter direitos de administrador sobre o repo já que você está usando --hard e -f.

  • git checkout b3d92c5 Confira o último compromisso utilizável.
  • git checkout -b repair Crie uma nova filial para trabalhar.
  • git cherry-pick 77b9b82 Execute o Commit 3.
  • git cherry-pick 2c6a45b Execute o Commit 1.
  • git checkout master Checkout mestre.
  • git reset --hard b3d92c5 Redefinir o mestre para durar o comprometimento utilizável.
  • git merge repair Mesclar nosso novo ramo para o mestre.
  • git push -f origin master Empurre o mestre para o repo remoto.

Mudar com força a história

Supondo que você não queira apenas excluir o último compromisso, mas deseja excluir compromissos específicos dos últimos n comprometidos, vá com:

git rebase -i HEAD~<number of commits to go back>, assim git rebase -i HEAD~5 Se você quiser ver os últimos cinco compromissos.

Então, no editor de texto, altere a palavra pick para drop Ao lado de cada compromisso que você gostaria de remover. Salve e saia do editor. Pronto!

Mudar de forma adicional

Tentar git revert <commit hash>. Reverter criará um novo Comprometa que desfruta da confirmação especificada.

Se você deseja consertar sua última confirmação, pode desfazer a confirmação e soltar os arquivos nele, fazendo:

git reset HEAD~1

Isso retornará seu repositório ao seu estado antes do Git Add comandos que encenavam os arquivos. Suas alterações estarão no seu diretório de trabalho. Cabeça ~ 1 refere -se à confirmação abaixo da ponta atual do ramo.

Se você deseja não se comprometer com os compromissos, mas mantenha as alterações de código em seu diretório de trabalho:

git reset HEAD~N

Se você deseja se livrar do seu último compromisso e não quiser manter as alterações do código, pode fazer uma redefinição "dura".

git reset --hard HEAD~1

Da mesma forma, se você deseja descartar os últimos n comprometidos, e não deseja manter as alterações do código:

git reset --hard HEAD~N
git rebase -i HEAD~2

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

'git rebase -i HEAD`

Se você deseja rebase todos os compromissos.

Então você poderá escolher uma dessas 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

Essas linhas podem ser reordenadas; Eles são executados de cima para baixo. Se você remover uma linha aqui, esse compromisso será perdido. No entanto, se você remover tudo, a rebase será abortada. Observe que os compromissos vazios são comentados

Você pode simplesmente remover esse comprometimento usando a opção "D" ou removendo uma linha que tem sua confirmação.

Para excluir na filial local, use

git reset --hard HEAD~1

Para excluir em um ramo remoto, use

git push origin HEAD --force

Aqui está outra maneira de fazer isso:

Confira a ramificação que você deseja reverter e redefinir sua cópia local de trabalho de volta para a confirmação de que você deseja ser o mais recente no servidor remoto (tudo depois de se despedir). Para fazer isso, no SourCetree, cliquei com o botão direito do mouse no "nome de redefinição de redefinição para esse comprometimento" selecionei. Eu acho que a linha de comando é:

git reset --hard COMMIT_ID

Como você acabou de fazer check -out da sua filial, não terá mudanças locais para se preocupar em perder. Mas isso os perderia se você o fizesse.

Em seguida, navegue para 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

Isso apagará todos os compromissos após o atual do seu repositório local, mas apenas para esse ramo.

O erro:

EU git rebase -i --rootED meu ramo, pensando ignorantemente que poderia reformar o primeiro compromisso diferente do mestre (o Github para Windows A visualização padrão é a comparação com o mestre, escondendo sua totalidade).

Eu cultivei uma barba do Vale do Silício, enquanto 900 mais de compromissos se carregavam em sublime. Sair sem alterações, carreguei minha bateria e depois deva a barbear, pois todos os mais de 900 cometidos individuais cometidos com indiferença rejeitados - redefinindo seus tempos de compromisso agora.

Determinado a vencer o Git e preservar os tempos originais, eu excluí este repositório local e clonei novamente do controle remoto.

Agora, ele havia re-adquirido um compromisso desnecessário mais recente de mestre que eu desejava remover, por isso prossegui.

Esgotar as opções:

Eu não queria git revert - Isso criaria uma confirmação adicional, dando a Git a vantagem.

git reset --hard HEAD não fez nada, depois de verificar o reflog, o último e único HEAD foi o clone - Git vence.

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

Depois de pensar git reset --hard <SHA> Hanerava, atualizei outra filial para dominar e 1 ... 2 ... Poof! O compromisso estava de volta - Git vence.

Verificando de volta para o Mestre, hora de tentar git rebase -i <SHA>, depois remova a linha ... sem sucesso, é triste dizer. "Se você remover uma linha aqui, esse compromisso será perdido". Ah ... encoberto o novo recurso Troll o N00B no 2.8.3 Notas de liberação.

A solução:

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

Para verificar, verifiquei com outro ramo e pronto - sem se esconder para buscar/puxar o mestre.

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

Bom dia para você.

Todos os comandos acima restauram o estado da sua árvore de trabalho e o índice como eram antes de fazer o compromisso, mas não restauram o estado do repositório. Se você olhar para ele, a confirmação "removida" não será removida, simplesmente não é a da ponta da ramificação atual.

Eu acho que não há meios para remover um commit com Comandos de porcelana. A única maneira é removê -lo do tronco e refletir e depois executar um git prune --expire -now.

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

Exclua o último compromisso

Por exemplo, seu último compromisso

Git Push Origin +AA61AB32^: Mestre

Agora você deseja excluir este compromisso, então uma maneira fácil de fazer isso seguinte

Passos

  1. Primeiro redefinir a filial para o pai da confirmação atual

  2. Faça força para o controle remoto.

git reset HEAD^ --hard

git push origin -f

Para um comprometimento particular, você deseja redefinir

git reset bb676878^ --hard

git push origin -f

Se você acabou de estragar sua última confirmação (mensagem errada, esqueceu de adicionar algumas alterações) e deseja corrigi -la antes de empurrá -la para um repo público, por que não usar:

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

Se você tiver alterações recentemente encenadas, elas serão combinadas com a última confirmação (da qual você está tentando se livrar) e substituirá essa confirmação.

Obviamente, se você alterar um compromisso depois de pressioná -lo, estará reescrevendo o histórico; portanto, se você fizer isso, não se esqueça de entender as implicações.

Você também pode passar na opção '--não edit' em vez de '-m', se preferir usar a mensagem do Commit Anterior.

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

Se você deseja manter a história, mostrando o compromisso e o revertido, você deve usar:

git revert GIT_COMMIT_HASH

Digite a mensagem explicando por que você está revertendo e depois:

git push  

Quando você emite git log Você verá as duas mensagens de log "erradas" e revertem.

Se você já empurrou, primeiro encontre o compromisso que deseja estar na cabeça ($ Git_commit_hash_here), depois execute o seguinte:

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

Em seguida, cada lugar o repo foi clonado, executado:

git reset --hard origin/master

O que eu faço geralmente quando começo e pressiono (se alguém pressionou o seu compromisso, resolva o problema):

git reset --hard HEAD~1

git push -f origin

Espero que isso ajude

Redefinir na filial local

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

Force Push to Origin

git push -f origin

Retire o backup do seu código na pasta Temper. A seguir, o comando redefinirá o mesmo que o servidor.

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

Se você deseja manter suas alterações e remover compromissos recentes

git reset --soft HEAD^
git pull

delete local commit

Como você pode ver na imagem acima, eu quero excluir reverter "Teste Change 2" Commit (sha1 ID: 015B5220C50E3DFBB1063F23789D92AE1D3481A2(Você pode obter o SHA1 ID usando gitk comando em git bash)).

Para isso, eu posso usar (tudo abaixo do trabalho de comando apenas no local. Você precisa pressionar após excluir):

  1. git reset --hard 515b5220c50e3dfbb1063f23789d92ae1d3481a2 // backup você para esse compromisso (sha1 id de Mudança de teste 4 comprometer é 515B5220C50E3DFBB1063F23789D92AE1D3481A2)
  2. git reset --hard HEAD~1 // Backup você antes de um compromisso.
  3. git reset --hard HEAD^ // para remover o último compromisso do git

Depois de excluir:

after delete commit

Eu já empurrei. Precisa devolver algumas confirmações de volta remota. Tentei muitas variações, mas apenas isto a partir de Justin Via Git Bush está funcionando bem para mim:

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

Reset Git -Hard

Git Push Origin Head -Force

Se um ou mais dos commits forem marcados, exclua as tags primeiro. Caso contrário, a confirmação marcada não será removida.

// display git commit log    
$ git log --pretty=oneline --abbrev-commit

// show last two commit and open in your default editor
// then delete second commit line and save it
$ git rebase -i HEAD~2

Referência: Como excluir um compromisso no Git, local e remoto

Supondo que você não tenha empurrado para o repositório remoto, você pode recarregar novamente o repositório. Este tem sido o meu método de escolha algumas vezes.

Use o git reverter https://git-scm.com/docs/git-revert .Terá reverter todo o código, então você poderá fazer o próximo comprometimento. Então, a cabeça apontará para esse último compromisso. Os compromissos revertidos nunca excluem, mas isso não afetará o último comprometimento.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top