No Git, eu estava tentando fazer uma squash commit
fusão em outra ramificação e, em seguida, redefinindo HEAD
para o local anterior via:
git reset origin/master
Mas preciso sair disso. Como posso mover HEAD de volta para o local anterior?
Eu tenho o fragmento SHA-1 ( 23b6772
) do commit para o qual preciso movê-lo. Como posso voltar a esse commit?
git
git-checkout
git-reset
git-revert
git-reflog
timpone
fonte
fonte
git checkout 23b6772
deveria fazer.Respostas:
Antes de responder, vamos adicionar alguns antecedentes, explicando o que
HEAD
é isso .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órico, é chamadodetached HEAD
.Na linha de comando, será parecido com este - SHA-1 em vez do nome do ramo, pois ele
HEAD
não está apontando para a ponta do ramo atual:Algumas 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á o 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.Toda vez 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.
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 oHEAD
.fonte
Faz
Para ver se você está na posição correta:
Você verá algo
Em seguida, reescreva o histórico no seu controle remoto para refletir a alteração:
fonte
git push --force
. Em muitas situações, você será a pessoa menos popular da equipe por um tempo ...git push --force-with-lease
(artigo Thoughtbot: thoughtbot.com/blog/git-push-force-with-lease )revert
as confirmações, eu me encontrei em uma situação incrivelmente difícil.force-with-lease
me deu a confiança para reescrever a história git do ramo sem afetar o trabalho de outras pessoas. bravo!Solução mais rápida possível (apenas 1 passo)
Usar
git checkout -
Você verá
Switched to branch <branch_name>
. Confirme se é o ramo que você deseja.Breve explicação: este comando moverá HEAD de volta à sua última posição. Veja a nota sobre os resultados no final desta resposta.
Mnemônico: essa abordagem é muito parecida com o uso
cd -
para retornar ao seu diretório visitado anteriormente. A sintaxe e os casos aplicáveis são uma combinação muito boa (por exemplo, é útil quando você realmente deseja que o HEAD retorne para onde estava).Solução mais metódica (2 etapas, mas memorável)
A abordagem rápida resolve a questão do OP. Mas e se a sua situação for um pouco diferente: digamos que você reiniciou o Bash e se viu com o HEAD desconectado. Nesse caso, aqui estão duas etapas simples e fáceis de lembrar.
1. Escolha o ramo que você precisa
Usar
git branch -v
Você vê uma lista de ramificações locais existentes. Pegue o nome da filial que atenda às suas necessidades.
2. Mova HEAD para ele
Usar
git checkout <branch_name>
Você verá
Switched to branch <branch_name>
. Sucesso!Resultados
Com qualquer um dos métodos, agora você pode continuar adicionando e comprometendo seu trabalho como antes: suas próximas alterações serão rastreadas
<branch_name>
.Observe que ambos
git checkout -
egit checkout <branch_name>
fornecerão instruções adicionais se você tiver confirmado alterações enquanto o HEAD foi desanexado.fonte
git checkout 8acc968
,git branch -v
tenhaMyBranch
na lista abaixo ... masgit checkout MyBranch
exclua meus comentários.git checkout 8acc968
irá verificar um commit, não um branch. SeMyBranch
tiver as confirmações que você deseja, tentegit checkout MyBranch
. Se não contiver as alterações no commit 8acc968, você precisará mesclar essas alterações depois de verificar a ramificação.git checkout
para ver um commit anterior e queria voltar para o commit mais recente. Mas sem o último hash de confirmação, eu estava praticamente perdido. Esta solução é perfeita para a minha situação!A pergunta pode ser lida como:
Eu estava no estado desanexado com
HEAD
at23b6772
e digitadogit reset origin/master
(porque queria esmagar). Agora mudei de idéia, como volto aHEAD
estar23b6772
?A resposta direta é:
git reset 23b6772
Mas eu respondi a essa pergunta porque estava cansado de digitar (copiar e colar) hashes de commit ou sua abreviação toda vez que queria fazer referência ao anterior
HEAD
e estava pesquisando no Google para ver se havia algum tipo de abreviação.Acontece que existe!
git reset -
(ou no meu casogit cherry-pick -
)Que, aliás, era o mesmo que
cd -
retornar ao diretório atual anterior no * nix! Então, viva, eu aprendi duas coisas com uma pedra.fonte
Quando você executa o comando
git checkout commit_id
, o HEAD desanexado13ca5593d(say commit-id)
e o branch ficam mais disponíveis.Voltar para o local anterior, execute o comando passo a passo -
git pull origin branch_name
(diga mestre)git checkout branch_name
git pull origin branch_name
Você voltará ao local anterior com uma confirmação atualizada do repositório remoto.
fonte
Hoje, fiz check-out por engano em um commit e comecei a trabalhar nele, fazendo alguns commit em um estado HEAD desanexado. Em seguida, enviei para a ramificação remota usando o seguinte comando:
Então
Então
Finalmente recebi todas as minhas alterações em meu ramo que fiz para desanexar HEAD.
fonte
Isso pode não ser uma solução técnica, mas funciona. (se alguém do seu companheiro de equipe tiver a mesma filial no local)
Vamos assumir o nome do seu ramo como branch-xxx .
Passos para resolver:
Nota: Novamente, essa não é uma solução técnica, mas ajudará com certeza.
fonte