git - soft - voltar para commit específico




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

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.

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?


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

Hoje, eu erroneamente checkout em um commit e começa a trabalhar nele faz alguns commits em desanexar o estado HEAD. Então o que eu fiz eu empurrei para o ramo remoto usando o seguinte comando

git push origin HEAD: <My-remote-branch>

então

git checkout <My-remote-branch>

então

git pull 

Eu finalmente recebo todas as minhas alterações no meu ramo que eu fiz em destacar HEAD





git-reflog