Come tornare all'ultimo commit dopo aver verificato un commit precedente?


477

A volte controllo qualche versione precedente del codice per esaminare o testare. Ho visto le istruzioni su cosa fare se desidero modificare i commit precedenti, ma suppongo di non apportare modifiche. Dopo aver fatto git checkout HEAD^, ad esempio , come posso tornare in punta di ramo? ... git lognon mi mostra più lo SHA dell'ultimo commit.


11
Per quanto riguarda la git logfrase della tua domanda, puoi sempre correre git log --all(o più utilmente git log --oneline --graph --all).
Wildcard il

Risposte:


606

Se sai che il commit a cui vuoi tornare è il capo di un ramo o è taggato, allora puoi semplicemente

git checkout branchname

Puoi anche usare git reflogper vedere cosa ha commesso il tuo HEAD (o qualsiasi altro riferimento) in passato.


Modificato per aggiungere:

Nelle versioni più recenti di Git, se hai eseguito solo git checkouto qualcos'altro per spostare il tuo HEADuna volta, puoi anche farlo

git checkout -

per tornare a dove si trovava prima dell'ultimo pagamento. Ciò è stato motivato dall'analogia con il linguaggio della shell cd -per tornare alla directory di lavoro in cui ci si trovava precedentemente.


27
Vorrei menzionare che l'esempio tipico sarebbe "git checkout master". Una delle difficoltà che ho imparato ad usare git è stata non sapere quali parole chiave specifiche (ad esempio "master") posso effettivamente sostituire con parole segnaposto come "branchname".
AbePralle,

3
masterin realtà non è un qualsiasi tipo di parola chiave HEAD. È solo il nome del ramo predefinito in un nuovo repository. È possibile eseguire git branchper ottenere un elenco di rami nel proprio repository e git tag -lper un elenco di tag. Allo stesso modo, originè il nome predefinito del telecomando da cui viene clonato un repository, ma non c'è nulla di speciale al riguardo.
Phil Miller,

3
Se non fosse chiaro, git reflogti dà un elenco di hash, a quel punto puoi usare git checkout [commit-hash].
jbnunn,

Ho eliminato un file e provato il comando, ma non lo ripristina completamente. Prima di tutto, non è ricorsivo. Quindi quando provo questo sul file che ho eliminato, git mi dice che HEAD è stato rimosso. Cosa fare?
Daniel S.,

1
@DanielS .: La domanda e la mia risposta riguardavano il commit , mentre parli di file. Git li tratta in modo piuttosto diverso.
Phil Miller,

27

git checkout master

master è il suggerimento o l'ultimo commit. gitk ti mostrerà solo dove ti trovi nella struttura in quel momento. git reflog mostrerà tutti i commit, ma in questo caso, vuoi solo il suggerimento, quindi git checkout master.


1
Questo. Oppuregit checkout branchname
Alex

19

Ho affrontato questa domanda proprio ora e ho qualcosa da aggiungere

Per andare al commit più recente:

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

Spiegazione:

git log --branchesmostra il registro dei commit da tutte le filiali locali
-1a un solo commit → il
--pretty=format:"%H"formato di commit più recente per mostrare solo l'hash di commit
git checkout $(...) usa l'output di subshell come argomento per il checkout

Nota:

Ciò comporterà comunque una testa staccata (perché effettuiamo il checkout direttamente al commit). Questo può essere evitato estraendo il nome del ramo usando sed, spiegato di seguito.


Per andare al ramo del commit più recente:

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

Spiegazione:

git log --branchesmostra il registro dei commit da tutte le filiali locali
-1a un solo commit → il
--pretty=format:"%D"formato di commit più recente per mostrare solo i nomi di riferimento
| sed 's/.*, //g'ignora tutto tranne l'ultimo di più riferimenti (*)
git checkout $(...) usa l'output di subshell come argomento per il checkout

*) HEAD e i rami remoti sono elencati per primi, i rami locali sono elencati per ultimi in ordine alfabetico decrescente, quindi quello rimanente sarà il nome del primo ramo in ordine alfabetico

Nota:

Questo userà sempre il nome della filiale (in ordine alfabetico) solo se ce ne sono più per quel commit.


Ad ogni modo, penso che la soluzione migliore sarebbe quella di visualizzare i nomi di riferimento per il commit più recente per sapere dove effettuare il checkout per:

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

Ad esempio, creare l'alias git topper quel comando.


1
In qualche modo ho rovesciato il secondo comando ... Risolto il problema, ora verrà verificato correttamente il ramo del commit più recente.
816-8055

Alias ​​Bash / zsh per il comando per tornare alla testaalias git-head='git checkout $(git log --branches -1 --pretty=format:"%D" | sed "s/.*, //g")'
Hi-Angel

9

Dai un'occhiata alla GUI grafica ... gitkmostra tutti i commit. A volte è più facile lavorare graficamente ... ^^


sì, è così che l'ho fatto in passato, ma al momento non ho la GUI disponibile
Leo Alekseyev,

7

Per questo puoi usare uno dei seguenti comandi git:

git checkout master
git checkout branchname

4

mostra tutti i rami e impegna
git log --branches --oneline

mostra l'ultimo commit
git log --branches -1 --oneline

mostra prima dell'ultimo commit
git log --branches -2 --oneline


Il primo comando eseguirà effettivamente il commit del codice attualmente in scena o sto leggendo male questo?
Lazerbeak12345,

3
git reflog //find the hash of the commit that you want to checkout
git checkout <commit number>>

0

Se hai un ramo diverso dal master, un modo semplice è quello di controllare quel ramo, quindi controlla il master. Voila, sei tornata sulla punta del maestro. Probabilmente ci sono modi più intelligenti ...


0

Puoi semplicemente farlo git pull origin branchname. Recupera l'ultimo commit.


Non lo consiglio se non vuoi tirare da monte. Uno dovrebbe gestire i conflitti di unione solo quando sono pronti.
Lazerbeak12345,

Bene, in quel caso, il capo rimarrà nello stato separato anche se fai il checkout all'ultimo commit.
Ankit Singh,

-2

Se l'ultimo commit è sul ramo principale, puoi semplicemente usare

git checkout master
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.