git Como mover o HEAD de volta para um local anterior?(Cabeçalho Detached) e Desfazer commits




git-checkout git-reset (5)

No git, eu estava tentando fazer um squash commit , mesclando em outro branch e, em seguida, redefinindo o HEAD para o local anterior via:

git reset origin/master

Mas eu preciso sair disso. Como posso mover o HEAD de volta para o local anterior?

Eu tenho o SHA1 frag ( 23b6772 ) do commit para o qual preciso movê-lo.
Como posso voltar a este commit?


Aqui está uma abordagem que pode ser muito simples e fácil de lembrar. Verifique 2 condições e termine com 1 comando. Então você está de volta aos trilhos.

E se

você está na "cabeça solitária"
(ou seja, digite git status ; você vê o HEAD detached at <commit_id> )

E

um ramo existente atende às suas necessidades
(isto é, digite git branch -v ; você vê um nome de ramificação com mensagens de commit relacionadas representando o trabalho que deseja continuar)

Então

basta verificar essa ramificação (ou seja, digite git checkout <branch_name> ; você vê Switched to branch <branch_name> ).

Resultados

Agora você pode continuar adicionando e comprometendo seu trabalho como antes; as alterações serão rastreadas em <branch_name> .

Observe que, se você salvou o trabalho enquanto o HEAD foi desanexado, na maioria dos casos esse trabalho será mesclado automaticamente no processo acima. Se você vir uma mensagem sobre um conflito de mesclagem, não entre em pânico. Existem vários ótimos tutoriais com etapas simples para corrigir o conflito e concluir a mesclagem.


Quando você executa o comando git checkout commit_id , o HEAD desconectado de 13ca5593d(say commit-id) e branch estará em um tempo maior disponível.

Mover de volta ao local anterior executar o passo de comando sábio- a) git puxar origem branch_name (digamos mestre) b) git checkout branch_name c) git pull origem branch_name

Você voltará ao local anterior com o commit atualizado do repositório remoto.


Antes de responder, vamos adicionar alguns antecedentes, explicando o que é este HEAD .

First of all what is HEAD?

HEAD é simplesmente uma referência ao commit atual (mais recente) no branch atual.
Só pode haver uma única HEAD a qualquer momento. (excluindo git worktree )

O conteúdo do HEAD é armazenado dentro de .git/HEAD e contém os 40 bytes SHA-1 do commit atual.

detached HEAD

Se você não está no commit mais recente - o que significa que o HEAD está apontando para um commit anterior no histórico, é chamado detached HEAD .

Na linha de comando, ele terá a seguinte aparência: SHA-1, em vez do nome da ramificação, pois o HEAD não está apontando para a ponta da ramificação atual.

Algumas opções sobre como recuperar-se de uma CABEÇA desanexada:

git checkout

git checkout <commit_id>
git checkout -b <new branch> <commit_id>
git checkout HEAD~X // x is the number of commits t go back

Isto irá verificar o novo ramo apontando para o commit desejado.
Este comando fará o checkout para um determinado commit.
Neste ponto, você pode criar uma ramificação e começar a trabalhar a partir deste ponto.

# Checkout a given commit. 
# Doing so will result in a `detached HEAD` which mean that the `HEAD`
# is not pointing to the latest so you will need to checkout branch
# in order to be able to update the code.
git checkout <commit-id>

# create a new branch forked to the given commit
git checkout -b <branch name>

git reflog

Você sempre pode usar o reflog também.
git reflog exibirá qualquer mudança que atualizou o HEAD e o check out da entrada do reflog desejado irá definir o HEAD volta para este commit.

Toda vez que o HEAD é modificado, haverá uma nova entrada no reflog

git reflog
git checkout [email protected]{...}

Isso fará com que você volte ao seu compromisso desejado

git reset --hard <commit_id>

"Mova" seu HEAD de volta para o commit desejado.

# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32

# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts if you've modified things which were
# changed since the commit you reset to.
  • Nota: ( desde o Git 2.7 )
    você também pode usar o git rebase --no-autostash também.

git revert <sha-1>

"Desfazer" o determinado intervalo de confirmação ou confirmação.
O comando reset irá "desfazer" quaisquer mudanças feitas no commit dado.
Um novo commit com o patch de undo será confirmado enquanto o commit original permanecerá no histórico também.

# add new commit with the undo of the original one.
# the <sha-1> can be any commit(s) or commit range
git revert <sha-1>

Este esquema ilustra qual comando faz o quê.
Como você pode ver, reset && checkout modifique o HEAD .


Faz

git reset 23b6772

Para ver se você está na posição certa:

git status

Você vai ver algo

No branch master Seu branch está atrás de 'origin / master' por 17 commits, e pode ser adiantado.

Em seguida, corrija o HEAD para commit atual:

git push --force

A questão pode ser lida como:

Eu estava em estado desanexado com HEAD em 23b6772 e digitei git reset origin/master (porque eu queria esmagar). Agora eu mudei de idéia, como eu volto para HEAD sendo em 23b6772 ?

A resposta direta é: git reset 23b6772

Mas eu acertei essa pergunta porque fiquei enjoado de digitar (copiar e colar) commit hashes ou sua abreviação toda vez que queria fazer referência ao HEAD anterior e estava pesquisando para ver se havia algum tipo de abreviação.

Acontece que existe!

git reset - (ou no meu caso git cherry-pick - )

Que, aliás, era o mesmo que cd - para retornar ao diretório atual anterior em * nix! Então viva, aprendi duas coisas com uma pedra.







git-reflog