Como voltar para a confirmação mais recente depois de verificar uma confirmação anterior?

477

Às vezes, faço check-out de uma versão anterior do código para examinar ou testar. Vi instruções sobre o que fazer se desejar modificar confirmações anteriores - mas suponha que eu não faça alterações. Depois que eu faço git checkout HEAD^, por exemplo , como faço para voltar à ponta do ramo? ... git lognão me mostra mais o SHA do último commit.

Leo Alekseyev
fonte
11
Em relação à git logfrase da sua pergunta, você sempre pode executar git log --all(ou mais útil git log --oneline --graph --all).
Curinga

Respostas:

606

Se você sabe que o commit para o qual você deseja retornar é o chefe de algum ramo ou está marcado, você pode apenas

git checkout branchname

Você também pode usar git reflogpara ver o que outras pessoas confirmam que seu HEAD (ou qualquer outra referência) apontou no passado.


Editado para adicionar:

Nas versões mais recentes do Git, se você executou apenas git checkoutou alguma outra coisa para mover uma HEADvez, também pode

git checkout -

para voltar para onde estava antes do último checkout. Isso foi motivado pela analogia com o idioma do shell cd -a voltar para o diretório de trabalho em que ele estava anteriormente.

Phil Miller
fonte
27
Eu gostaria de mencionar que o exemplo típico seria "git checkout master". Uma das dificuldades que aprendi a usar o git foi não saber quais palavras-chave específicas (por exemplo, "mestre") podem substituir palavras de espaço reservado como "nome da filial".
AbePralle
3
masternão é realmente nenhum tipo de palavra-chave, do jeito que HEADé. É apenas o nome da filial padrão em um novo repositório. Você pode executar git branchpara obter uma lista de ramificações em seu repositório e git tag -luma lista de tags. Da mesma forma, originé o nome padrão do controle remoto do qual um repositório é clonado, mas não há nada de especial nele.
Phil Miller
3
Se não ficou claro, git reflogfornece uma lista de hashes, quando você pode usar git checkout [commit-hash].
jbnunn
Excluí um arquivo e tentei o comando, mas ele não o redefine completamente. Primeiro de tudo, não é recursivo. Então, quando eu tento isso no arquivo que eu apaguei, o git depois diz que o HEAD está desanexado. O que fazer?
Daniel S.
1
@ DanielS .: A pergunta e minha resposta foram sobre confirmações , enquanto você está falando sobre arquivos. O Git os trata de maneira diferente.
Phil Miller
27

mestre de verificação geral do git

master é a dica ou a última confirmação. O gitk mostrará apenas onde você está na árvore no momento. O git reflog mostrará todos os commits, mas nesse caso, você só quer a dica, então git checkout master.

Bruce Wells
fonte
1
Este. Ougit checkout branchname
Alex
19

Me deparei com essa questão agora e tenho algo a acrescentar

Para ir para o commit mais recente:

git checkout $(git log --branches -1 --pretty=format:"%H")

Explicação:

git log --branchesmostra o log de confirmações de todas as ramificações locais
-1limite a uma confirmação →
--pretty=format:"%H"formato de confirmação mais recente para mostrar apenas o
git checkout $(...)uso de hash de confirmação, saída do subshell como argumento para checkout

Nota:

Isso resultará em uma cabeça desanexada (porque fazemos o checkout diretamente no commit). Isso pode ser evitado extraindo o nome do ramo usando sed, explicado abaixo.


Para ir para a ramificação do commit mais recente:

git checkout $(git log --branches -1 --pretty=format:'%D' | sed 's/.*, //g')

Explicação:

git log --branchesmostra o log de confirmações de todas as ramificações locais
-1limite a uma confirmação → o
--pretty=format:"%D"formato de confirmação mais recente para mostrar apenas os nomes de referência
| sed 's/.*, //g'ignora todos, exceto o último de várias refs (*)
git checkout $(...)usa a saída do subshell como argumento para checkout

*) HEAD e ramificações remotas são listadas primeiro, as ramificações locais são listadas por último em ordem alfabética decrescente, portanto, o restante será o primeiro nome de ramificação em ordem alfabética

Nota:

Isso sempre usará apenas o primeiro nome do ramo (em ordem alfabética) se houver vários para esse commit.


Enfim, acho que a melhor solução seria apenas exibir os nomes de referência para o commit mais recente para saber para onde fazer o checkout:

git log --branches -1 --pretty=format:'%D'

Por exemplo, crie o alias git toppara esse comando.

816-8055
fonte
1
De alguma forma, eu instalei o segundo comando ... Corrigido, agora ele será verificado corretamente no ramo do commit mais recente.
816-8055
Alias ​​do Bash / zsh para o comando retornar à cabeçaalias git-head='git checkout $(git log --branches -1 --pretty=format:"%D" | sed "s/.*, //g")'
Hi-Angel
9

Dê uma olhada na GUI gráfica ... gitkmostra todas as confirmações. Às vezes é mais fácil trabalhar com gráficos ... ^^

tanascius
fonte
sim, é assim que eu fiz no passado - mas não tenho a GUI disponível no momento #
Leo Alekseyev
7

Você pode usar um dos seguintes comandos git para isso:

git checkout master
git checkout branchname
hothead1000
fonte
4

mostre todos os branches e confirme o
log do git --branches --oneline

mostre o último registro do git do commit
--branches -1 --oneline

show antes do último commit
git log --branches -2 --oneline

abdesselam
fonte
O primeiro comando realmente confirmará o código atualmente preparado ou estou interpretando mal isso?
Lazerbeak12345 27/03
3
git reflog //find the hash of the commit that you want to checkout
git checkout <commit number>>
Atif Majeed
fonte
0

Se você tem um ramo diferente do mestre, uma maneira fácil é fazer o check-out desse ramo e depois o mestre. Voila, você está de volta à ponta do mestre. Provavelmente há maneiras mais inteligentes ...

ConorR
fonte
0

Você pode simplesmente fazer git pull origin branchname. Ele buscará a confirmação mais recente novamente.

Ankit Singh
fonte
Eu não recomendo isso se você não quiser retirar do upstream. Deve-se lidar com conflitos de mesclagem apenas quando eles estiverem prontos.
Lazerbeak12345 27/03
Bem, nesse caso, o cabeçalho permanecerá no estado desanexado, mesmo se você fizer o checkout para o último commit.
Ankit Singh
-2

Se o seu commit mais recente estiver na ramificação principal, você pode simplesmente usar

git checkout master
Jackie Xu
fonte