Gostaria de saber como excluir uma confirmação.
Por delete
, quero dizer, é como se eu não fizesse esse commit e, quando eu fizer um push no futuro, minhas alterações não serão enviadas para o branch remoto.
Eu li a ajuda do git e acho que o comando que devo usar é git reset --hard HEAD
. Isso está correto?
git
git-rebase
git-reset
hap497
fonte
fonte
cherry-pick
edelete
uma única confirmação que ocorreu há algum tempo.git rebase -i HEAD~10
aborda a questão, pois permite que você escolha arbitrariamente as confirmações para excluir. O Git aplica as confirmações no intervalo especificado por você, ignorando as confirmações removidas do log. Eu usei esse comando hoje para me livrar do segundo e terceiro commit mais recentes do meu repositório, mantendo o primeiro. Concordo que nenhuma das outras respostas seja satisfatória.Respostas:
Cuidado:
git reset --hard
EXCLUIRÁ SUAS MUDANÇAS DE DIRETÓRIO DE TRABALHO . Certifique-se de guardar quaisquer alterações locais que você deseja manter antes de executar este comando.Supondo que você esteja sentado nesse commit, esse comando o deixará louco ...
Os
HEAD~1
meios que o commit antes da cabeça.Ou, você pode olhar para a saída de
git log
, encontrar o ID da confirmação da qual você deseja fazer backup e, em seguida, faça o seguinte:Se você já o empurrou, precisará fazer um empurrão forçado para se livrar dele ...
No entanto , se outros tiverem conseguido, é melhor iniciar um novo ramo. Porque quando eles puxam, isso simplesmente o mesclará no trabalho deles, e você o empurrará novamente.
Se você já enviou, pode ser melhor usar
git revert
, criar uma confirmação de "imagem em espelho" que desfará as alterações. No entanto, ambas as confirmações estarão no log.FYI -
git reset --hard HEAD
é ótimo se você quiser se livrar do WORK IN PROGRESS. Ele o redefinirá para a confirmação mais recente e apagará todas as alterações na sua árvore e índice de trabalho.Por fim, se você precisar encontrar um commit que você "excluiu", ele normalmente estará presente, a
git reflog
menos que você tenha coletado lixo no seu repositório.fonte
HEAD~1
ou apenasHEAD^
. Se você pressionou, você deve usargit revert
.HEAD~n
para "voltar"n
confirma da sua cabeça. Talvez a partir deste ponto você possa interpretar... --hard HEAD
também comoHEAD~0
=> excluir trabalho em andamento.reset --hard
e verificarlog --oneline --all
as confirmações ainda permanecem na árvore. Como excluímos esses commits da árvore? Obrigado.reset --soft
para excluir o commit local SEM reverter o trabalho em andamento!Se você ainda não enviou o commit em nenhum lugar, pode
git rebase -i
removê-lo. Primeiro, descubra até que ponto esse commit está (aproximadamente). Então faça:Os
~N
meios rebase os últimosN
commits (N
devem ser um número, por exemploHEAD~10
). Em seguida, você pode editar o arquivo que o Git apresenta para você para excluir a confirmação incorreta. Ao salvar esse arquivo, o Git reescreverá todas as confirmações a seguir, como se a que você excluiu não existisse.O Git Book tem uma boa seção sobre rebasing com fotos 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.
fonte
push -f
para forçar o envio e substituir a filial remota pela local. Se for apenas seu próprio repositório remoto, não há problema. O problema começa se alguém tiver buscado nesse meio tempo.git rebase -i HEAD~5
comando era exatamente o que eu precisava para remover completamente esse commit do meu repositório local! Obrigado!rebase -i
, as alterações correspondentes à confirmação excluída não são preservadas.Outra possibilidade é um dos meus comandos favoritos pessoais:
Isso iniciará o rebase no modo interativo
-i
no momento imediatamente anterior ao commit que você deseja executar. O editor começará listando todos os commits desde então. Exclua a linha que contém a confirmação que você deseja eliminar e salve o arquivo. O rebase fará o restante do trabalho, excluindo apenas esse commit e reproduzindo todos os outros novamente no log.fonte
git rebase --continue
git rebase -i HEAD~1
git rebase -i HEAD~1
realmente limpou muito o repo! É difícil dizer exatamente o que fez, mas a coisa toda parece muito mais organizada. Um pouco alarmante, na verdade.Estou acrescentando esta resposta porque não vejo por que alguém que acabou de tentar cometer trabalho desejaria excluir todo esse trabalho por causa de algum erro ao usar o Git!
Se você deseja manter seu trabalho e apenas 'desfazer' esse comando de confirmação (você capturou antes de pressionar para repo):
Não use o sinalizador --hard, a menos que queira destruir seu trabalho em andamento desde a última confirmação.
fonte
git reset --hard HEAD~1
a confirmação mais recente anterior estar disponível via reflog (até que você expire); veja também aqui: gitready.com/intermediate/2009/02/09/…Removendo um commit inteiro
Obviamente, substitua "SHA" pela referência da qual você deseja se livrar. O "^" nesse comando é literal.
http://sethrobertson.github.io/GitFixUm/fixup.html#change_deep
fonte
-p, --preserve-merges
Recrie confirmações de mesclagem em vez de nivelar o histórico reproduzindo confirmações introduzidas por uma consolidação de mesclagem. As resoluções de conflito de mesclagem ou emendas manuais para mesclar confirmações não são preservadas.Se você não publicou alterações, para remover a confirmação mais recente, você pode fazer
(observe que isso também removeria todas as alterações não confirmadas; use com cuidado).
Se você já publicou o commit a ser excluído, use git revert
fonte
tree = log --all --graph --format=format:'%C(bold blue)%h%C(reset) %C(dim black)%s%C(reset)%C(bold red)%d%C(reset) %C(green)by %an, %ar%C(reset)'
Digamos que queremos remover as confirmações 2 e 4 do repositório.
Nota: Você precisa ter direitos de administrador sobre o repositório, pois está usando
--hard
e-f
.git checkout b3d92c5
Finalize o último commit utilizável.git checkout -b repair
Crie uma nova ramificação para trabalhar.git cherry-pick 77b9b82
Execute o commit 3.git cherry-pick 2c6a45b
Execute o commit 1.git checkout master
Mestre do Google Checkout.git reset --hard b3d92c5
Redefina o mestre para a última confirmação utilizável.git merge repair
Mesclar nossa nova filial ao mestre.git push -f origin master
Empurre o mestre para o repositório remoto.fonte
git push -f origin master
não há opção--hard
commit 0
é mais velho quecommit 1
. Por favor, você poderia me dizer por que primeiro executarcommit 3
(por cherry-pick) e depois porcommit 1
? Após o checkout deb3d92cd
(commit 0
), eu esperaria uma escolha de cerejacommit 1
, entãocommit 3
. Obrigado.PS: CommitId refere-se àquele ao qual você deseja reverter
fonte
Histórico de alterações forçadas
Supondo que você não queira apenas excluir o último commit, mas você deseja excluir os commit específicos dos últimos n commit, vá com:
git rebase -i HEAD~<number of commits to go back>
, portanto,git rebase -i HEAD~5
se você deseja ver os últimos cinco confirmados.Em seguida, no editor de texto, altere a palavra
pick
paradrop
próximo a cada confirmação que você deseja remover. Salve e saia do editor. Voila!Histórico de alterações de forma aditiva
Tente
git revert <commit hash>
. Reverter criará uma nova confirmação que desfaz a confirmação especificada.fonte
drop
palavra-chave não está definida. Para excluir uma confirmação, remova a linha inteira.Se você deseja corrigir o seu commit mais recente, pode desfazer o commit e desestabilizar os arquivos nele, fazendo:
Isso retornará seu repositório ao seu estado antes dos comandos git add que prepararam os arquivos. Suas alterações estarão no seu diretório de trabalho. HEAD ~ 1 refere-se ao commit abaixo da ponta atual do ramo.
Se você deseja cancelar a confirmação de N, mas mantenha as alterações de código no seu diretório de trabalho:
Se você deseja se livrar da sua confirmação mais recente e não deseja manter as alterações no código, é possível fazer uma redefinição "física".
Da mesma forma, se você deseja descartar os últimos N commit e não deseja manter as alterações no código:
fonte
Aqui '2' é o número de confirmações que você deseja refazer.
se você quiser refazer todas as confirmações.
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 recuperação será cancelada. Observe que as confirmações vazias são comentadas
Você pode simplesmente remover essa confirmação usando a opção "d" ou Removendo uma linha que tenha sua confirmação.
fonte
Para excluir na ramificação local, use
Para excluir em uma ramificação remota, use
fonte
[Resposta rápida]
Você tem muitas alternativas, por exemplo:
Alternativa 1:
Alternativa 2:
Alternativa 3:
fonte
Fonte: https://gist.github.com/sagarjethi/c07723b2f4fa74ad8bdf229166cf79d8
Excluir a última confirmação
Por exemplo, seu último commit
origem do push do git + aa61ab32 ^: master
Agora você deseja excluir esse commit e, em seguida, uma maneira fácil de fazer isso a seguir
Passos
Primeiro redefina a ramificação para o pai da confirmação atual
Empurre-o com força para o controle remoto.
Para confirmação específica, você deseja redefinir está seguindo
fonte
Aqui está outra maneira de fazer isso:
Faça o checkout da filial que você deseja reverter e, em seguida, redefina sua cópia de trabalho local de volta para a confirmação de que você deseja ser a mais recente no servidor remoto (tudo depois que ela se despedir). Para fazer isso, no SourceTree, clique com o botão direito do mouse no botão e selecione "Redefinir BRANCHNAME para este commit". Eu acho que a linha de comando é:
Como você acabou de efetuar o check-out de sua filial remotamente, não haverá alterações locais para se preocupar em perder. Mas isso os perderia se você o fizesse.
Em seguida, navegue até o diretório local do seu repositório e execute este comando:
Isso apagará todas as confirmações após a atual em seu repositório local, mas apenas para essa ramificação.
fonte
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 no Vale do Silício, enquanto mais de 900 commits se carregavam no Sublime. Saindo sem alterações, carreguei minha bateria e comecei a fazer a barba, pois todos os mais de 900 indivíduos se comprometem com indiferença - redefinindo seus tempos de consolidação agora.
Determinado a vencer o Git e preservar os tempos originais, excluí este repositório local e clono novamente no controle remoto.
Agora, havia adicionado novamente o commit desnecessário mais recente ao mestre que eu desejava remover, e assim procedi.
Esgotando as opções:
Eu não queria
git revert
- isso criaria um commit adicional, dando ao Git a vantagem.git reset --hard HEAD
não fez nada, depois de verificar oreflog
, o último e únicoHEAD
foi o clone - Git vence.Para obter o SHA mais recente, verifiquei o repositório remoto no github.com - vitória menor.
Depois que o pensamento
git reset --hard <SHA>
funcionou, atualizei outro ramo para dominar e 1 ... 2 ... poof! o commit estava de volta - Git vence.Voltando ao mestre, hora de tentar
git rebase -i <SHA>
, em seguida, remova a linha ... sem sucesso, é triste dizer. " Se você remover uma linha aqui, esse compromisso será perdido ". Ah ... encobrindo o novo recurso, troll o n00b nas notas de versão 2.8.3 .A solução:
git rebase -i <SHA>
entãod, drop = remove commit
.Para verificar, fiz check-out para outro ramo, e pronto - sem esconder o compromisso de buscar / puxar do mestre.
https://twitter.com/holman/status/706006896273063936
Bom dia para você.
fonte
Todos os comandos acima restauram o estado da sua árvore de trabalho e indexam como estavam antes de confirmar, mas não restauram o estado do repositório. Se você observar, a confirmação "removida" não é realmente removida, simplesmente não é a que está na ponta do ramo atual.
Eu acho que não há como remover um commit com comandos de porcelana . A única maneira é removê-lo do log e reflog e, em seguida, executar a
git prune --expire -now
.fonte
git prune
é realmente um dos comandos "porcelana" . Além disso, é raro que você queira limpar completamente o reflog (um caso de uso é remover informações confidenciais do seu repositório, mas, como eu disse, esse é um caso de uso raro). Na maioria das vezes, convém manter as confirmações antigas no reflog, caso precise recuperar dados. Consulte Pro Git: 9.7 Git Internals - Manutenção e recuperação de dados .Se você deseja manter o histórico, mostrando o commit e a reversão, use:
digite a mensagem explicando por que você está revertendo e depois:
Quando você emitir,
git log
verá as mensagens de log de confirmação e reversão "incorretas".fonte
Se você acabou de estragar seu último commit (mensagem errada, esqueceu de adicionar algumas alterações) e deseja corrigi-lo antes de enviá-lo para um repositório público, por que não usar:
Se você tiver feito alterações recentemente preparadas, elas serão combinadas com a última confirmação (da qual você está tentando se livrar) e a substituirão.
Obviamente, se você alterar um commit depois de enviá-lo, estará reescrevendo o histórico; portanto, se fizer isso, não deixe de entender as implicações.
Você também pode passar a opção '--no-edit' em vez de '-m' se preferir usar a mensagem do commit anterior.
Documentos: http://git-scm.com/docs/git-commit.html
fonte
Se você já enviou, localize primeiro o commit que você deseja que esteja em HEAD ($ GIT_COMMIT_HASH_HERE) e execute o seguinte:
Em cada lugar em que o repositório foi clonado, execute:
fonte
O que eu faço normalmente quando eu comprometo e empurro (se alguém o empurra, isso resolve o problema):
espero que isso ajude
fonte
Eu já empurrei. Precisa retornar algumas confirmações remotamente. Já tentei muitas variações, mas apenas isso de Justin via git bush está funcionando bem para mim:
fonte
Redefinir na filial local
Forçar envio à origem
fonte
Faça backup do seu código na pasta temp. O comando a seguir será redefinido como o servidor.
Se você deseja manter suas alterações e remover confirmações recentes
fonte
Referência: Como excluir uma confirmação no git, local e remoto
fonte
Como você pode ver na imagem acima, eu quero excluir a reversão "test change 2" commit (SHA1 ID: 015b5220c50e3dfbb1063f23789d92ae1d3481a2 (você pode obter o SHA1 ID usando o
gitk
comando git bash)).Para que eu possa usar (todos os comandos abaixo funcionam apenas em local. Você precisa pressionar após excluir):
git reset --hard 515b5220c50e3dfbb1063f23789d92ae1d3481a2
// faz backup de você para essa confirmação (o ID SHA1 da alteração de teste 4 é 515b5220c50e3dfbb1063f23789d92ae1d3481a2 )git reset --hard HEAD~1
// faz backup de você antes de um commit.git reset --hard HEAD^
// Para remover o último commit do gitdepois de excluir:
fonte
git reset --hard HEAD~1
Você estará agora na cabeça anterior. Puxe o galho. Empurre novo código. A confirmação será removida do git
fonte
git reset --hard
origem do push do git HEAD --force
Se um ou mais dos commits forem marcados, exclua as tags primeiro. Caso contrário, o commit marcado não será removido.
fonte
use git revert https://git-scm.com/docs/git-revert . Ele reverterá todo o código e você poderá fazer o próximo commit.Then head irá apontar para o último commit. confirmações revertidas nunca são excluídas, mas isso não afetará sua última confirmação.
fonte
No meu caso, meu código mágico para esse objetivo é este:
Teste e me diga. Eu tentei alguns diferentes, mas este foi o único que me ajudou.
fonte