2010-08-24 37 views
203

Mi sono recentemente trasferito da SVN a Git e sono un po 'confuso riguardo a qualcosa. Avevo bisogno di eseguire la versione precedente di uno script tramite un debugger, così ho fatto git checkout <previous version hash> e ho fatto ciò che dovevo fare.Come tornare alla versione più recente in Git?

Ora voglio tornare alla versione più recente, ma non conosco l'hash per questo. Quando digito git log, non lo vedo.

Come posso fare questo? Inoltre, c'è un modo più semplice per cambiare le versioni rispetto alla digitazione degli hash, ad esempio "torna indietro di due versioni" o "vai al più cronologicamente recente"?

risposta

247

git checkout master dovrebbe fare il trucco. Per tornare due versioni, si potrebbe dire qualcosa di simile git checkout HEAD~2, ma meglio per creare un ramo temporaneo basato in quel tempo, in modo git checkout -b temp_branch HEAD~2

+4

Cool! 'git checkout master' è esattamente come torno da un ramo. Questo significa che quando controllo una versione precedente, sto essenzialmente creando un ramo? –

+3

@Nathan: In git un ramo è in gran parte un puntatore mobile verso una certa revisione. Quindi concettualmente, si sta creando un ramo, ma non nel senso che git pensa ai rami. – DLH

+2

Quindi, nel caso più semplice, in cui ho una serie di modifiche lineari, quando eseguo il checkout di una revisione precedente, sto spostando il puntatore HEAD lì, il che significa che 'git log' verrà visualizzato relativamente a quel punto? E quando eseguo il checkout, sposto il puntatore sull'ultima versione del ramo principale? –

4

È possibile controllare l'utilizzo di nomi di filiale, per una cosa.

So che ci sono diversi modi per spostare l'HEAD in giro, ma lo lascerò a un esperto di git per enumerarli.

Volevo solo suggerire gitk --all - L'ho trovato estremamente utile quando si inizia con git.

+3

+1 per 'gitk --all'. ** COSÌ ** utile. – DLH

6

Sto appena iniziando a scavare più a fondo in git, quindi non sono sicuro se ho capito bene, ma penso che la risposta corretta alla domanda dell'OP è che è possibile eseguire git log --all con una specifica di formato come questa: git log --all --pretty=format:'%h: %s %d'. Questo contrassegna la versione attuale ritirata come (HEAD) e puoi semplicemente prendere il successivo dall'elenco.

BTW, aggiungere un alias come questo per il vostro .gitconfig con un formato leggermente migliore e si può eseguire git hist --all:

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

Per quanto riguarda le relative versioni, ho trovato questo post, ma parla solo di versioni precedenti, probabilmente non c'è nulla da riferire alle versioni più recenti.

22

Questo ha fatto il trucco per me (ero ancora sul ramo master):

git reset --hard origin/master

+23

** reset --hard ** è un overkill e dimostra che non sei a conoscenza delle modifiche apportate. Ciò può comportare la perdita di codice. – Thomio

+0

Nel mio caso volevo sbarazzarmi dei cambiamenti imprevisti imprevisti. So che ci possono essere altri metodi per raggiungere questo obiettivo. Sono d'accordo sul fatto che se non vuoi perdere le tue modifiche impreviste, questa è una perdita di dati. –

29

Quando si verifica a uno specifico impegno, git crea un ramo staccato. Quindi, se si chiama:

$ git branch 

potrete vedere qualcosa di simile:

* (detached from 3i4j25) 
    master 
    other_branch 

Per tornare alla testa ramo principale non vi resta che verifica al vostro ramo master di nuovo:

$ git checkout master 

Questo comando eliminerà automaticamente il ramo distaccato.

Se git checkout non funziona, probabilmente i file modificati sono in conflitto tra i rami. Per evitare di perdere codice git, devi gestire questi file.Sono disponibili tre opzioni:

  1. Stash le modifiche (li si può pop più tardi):

    $ git stash 
    
  2. annullare le modifiche azzerati-ing filiale distaccata:

    $ git reset --hard 
    
  3. Crea un nuovo ramo con le precedenti modifiche e confermale:

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

Dopo questo si può tornare al ramo master (versione più recente):

$ git checkout master 
0

Una soluzione più elegante e semplice è quello di utilizzare

git stash 

Sarà ritorna alla versione locale più risentita del ramo e salva anche le tue modifiche in stash, quindi se vuoi annullare questa azione fai:

git stash apply 
2

Quando si torna ad una versione precedente,

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

È possibile visualizzare il registro di funzione (hash) con questo comando anche in questa situazione;

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

master può essere sostituito con un altro nome di diramazione.

Quindi, checkout, sarete in grado di tornare alla funzione.

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

Per tornare alla versione più recente:

git checkout <branch-name> 

Per esempio, git checkout master o git checkout dev

Problemi correlati