Eu li os posts semelhantes sobre este tópico e, durante toda a minha vida, não consigo descobrir como fazer isso corretamente.
Fiz o check-in de cerca de 1000 arquivos que não quero e prefiro não precisar passar por 1by1 e removê-los do repositório.
- Eu tenho um
master
ramo remoto . - Eu tenho a
master
filial local .
Ambos estão na mesma revisão.
Eu quero reverter meu controle remoto por 1 commit.
Diga que minha história master
é A--B--C--D--E
.
Eu quero reverter meu local para D
.
Em seguida, empurre-o para controle remoto para que meu hash atual seja D remoto e local.
Estou tendo problemas para fazer isso.
Estou usando o Git Tower, mas estou confortável com a linha de comando. Qualquer ajuda?
ATUALIZAÇÃO: Ótimos comentários abaixo. O uso de uma redefinição parece desanimado, principalmente se o repositório for compartilhado com outros usuários. Qual é a melhor maneira de desfazer as alterações do commit anterior sem usar uma redefinição física ? Há algum jeito?
git revert
para fazer sem redefinições rígidas e sem incomodar os usuários.Respostas:
Se ninguém conseguiu o seu repo remoto ainda, você pode alterar o HEAD do seu ramo e forçar o envio para o repo remoto:
(ou, se você tiver acesso direto ao repositório remoto, poderá alterar a referência HEAD, mesmo que seja um repositório simples )
Observe que, conforme comentado pela tecnologia alienígena nos comentários abaixo , no Windows (sessão CMD), você precisaria de
^^
:Atualização desde 2011: o
uso
git push --force-with-lease
( que apresento aqui , introduzido em 2013 com o Git 1.8.5) é mais seguro.Veja a resposta de Schwern para ilustração.
Então eu sugiro algo que não reescreva a história:
git revert
localmente seu último commit (criando um novo commit que reverte o que o commit anterior fez)git revert
.fonte
reset --hard HEAD^
e nãoreset --hard HEAD^^
redefinir a última confirmação.Defina a filial local uma revisão novamente (
HEAD^
significa uma revisão novamente):Envie as alterações para a origem:
Você terá que forçar o empurrão porque, caso contrário, o git reconheceria que você está atrasado
origin
por um commit e nada vai mudar.Fazer isso com o
--force
git para sobrescreverHEAD
no repositório remoto sem respeitar os avanços lá.fonte
git push origin master
, o Git é capaz de criar um novo commit no controle remoto porque o ramo local está à frente pelo menos uma vez no commit? Além disso, o último deve ser substancialmente diferente do que a cabeça do repositório remoto aponta?Se você deseja reverter a última confirmação, ouça:
Passo 1:
Verifique as confirmações locais com mensagens
Passo 2:
Remova a última confirmação sem redefinir as alterações da ramificação local (ou principal)
OU se você não deseja que os últimos arquivos e atualizações de confirmação ouçam
Etapa 3:
Podemos atualizar os arquivos e códigos e, novamente, precisamos pressionar com força para excluir a confirmação anterior. Manterá um novo commit.
É isso aí!
fonte
Ao digitar o comando abaixo, você pode ver seu histórico de confirmação do git -
$ git log
Digamos que seu histórico nesse ramo específico seja como - commit_A, commit_B, commit_C, commit_D. Onde, commit_D é o último commit e é aí que o HEAD permanece. Agora, para remover seu último commit do local e do remoto, você deve fazer o seguinte:
Etapa 1: remova a última confirmação localmente por -
$ git reset --hard HEAD ~
Isso mudará seu commit HEAD para commit_C
Etapa 2: envie sua alteração para o novo commit HEAD para controle remoto
origem do push $ git + HEAD
Este comando excluirá a última confirmação do controle remoto.
PS: este comando foi testado no Mac OSX e também deve funcionar em outros sistemas operacionais (embora não afirme outro sistema operacional)
fonte
Para máquinas Windows, use:
fonte
Aqui está uma versão atualizada do procedimento, que é mais segura.
git push -f
substituirá indiscriminadamente o repositório remoto por suas próprias alterações. Se alguém empurrou as alterações, elas serão perdidas.git push --force-with-lease
apenas enviará sua rebase se o repositório estiver como o esperado. Se alguém já tiver pressionado o seu push falhará.Veja - força considerada prejudicial; entender a força do contrato do git .
Eu recomendo aliasing isso como
repush = push --force-with-lease
.Diga para eles
git pull --rebase=merges
. Em vez de umgit fetch origin
egit merge origin/master
serágit fetch origin
egit rebase -r origin/master
. Isso reescreverá qualquer uma das alterações locaismaster
no topo da nova versão reestruturadaorigin/master
.-r
preservará quaisquer fusões que eles possam ter feito.Eu recomendo fazer deste o comportamento padrão para puxar. É seguro, manipulará o rebase de outras pessoas e resultará em mesclagens menos desnecessárias.
fonte
--force-with-lease
opção.Resolvi um problema como o seu com estes comandos:
fonte
Se você tiver acesso direto ao repositório remoto, sempre poderá usar:
Isso funciona, pois não há nenhuma tentativa de modificar o diretório de trabalho inexistente. Para mais detalhes, consulte a resposta original:
Como posso descomprimir o último commit em um repositório git bare?
fonte
Eu só queria remover o último commit do histórico de commit remoto e claro também. O seguinte funcionou como um encanto
fonte
A maneira de redefinir a cabeça e reverter para o commit anterior é através
Mas, às vezes, pode não ser aceito na ramificação remota:
então a outra maneira de fazer é
Isso funciona bem.
NOTA: lembre-se de ter
git push -f <force>
falhado e tente reverter. Faça umgit pull
antes, para que o local e o remoto estejam sincronizados e tentegit revert
.Verifique com
git log
para garantir que o remoto e o local estejam no mesmo ponto de confirmação com o mesmo SHA1.fonte
no mestre local
Não precisa se preocupar se outro puxou ou não.
Feito!
fonte
Se você deseja remover apenas a última confirmação do repositório remoto sem mexer com o repositório local, aqui está uma lista:
Isso usa a seguinte sintaxe:
Aqui,
<remote>
éorigin
e<refspec>
tem a seguinte estrutura:Detalhes podem ser encontrados em
git-push(1)
. O anterior+
significa "force push this ref", e a outra parte significa "fromorigin/master~
tomaster
(of remoteorigin
)". Não é difícil saber qualorigin/master~
é o último commit antesorigin/master
, certo?fonte
para mim trabalha estes dois comandos:
fonte
Você também pode fazer isso:
e todos os outros que receberam as últimas confirmações ruins foram redefinidos:
fonte