No meu ramo principal, fiz um git merge some-other-branch
local, mas nunca forcei as alterações no mestre de origem. Não era minha intenção mesclar, então gostaria de desfazer. Ao fazer uma git status
pós-mesclagem, recebi esta mensagem:
# On branch master
# Your branch is ahead of 'origin/master' by 4 commits.
Com base em algumas instruções que encontrei , tentei executar
git revert HEAD -m 1
mas agora estou recebendo esta mensagem com git status
:
# On branch master
# Your branch is ahead of 'origin/master' by 5 commits.
Não quero que meu ramo esteja à frente em nenhum número de confirmações. Como eu volto a esse ponto?
Respostas:
Com a
git reflog
verificação de qual commit é anterior à mesclagem (git reflog
será uma opção melhor quegit log
). Em seguida, você pode redefini-lo usando:Há também outra maneira:
Você receberá 1 commit.
Esteja ciente de que todos os arquivos modificados e não confirmados / não armazenados em cache serão redefinidos para seu estado não modificado . Para mantê-los, oculte as alterações ou veja a
--merge
opção abaixo.Como o @Velmont sugeriu abaixo em sua resposta, neste caso direto, use:
pode gerar melhores resultados, pois deve preservar suas alterações.
ORIG_HEAD
apontará para um commit diretamente antes da mesclagem, para que você não precise procurá-lo.Uma outra dica é usar a
--merge
opção em vez de--hard
não redefinir arquivos desnecessariamente:fonte
git log
escolhe para mostrar por padrão - talvez haja uma saída diferente degit log
ougit reflog
poderia ser usado para isso)git log
saída, você deseja observar as duas confirmações principais. Um é o último commit no seu ramo, um é o último commit no ramo no qual você mesclou. Você desejagit reset --hard
confirmar o pai na ramificação na qual você mesclou.git reset --hard <commit_sha>
Supondo que seu mestre local não estava à frente da origem / mestre, você deve conseguir
Então sua
master
filial local deve parecer idêntica aorigin/master
.fonte
Veja o capítulo 4 no livro Git e a postagem original de Linus Torvalds .
Para desfazer uma mesclagem que já foi enviada por push :
Não se esqueça de reverter a reversão se você estiver realizando o ramo novamente, como Linus disse.
fonte
git revert -m 1 <commit>
. O problema é que isso não apaga a fusão acidental que ele fez (e ainda não fez). As outras respostas que envolvem redefinições rígidas são melhores para o problema do pôster original.É estranho que o comando mais simples estivesse faltando. A maioria das respostas funciona, mas desfazendo a mesclagem que você acabou de fazer, esta é a maneira mais fácil e segura :
A referência
ORIG_HEAD
apontará para o commit original antes da mesclagem.(O
--merge
opção não tem nada a ver com a mesclagem. É comogit reset --hard ORIG_HEAD
, mas mais seguro, pois não toca em alterações não confirmadas.)fonte
git reset --merge ORIG_HEAD
preserva essas alterações.git reset --hard HEAD~5
apenas redefinirá HEAD (pode remover confirmações no mestre e no branch1). Somente a--merge
opção remove omerge
.--merge
opção não remove a mesclagem, você pode usá---hard
la também funcionará bem. É a referência ORIG_HEAD que é a pista aqui; ela é definida antes de você fazer uma mesclagem para onde você está nesse ponto. :)git reset --hard ORIG_HEAD
comando funcionou perfeitamente para mim - pode ter sido ajudado pelo fato de eu não fazer outras alterações no repositório após o localgit merge
que estava tentando desfazer. O comando simplesmente redefine o estado do repositório para o estado anterior à mesclagem. Obrigado pela ótima dica!Com as versões mais recentes do Git, se você ainda não confirmou a mesclagem e tem um conflito de mesclagem , basta:
De
man git merge
:fonte
Você deve redefinir para o commit anterior. Isso deve funcionar:
Ou até mesmo
HEAD^^
reverter esse commit de reversão. Você sempre pode fornecer uma referência completa do SHA se não tiver certeza de quantos passos você deve seguir.Caso você tenha problemas e sua ramificação principal não tenha alterações locais, você pode redefinir para
origin/master
.fonte
ORIG_HEAD
para você, por que não usá-lo?Ultimamente, tenho usado
git reflog
para ajudar com isso. Isso geralmente funciona apenas se a mesclagem APENAS aconteceu e estava na sua máquina.git reflog
pode retornar algo como:A primeira linha indica que ocorreu uma mesclagem. A segunda linha é o tempo antes da minha mesclagem. Eu simplesmente
git reset --hard 43b6032
forço esse ramo a rastrear antes da mesclagem e continuar.fonte
reflog
para obter o SHA e passar isso para ogit reset
trabalho.Com o moderno Git, você pode:
Sintaxe mais antiga:
Moda antiga:
Mas, na verdade, vale a pena notar que isso
git merge --abort
é apenas equivalente aogit reset --merge
queMERGE_HEAD
está presente. Isso pode ser lido na ajuda do Git para o comando mesclar.Após uma mesclagem com falha, quando não há
MERGE_HEAD
, a mesclagem com falha pode ser desfeitagit reset --merge
, mas não necessariamente comgit merge --abort
, portanto , elas não são apenas uma sintaxe antiga e nova para a mesma coisa .Pessoalmente, acho
git reset --merge
muito mais poderoso e útil no trabalho diário, então é esse que eu sempre uso.fonte
Ok, as respostas que outras pessoas aqui me deram foram próximas, mas não funcionou. Aqui está o que eu fiz.
Fazendo isso...
... me deu o seguinte status.
Eu tive que digitar o mesmo
git reset
comando várias vezes. Cada vez que fiz isso, a mensagem mudou em um, como você pode ver abaixo.Nesse ponto, vi a mensagem de status alterada, então tentei fazer um
git pull
e isso pareceu funcionar:Para encurtar a história, meus comandos se resumiram a isso:
fonte
HEAD^^^^
origin/master
;)Você pode usar
git reflog
para encontrar a finalização da compra anterior. Às vezes, esse é um bom estado para o qual você deseja voltar.Concretamente,
fonte
Se você estiver no meio da fusão, sempre poderá abortá-lo
git merge --abort
fonte
Consegui resolver esse problema com um único comando que não envolve procurar uma identificação de confirmação.
A resposta aceita não funcionou para mim, mas esse comando alcançou os resultados que eu estava procurando.
fonte
Se você ainda não o confirmou, você pode usar apenas
Isso desfará a mesclagem (e tudo o que você fez).
fonte
Cheguei a essa questão também procurando reverter para corresponder à origem (ou seja, o NO confirma antes da origem). Pesquisando mais, descobrimos que há um
reset
comando para exatamente isso:git reset --hard @{u}
Nota:
@{u}
é uma abreviação deorigin/master
. (E, claro, você precisa desse repositório remoto para que isso funcione.)fonte
Você tem que mudar sua cabeça, não a sua, é claro, mas git HEAD ....
Portanto, antes de responder, vamos adicionar alguns antecedentes, explicando o que é isso
HEAD
.First of all what is HEAD?
HEAD
é simplesmente uma referência ao commit atual (mais recente) no branch atual.Só pode haver um single
HEAD
a qualquer momento. (excluindogit worktree
)O conteúdo de
HEAD
é armazenado dentro.git/HEAD
e contém os 40 bytes SHA-1 da confirmação atual.detached HEAD
Se você não está no último commit, o que significa que
HEAD
está apontando para um commit anterior no históricodetached HEAD
.Na linha de comando, será semelhante a este- SHA-1 em vez do nome do ramo, pois ele
HEAD
não está apontando para a ponta do ramo atualAlgumas opções sobre como recuperar de um HEAD desanexado:
git checkout
Isso fará o checkout do novo ramo apontando para o commit desejado.
Este comando fará checkout para um determinado commit.
Nesse ponto, você pode criar uma ramificação e começar a trabalhar a partir deste ponto.
git reflog
Você sempre pode usar o
reflog
também.git reflog
exibirá qualquer alteração que tenha atualizadoHEAD
e o check-out da entrada de reflog desejadaHEAD
retornará a esta confirmação.Sempre que o HEAD for modificado, haverá uma nova entrada no
reflog
Isso o levará de volta ao seu commit desejado
git reset --hard <commit_id>
"Mova" seu HEAD de volta para o commit desejado.
você também pode usá-lo
git rebase --no-autostash
.git revert <sha-1>
"Desfazer" o intervalo de confirmação ou confirmação fornecido.
O comando reset irá "desfazer" quaisquer alterações feitas no commit fornecido.
Um novo commit com o patch de desfazer será confirmado enquanto o commit original também permanecerá no histórico.
Este esquema ilustra qual comando faz o quê.
Como você pode ver lá,
reset && checkout
modifique o arquivoHEAD
.fonte
A resposta mais simples é a dada por odinho - Velmont
Primeiro faça
git reset --merge ORIG_HEAD
Para aqueles que desejam redefinir depois que as alterações são enviadas, faça o seguinte (porque esta é a primeira postagem vista para qualquer dúvida de fusão do git reset)
git push origin HEAD --force
Isso será redefinido de forma que você não recupere as alterações mescladas novamente após a extração.
fonte
Apenas para uma opção extra, observei principalmente o modelo de ramificação descrito aqui: http://nvie.com/posts/a-successful-git-branching-model/ e, como tal, tenho me fundido com
--no-ff
(não avanço rápido) normalmente.Acabei de ler esta página porque acidentalmente mesclei um ramo de teste em vez do meu ramo de lançamento com o mestre para implantação (site, mestre é o que está ativo). O ramo de teste possui outros dois ramos mesclados e totaliza cerca de seis confirmações.
Então, para reverter todo o commit, eu só precisava de um
git reset --hard HEAD^
e ele reverteu toda a mesclagem. Como as fusões não foram encaminhadas rapidamente, a mesclagem foi um bloco e um passo atrás é "ramificação não mesclada".fonte
Você pode usar apenas dois comandos para reverter uma mesclagem ou reiniciar por uma confirmação específica:
git reset --hard commitHash
(você deve usar o commit que deseja reiniciar, por exemplo, 44a587491e32eafa1638aca7738)git push origin HEAD --force
(Enviando o novo ramo mestre local para origem / mestre)Boa sorte e vá em frente!
fonte
Isso pode ser feito de várias maneiras.
1) Interromper mesclagem
Se você estiver no meio de uma mesclagem incorreta (feita erroneamente com ramificação incorreta) e quiser evitar a mesclagem, volte para a ramificação mais recente, como abaixo:
2) Redefina HEAD para filial remota
Se você estiver trabalhando a partir da ramificação de desenvolvimento remoto, poderá redefinir HEAD para a última confirmação na ramificação remota, conforme abaixo:
3) Exclua a ramificação atual e efetue o checkout novamente no repositório remoto
Considerando que você está trabalhando no ramo de desenvolvimento no repositório local, que é sincronizado com o ramo remoto / de desenvolvimento, você pode fazer o seguinte:
fonte
Se sua mesclagem e as confirmações correspondentes ainda não foram enviadas, você sempre pode alternar para outra ramificação, excluir a original e recriá-la.
Por exemplo, acidentalmente mesclei um ramo de desenvolvimento no mestre e quis desfazer isso. Usando as seguintes etapas:
Voila! O mestre está no mesmo estágio da origem e seu estado de fusão incorreta é apagado.
fonte
Se você deseja uma solução de linha de comando, sugiro apenas seguir a resposta do MBO.
Se você é iniciante, pode gostar da abordagem gráfica:
gitk
(na linha de comando, ou clique com o botão direito do mouse no navegador de arquivos, se houver)fonte
Estratégia: Crie um novo ramo de onde tudo estava bom.
Fundamentação da petição: reversão de uma mesclagem é difícil. Existem muitas soluções, dependendo de muitos fatores, como se você confirmou ou enviou sua mesclagem ou se houve novas confirmações desde a mesclagem. Além disso, você ainda precisa ter um entendimento relativamente profundo do git para adaptar essas soluções ao seu caso. Se você seguir cegamente algumas instruções, poderá terminar com uma "mesclagem vazia", onde nada será mesclado, e outras tentativas de mesclagem farão com que o Git diga "Já está atualizado".
Solução:
Vamos dizer que você deseja mesclar
dev
emfeature-1
.Encontre a revisão que você deseja receber a mesclagem:
Confira (volte no tempo):
Crie uma nova ramificação a partir daí e confira:
Agora você pode reiniciar sua mesclagem:
Mesclar:
git merge dev
Corrija seus conflitos de mesclagem.
Confirmar:
git commit
Quando estiver satisfeito com os resultados, exclua o ramo antigo:
git branch --delete feature-1
fonte
Basta criar uma nova ramificação e escolher a cereja desejada.
Seu poupador e mais simples, em seguida, redefine descrito em muitas respostas acima
fonte
Eu acho que você pode fazer
git rebase -i [hash] [branch_name]
onde[hash]
está o hash de identificação, por quanto tempo você quiser retroceder mais um (ou quantos retornos você desejar) e excluir as linhas dos commits no editor que você não deseja mais . Salve o arquivo. Saída. Orar. E deve ser rebobinado. Você pode precisar fazer umgit reset --hard
, mas deve ser bom neste momento. Você também pode usar isso para extrair commits específicos de uma pilha, se não quiser mantê-los em seu histórico, mas isso pode deixar seu repositório em um estado que provavelmente não deseja.fonte
Se você confirmou a mesclagem:
fonte
Primeiro, verifique se você comprometeu tudo.
Em seguida, redefina seu repositório para o estado de trabalho anterior:
ou usando
--hard
( isso removerá todas as alterações locais, não confirmadas! ):Use o hash que estava lá antes da sua consolidação incorreta.
Verifique quais confirmações você deseja confirmar novamente na parte superior da versão correta anterior:
Aplique as confirmações corretas na parte superior da versão correta do seu repositório:
Usando cherry-pick (as alterações introduzidas por alguns commits existentes)
Ou escolhendo cereja o intervalo de confirmações por:
Primeiro, verifique as alterações corretas antes de mesclá-las:
Primeiro, verifique as alterações corretas antes de mesclá-las:
onde esse é o intervalo de confirmações corretas que você confirmou (excluindo a fusão incorreta).
fonte
git stash
git branch -d the_local_branch
git checkout -t <name of remote>
git stash apply
Isso funcionou para mim .. !!
fonte
Se você perceber que precisa reverter imediatamente após a mesclagem e não fez mais nada após a tentativa de mesclagem, basta emitir este comando:
git reset --hard HEAD@{1}
.Essencialmente, sua mesclagem
sha
estará apontandoHEAD@{0}
se nada mais foi confirmado após a mesclagem e, portantoHEAD@{1}
, será o ponto anterior antes da mesclagem.fonte
A mais simples das chances mais simples, muito mais simples do que tudo o que foi dito aqui:
Remova sua filial local (local, não remota) e puxe-a novamente. Dessa forma, você desfará as alterações em sua ramificação principal e qualquer pessoa será afetada pela alteração que não deseja enviar. Comece de novo.
fonte
Nesse caso, você desejará redefinir sua ramificação com
git reset --hard <branch_name>
. Se você deseja salvar suas alterações antes de redefini-las, crie uma nova ramificação egit checkout <branch_name>
.Você também pode redefinir o estado para um commit específico
git reset --hard <commit_id>
.Se as alterações foram enviadas, você pode usar
git revert <branch_name>
. Certifique-se de verificar como usar o git revert e o git checkout em outros cenários também.fonte