Eu sei que reescrever a história é ruim yada yada.
Mas como remover permanentemente poucas confirmações da ramificação remota?
Eu sei que reescrever a história é ruim yada yada.
Mas como remover permanentemente poucas confirmações da ramificação remota?
Respostas:
Você é git reset --hardsua filial local para remover as alterações da árvore e índice de trabalho e git push --forcesua filial local revisada para o controle remoto. ( outra solução aqui , envolvendo excluir a ramificação remota e pressioná-la novamente)
Esta resposta do SO ilustra o perigo de um comando desse tipo, especialmente se as pessoas dependem do histórico remoto para seus próprios repositórios locais.
Você precisa estar preparado para apontar pessoas para a seção RECUPERANDO DO UPSTREAM REBASE da git rebasepágina de manual
Com o Git 2.23 (agosto de 2019, nove anos depois), você usaria o novo comando git switch.
Ou seja:
(substituagit switch -C mybranch origin/mybranch~nn pelo número de confirmações para remover)
Isso restaurará o índice e a árvore de trabalho, como git reset --hardfaria.
push --forceafastado
git gcnem sempre é executado o suficiente no lado remoto. Por exemplo, no GitHub: twitter.com/githubhelp/status/387926738161774592?lang=es
Apenas observe que last_working_commit_id, ao reverter um commit não ativo
git reset --hard <last_working_commit_id>
Portanto, não devemos redefinir para o commit_idque não queremos.
Então, com certeza, devemos enviar para o ramo remoto:
git push --force
git reset --harddeveria fazer.
Existem três opções mostradas neste tutorial . Caso o link seja quebrado, deixarei as etapas principais aqui.
1 Reverta a consolidação completa
git revert dd61ab23
2 Exclua o último commit
git push <<remote>> +dd61ab23^:<<BRANCH_NAME_HERE>>
ou, se a filial estiver disponível localmente
git reset HEAD^ --hard
git push <<remote>> -f
onde + dd61 ... é o seu commit hash e git interpreta x ^ como o pai de x e + como um push forçado não-rápido.
3 Exclua a confirmação de uma lista
git rebase -i dd61ab23^
Isso abrirá e o editor exibirá uma lista de todas as confirmações. Exclua o que você deseja se livrar. Conclua a rebase e pressione a força para repo.
git rebase --continue
git push <remote_repo> <remote_branch> -f
Se você deseja excluir, por exemplo, as últimas 3confirmações, execute o seguinte comando para remover as alterações do sistema de arquivos (árvore de trabalho) e confirmar o histórico (índice) em sua filial local:
git reset --hard HEAD~3
Em seguida, execute o seguinte comando (na máquina local) para forçar a ramificação remota a reescrever seu histórico:
git push --force
Parabéns! Tudo feito!
Algumas notas:
Você pode recuperar o ID de confirmação desejado executando
git log
Então você pode substituir HEAD~Ncom <desired-commit-id>como esta:
git reset --hard <desired-commit-id>
Se você deseja manter as alterações no sistema de arquivos e apenas modificar o índice (histórico de consolidação), use --softsinalizador como git reset --soft HEAD~3. Então você tem a chance de verificar as alterações mais recentes e manter ou descartar todas ou parte delas. Neste último caso, runnig git statusmostra os arquivos alterados desde então <desired-commit-id>. Se você usar a --hardopção, git statusinformará que sua filial local é exatamente igual à remota. Se você não usar --hardnem --soft, o modo padrão será usado --mixed. Nesse modo,git help reset diz:
Redefine o índice, mas não a árvore de trabalho (ou seja, os arquivos alterados são preservados, mas não marcados para confirmação) e relata o que não foi atualizado.
Isso pode ser tarde demais, mas o que me ajudou é a opção "nuclear" que soa legal. Basicamente usando o comandofilter-branch você pode remover arquivos ou alterar algo em um grande número de arquivos ao longo de todo o seu histórico do git.
É melhor explicado aqui .
Simplificando a partir da resposta do pctroll, similarmente com base nesta postagem do blog .
# look up the commit id in git log or on github, e.g. 42480f3, then do
git checkout master
git checkout your_branch
git revert 42480f3
# a text editor will open, close it with ctrl+x (editor dependent)
git push origin your_branch
# or replace origin with your remote
Às vezes, a maneira mais fácil de corrigir esse problema é criar uma nova ramificação no local em que você sabe que o código é bom. Em seguida, você pode deixar o histórico de ramificação incorreto sozinho, caso precise escolher outros commits posteriormente. Isso também garante que você não perdeu nenhum histórico de consolidação.
Do seu ramo local errante:
git log
copie o hash de confirmação em que você deseja que o ramo esteja e saia do log git
git checkout theHashYouJustCopied
git checkout -b your_new_awesome_branch
Agora você tem um novo ramo do jeito que você deseja.
Se você também precisou manter um commit específico da ramificação incorreta que não está em sua nova ramificação, basta escolher a submissão específica de que precisa:
git checkout the_errant_branch
git log
Copie o hash de confirmação do que você precisa para entrar na ramificação válida e sair do log do git.
git checkout your_new_awesome_branch
git cherry-pick theHashYouJustCopied
Dê um tapinha nas costas.