Cum se poate reveni la cea mai recentă confirmare după ce s-a verificat o confirmare anterioară? (Programare, Git, Controlul Versiunilor)

Leo Alekseyev a intrebat.

Uneori verific o versiune anterioară a codului pentru a examina sau testa. Am văzut instrucțiuni despre ce trebuie să fac dacă doresc să modific versiunile anterioare – dar să presupunem că nu fac nicio modificare. După ce am făcut, de ex. git checkout HEAD^, cum mă întorc la vârful ramurii? git log nu-mi mai arată SHA-ul ultimei confirmări.

Comentarii

  • În ceea ce privește git log propoziției din întrebarea dumneavoastră, puteți oricând să rulați git log --all (sau mai util, git log --oneline --graph --all). –  > Por Wildcard.
10 răspunsuri
Phil Miller

Dacă știi că trimiterea la care vrei să te întorci este capul unei ramuri sau este etichetată, atunci poți doar

git checkout branchname

De asemenea, puteți folosi git reflog pentru a vedea la ce alte comisioane HEAD (sau orice alt ref) a arătat în trecut.


Editat pentru a adăuga:

În versiunile mai noi de Git, dacă ați rulat doar git checkout sau altceva pentru a muta HEAD o singură dată, puteți, de asemenea, să faceți

git checkout -

pentru a trece înapoi la locul în care se afla înainte de ultima verificare. Acest lucru a fost motivat de analogia cu idiomul de shell cd - de a reveni la orice director de lucru în care se afla cineva anterior.

Comentarii

    33

  • Aș dori să menționez că exemplul tipic ar fi „git checkout master”. Una dintre dificultățile pe care le-am întâmpinat învățând să folosesc git a fost că nu știam ce cuvinte cheie specifice (de exemplu, „master”) pot înlocui de fapt cuvintele de tip „branchname”. –  > Por AbePralle.
  • master nu este de fapt niciun fel de cuvânt cheie, așa cum HEAD este. Este doar numele implicit al ramurii într-un nou depozit. Puteți rula git branch pentru a obține o listă a ramurilor din depozit și git tag -l pentru o listă de etichete. În mod similar, origin este denumirea implicită a remote-ului de la care este clonat un depozit, dar nu are nimic special. –  > Por Phil Miller.
  • Dacă nu a fost clar, git reflog vă oferă o listă de hașuri, moment în care puteți folosi git checkout [commit-hash]. –  > Por jbnunn.
  • Am șters un fișier și am încercat comanda, dar nu îl resetează complet. În primul rând, nu este recursiv. Apoi, când încerc acest lucru pe fișierul pe care l-am șters, git îmi spune ulterior că HEAD este detașat. Ce să fac? –  > Por Daniel S..
  • @DanielS.: Întrebarea și răspunsul meu au fost despre comenzi, în timp ce tu vorbești despre fișiere. Git le tratează destul de diferit. –  > Por Phil Miller.
Bruce Wells

git checkout master

master este vârful, sau ultima confirmare. gitk vă va arăta doar până la locul în care vă aflați în arbore în acel moment. git reflog va afișa toate confirmările, dar în acest caz, doriți doar vârful, așa că git checkout master.

Comentarii

  • Aceasta. Sau git checkout branchname –  > Por Alex de la Jitbit.
816-8055

Am dat peste această întrebare chiar acum și am ceva de adăugat

Pentru a merge la cea mai recentă confirmare:

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

Explicație:

git log --branches afișează jurnalul de confirmări din toate ramurile locale
-1 limitarea la o singură confirmare → cea mai recentă confirmare
--pretty=format:"%H" formatul pentru a afișa doar hash-ul de confirmare
git checkout $(...) să utilizeze rezultatul subshell-ului ca argument pentru checkout

Notă:

Acest lucru va avea ca rezultat un cap detașat (deoarece facem checkout direct la confirmare). Acest lucru poate fi evitat prin extragerea numelui ramurii folosind sed, explicat mai jos.


Pentru a merge la ramura celei mai recente confirmări:

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

Explicație:

git log --branches afișează jurnalul de confirmări din toate ramurile locale
-1 limitare la o singură confirmare → cea mai recentă confirmare
--pretty=format:"%D" format pentru a afișa doar numele ref.
| sed 's/.*, //g' ignorați toate referințele, cu excepția ultimei referințe multiple (*)
git checkout $(...) utilizează rezultatul subshell-ului ca argument pentru checkout

*) HEAD și ramurile de la distanță sunt listate primele, ramurile locale sunt listate ultimele în ordine alfabetică descrescătoare, astfel încât cel rămas va fi primul nume de ramură în ordine alfabetică

Notă:

Această operațiune va utiliza întotdeauna numai primul nume de ramură (în ordine alfabetică) dacă există mai multe pentru acea confirmare.


În orice caz, cred că cea mai bună soluție ar fi doar afișarea numelor de referință pentru cea mai recentă confirmare, pentru a ști unde să se facă checkout:

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

De exemplu, să se creeze aliasul git top pentru această comandă.

Comentarii

  • Cumva am greșit a doua comandă… Am reparat-o. Acum vă va verifica corect la ramura celei mai recente comenzi. –  > Por 816-8055.
  • Alias Bash/zsh pentru comanda de întoarcere la cap. alias git-head='git checkout $(git log --branches -1 --pretty=format:"%D" | sed "s/.*, //g")' –  > Por Salut-Angel.
tanascius

Aruncă o privire la interfața grafică … gitk arată toate comenzi. Uneori este mai ușor să lucrezi grafic … ^^

Comentarii

  • da, de fapt așa am făcut-o și eu în trecut — dar nu am GUI-ul disponibil în acest moment –  > Por Leo Alekseyev.
hothead1000

Puteți folosi una dintre următoarele comenzi git pentru acest lucru:

git checkout master
git checkout branchname

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

abdesselam

Afișează toate ramurile și confirmă
git log –branches –oneline

arată ultima confirmare
git log –branches -1 –oneline

arată înainte de ultima confirmare
git log –branches -2 –oneline

Comentarii

  • Prima comandă va confirma de fapt ce cod este în prezent etapizat, sau interpretez greșit acest lucru? –  > Por Lazerbeak12345.
ConorR

Dacă aveți o ramură diferită de master, o modalitate ușoară este să verificați acea ramură, apoi să verificați master. Voila, vă aflați din nou la vârful masterului. Probabil că există modalități mai inteligente…

Ankit Singh

Puteți face pur și simplu git pull origin branchname. Acesta va prelua din nou cea mai recentă confirmare.

Comentarii

  • Nu vă recomand acest lucru dacă nu doriți să trageți din upstream. Ar trebui să gestionați conflictele de fuziune doar atunci când sunteți gata să o faceți. –  > Por Lazerbeak12345.
  • Ei bine, în acest caz, capul va rămâne în stare de detașare chiar dacă faceți checkout la ultimul commit. –  > Por Ankit Singh.
Jackie Xu

Dacă cea mai recentă confirmare este pe ramura principală, puteți folosi pur și simplu

git checkout master