Como voltar à versão mais recente do Git?

303

Recentemente, mudei de SVN para Git e estou um pouco confuso com alguma coisa. Eu precisava executar a versão anterior de um script por meio de um depurador, então fiz git checkout <previous version hash>e fiz o que precisava fazer.

Agora quero voltar para a versão mais recente, mas não conheço o hash. Quando digito git log, não vejo.

Como posso fazer isso? Além disso, existe uma maneira mais fácil de alterar versões do que digitando hashes - algo como "voltar duas versões" ou "ir para a mais recente cronologicamente"?

Nathan Long
fonte

Respostas:

371

git checkout masterdeve fazer o truque. Para voltar duas versões, você pode dizer algo como git checkout HEAD~2, mas é melhor criar uma ramificação temporária com base nesse tempo, entãogit checkout -b temp_branch HEAD~2

Ana Betts
fonte
7
Legal! git checkout masteré exatamente como eu volto de um ramo. Então, isso significa que, quando eu faço check-out de uma versão anterior, estou essencialmente criando um ramo?
Nathan Long
4
@ Nathan: No git, um ramo é realmente um ponteiro móvel para uma determinada revisão. Então, conceitualmente, você está criando um ramo, mas não no sentido em que o git pensa em ramos.
DLH
2
Então, no caso mais simples, onde eu tenho várias alterações lineares, quando eu faço uma revisão anterior, estou movendo o ponteiro HEAD para lá, o que significa que git logserá exibido em relação a esse ponto? E quando faço o checkout master, movo o ponteiro para a versão mais recente do branch master?
Nathan Long
7
@ Nathan: Exatamente. HEAD é algo chamado ref simbólico - geralmente é um ponteiro para outro ref (o ramo atualmente com check-out). git checkouté uma maneira de movimentar a cabeça. Quando você desanexou o HEAD, você apontou diretamente para o commit fornecido; quando você faz check-out do master novamente, ele aponta novamente para o master. (E muitos comandos como git logrealmente ter um intervalo de revisões, cujo padrão é HEAD.)
Cascabel
3
Sim - HEAD é o "pronome" usado para se referir a "A versão do código que está no diretório de trabalho". É também o pronome para "O pai de tudo o que você cometer a seguir"
Ana Betts
54

Quando você faz o checkout para uma confirmação específica, o git cria uma ramificação desanexada. Então, se você ligar para:

$ git branch 

Você verá algo como:

* (detached from 3i4j25)
  master
  other_branch

Para voltar ao chefe da ramificação principal, você só precisa fazer o checkout para sua ramificação principal:

$ git checkout master

Este comando excluirá automaticamente a ramificação desanexada.

Se git checkoutnão funcionar, você provavelmente modificou arquivos conflitantes entre ramificações. Para impedir que você perca o código, o git exige que você lide com esses arquivos. Você tem três opções:

  1. Esconda suas modificações (você pode abri-las mais tarde):

    $ git stash
    
  2. Descarte as alterações que redefinem a ramificação desanexada:

    $ git reset --hard
    
  3. Crie uma nova ramificação com as modificações anteriores e confirme-as:

    $ git checkout -b my_new_branch
    $ git add my_file.ext
    $ git commit -m "My cool msg"
    

Depois disso, você pode voltar ao seu ramo principal (versão mais recente):

$ git checkout master
Thomio
fonte
36

Isso fez o truque para mim (eu ainda estava no ramo mestre):

git reset --hard origin/master
averasko
fonte
34
reset --hard é um exagero e demonstra que você não está ciente das modificações que você fez. Isso pode resultar na perda de código.
Thomio 8/03/16
1
No meu caso, eu queria me livrar de alterações confirmadas acidentalmente não enviadas. Eu sei que pode haver outros métodos para conseguir isso. Concordo que, se você não deseja perder suas alterações confirmadas sem push, isso é perda de dados.
Csaba Toth
8

Para retornar à versão mais recente:

git checkout <branch-name> 

Por exemplo, git checkout masterougit checkout dev

Reggie Pinkham
fonte
7

Você pode fazer o check-out usando nomes de filiais, por um lado.

Eu sei que existem várias maneiras de mover o HEAD, mas deixarei para um especialista em git enumerá-las.

Eu só queria sugerir gitk --all- achei extremamente útil ao começar com o git.

Jay
fonte
7

Eu estou apenas começando a cavar mais fundo em git, então não tenho certeza se eu entendi corretamente, mas acho que a resposta correta à pergunta do OP é que você pode executar git log --allcom uma especificação de formato como este: git log --all --pretty=format:'%h: %s %d'. Isso marca a versão atual com check-out como (HEAD)e você pode simplesmente pegar a próxima da lista.

BTW, adicione um alias como este ao seu .gitconfigcom um formato um pouco melhor e você poderá executar git hist --all:

  hist = log --pretty=format:\"%h %ai | %s%d [%an]\" --graph

Em relação às versões relativas, encontrei este post , mas ele fala apenas sobre versões mais antigas, provavelmente não há nada para se referir às versões mais recentes.

haridsv
fonte
6

Algumas das respostas aqui assumem que você está no ramo principal antes de decidir fazer o checkout de um commit mais antigo. Isso não é sempre o caso.

git checkout -

Irá apontar você de volta para o ramo em que estava anteriormente (independentemente de ser mestre ou não).

Itai Noam
fonte
Não é necessário um ramo, ele apontará HEAD para onde estava apontando antes; se você fez git checkout hash2depois git checkout hash1, git checkout -o levará de volta para hash1.
Mikhail Vasin
3

Quando você volta para uma versão anterior,

$ git checkout HEAD~2
Previous HEAD position was 363a8d7... Fixed a bug #32

Você pode ver seu log de recursos (hash) com este comando, mesmo nesta situação;

$ git log master --oneline -5
4b5f9c2 Fixed a bug #34
9820632 Fixed a bug #33
...

master pode ser substituído por outro nome de filial.

Em seguida, faça o checkout, você poderá voltar ao recurso.

$ git checkout 4b5f9c2
HEAD is now at 4b5f9c2... Fixed a bug #34
kujiy
fonte
1

Com o Git 2.23+ (agosto de 2019), a melhor prática seria usar em git switchvez do comando confusogit checkout .

Para criar uma nova ramificação com base em uma versão mais antiga:

git switch -c temp_branch HEAD~2

Para voltar ao ramo principal atual:

git switch master
VonC
fonte
0

Uma solução mais elegante e simples é usar

git stash

Ele retornará à versão local mais ressentida da ramificação e também salvará suas alterações no stash; portanto, se você quiser desfazer esta ação, faça:

git stash apply
Ilya Gazman
fonte
Eu sei que é muito antigo, mas tenho que fazer um comentário sobre isso (já que acho que essa solução não deve ser usada) - eu não usaria essa solução porque ela não resolve esse problema, mas um problema diferente. com essa solução stash toda vez que você deseja fazer o checkout para uma confirmação anterior, você realmente "salva" dados que são muito desnecessários para este caso. A maneira certa e mais elegante é (como afirmado anteriormente) fazer apenas o checkout do <branch>.
Maayao 28/03/19