Reveniți la o confirmare Git veche într-un repo public (Programare, Git, Git Checkout, Git Revert)

David a intrebat.

Cum pot să mă întorc la un anumit commit în git?

Cel mai bun răspuns pe care mi l-a putut da cineva a fost să folosesc git revert de X ori până când ajung la confirmarea dorită.

Deci, să spunem că vreau să revin la un commit mai vechi de 20 de comenzi, va trebui să îl execut de 20 de ori.

Există o modalitate mai ușoară de a face acest lucru?

Nu pot folosi reset deoarece acest depozit este public.

Comentarii

  • git revert <commit> nu funcționează? –  > Por miku.
  • Așa cum am precizat în întrebarea mea, acest lucru nu mă ajută cu adevărat dacă vreau să revin la ceva de acum 20 de comenzi. –  > Por David.
  • Această întrebare a primit un răspuns destul de bun aici stackoverflow.com/questions/4114095/… – –  > Por user7610.
  • Nu este clar la ce vă referiți prin „revenire”. Înseamnă că doriți să comutați temporar copia de lucru la o anumită revizuire? Sau că vrei să inversezi permanent istoricul depozitului tău la o anumită revizuire? – user456814
  • Ar trebui să acceptați un răspuns și, eventual, să votați în sus orice alt răspuns pe care îl doriți. –  > Por Nabil Kadimi.
11 răspunsuri
Alex Reisner

Încearcă asta:

git checkout [revision] .

unde [revision] este hash-ul de confirmare (de exemplu: 12345678901234567890123456789012345678ab).

Nu uitați de . de la sfârșit, foarte important. Acest lucru va aplica modificările la întregul arbore. Ar trebui să executați această comandă în rădăcina proiectului git. Dacă vă aflați în orice subdirector, atunci această comandă modifică doar fișierele din directorul curent. Apoi faceți commit și ar trebui să fiți în regulă.

Puteți anula acest lucru prin

git reset --hard 

care va șterge toate modificările din directorul de lucru și din zona de staging.

Comentarii

  • @AlexReisner Acel punct de la sfârșit indică directorul în care vă aflați în prezent, care nu este neapărat întregul proiect git, corect? Dacă ați dori să aplicați modificările la întregul proiect, ați folosi în schimb „:/” ca în „git add :/”, dacă nu vă aflați în prezent în rădăcina proiectului git? –  > Por MSpreij.
  • notă: dacă ați adăugat fișiere noi în proiect de atunci, acest lucru nu le va șterge. Deci, atunci când mergeți să construiți (în funcție de platforma dvs.), este posibil să primiți erori în continuare. Ștergeți fișierele noi și veți fi în regulă. –  > Por TheWestIsThe….
  • @MSpreij Ar trebui să executați această comandă în rădăcina proiectului git. Dacă vă aflați în orice subdirector, atunci această comandă modifică doar fișierele din directorul curent. –  > Por volatilevar.
  • Este grozav atunci când puteți clona un proiect într-un alt director și să utilizați git checkout [revision] . pentru a vă întoarce la o anumită revizuire și apoi să o comparați cu același proiect din alt director. Economisește mult timp. –  > Por Donato.
  • La naiba, am uitat de „.” ce pagubă am făcut depozitului meu ? –  > Por Bufniță.
Naga Kiran

Pentru a face rollback la un anumit commit:

git reset --hard commit_sha

Pentru a reveni cu 10 comenzi înapoi:

git reset --hard HEAD~10

Puteți folosi „git revert” ca în următoarea postare dacă nu doriți să rescrieți istoricul.

Cum să reveniți la un depozit Git la o confirmare anterioară?

Comentarii

  • singura diferență între această abordare și „git checkout [revision] .” este că aceasta din urmă păstrează revizuirile. –  > Por deeshank.
  • 55

  • Acest răspuns este GREȘIT, deoarece OP afirmă în mod specific „Nu pot folosi resetarea pentru că acest repo este public” – –  > Por Yarin.
  • Dacă repo-ul este public, cred că nu există nici o modalitate de a anula confirmarea pe depozitul public fără a folosi force push (git push -f), deoarece va afecta persoanele care au introdus modificările înainte de anulare. Deci, resetarea poate fi utilizată și în sandbox-ul local al unui repo public. –  > Por Naga Kiran.
  • Este minunat că astfel se evită un HEAD detașat! Exact ceea ce căutam. –  > Por cyber-monk.
  • @Yarin răspunsul este BUN, premisele lui OP sunt GREȘITE că nu poate folosi reset pe repo-ul public. El poate. Scuze pentru comentariul necromantic 😉 –  > Por 9ilsdx 9rvj 0lo.
Ben

Ei bine, cred că întrebarea este: ce înțelegi prin „roll back”? Dacă nu puteți reset pentru că este publică și vrei să păstrezi intact istoricul de confirmare, vrei să spui că vrei doar ca copia ta de lucru să reflecte o anumită confirmare? Utilizați git checkout și hash-ul de confirmare.

Editare: După cum s-a subliniat în comentarii, folosind git checkout fără a specifica o ramură vă va lăsa în starea „fără ramură”. Utilizați git checkout <commit> -b <branchname> pentru a face checkout într-o ramură, sau git checkout <commit> . pentru a face checkout în ramura curentă.

Comentarii

  • Acest lucru nu vă pune în starea ciudată „Not currently on any branch”? Cum se confirmă modificările pentru a finaliza rollback-ul? –  > Por Alex Reisner.
  • Ei bine, eu doar sugerez utilizarea git checkout — el este liber să facă check-out în orice ramură (actuală sau nouă) pe care o dorește. Îmi voi actualiza răspunsul pentru a nu fi ambiguu. –  > Por Ben.
  • Am încercat acest lucru, dar nu cred că acesta este modul corect de a face acest lucru, deoarece lasă fișiere stagnante. Acest lucru nu șterge fișierele care nu au fost în acea ultimă confirmare. –  > Por David.
  • Dacă vă aflați într-un director de lucru și rămâneți în master, aveți nevoie de git reset să ștergi acele fișiere, ceea ce tu spui că nu vrei să faci. Încearcă să o faci într-o ramură separată: git checkout <commit> -b <branchname>, , nu veți avea fișiere stagnante în acea ramură. –  > Por Ben.
  • Problema cu utilizarea checkout este că nu va șterge fișierele care au fost adăugate într-o confirmare anterioară. – user456814
user456814

Afișajul original afirmă:

Cel mai bun răspuns pe care mi l-a putut da cineva a fost să folosesc git revert de X ori până când ajung la confirmarea dorită.

Deci, să spunem că vreau să revin la un commit mai vechi de 20 de comenzi, ar trebui să îl execut de 20 de ori.

Există o modalitate mai ușoară de a face acest lucru?

Nu pot folosi reset pentru că acest repo este public.

Nu este necesar să folosesc git revert X ori. git revert poate accepta un interval de confirmări ca argument, astfel încât nu trebuie să îl utilizați decât o singură dată pentru a inversa un interval de confirmări. De exemplu, dacă doriți să anulați ultimele 20 de validări:

git revert --no-edit HEAD~20..

Intervalul de comenzi HEAD~20.. este o prescurtare pentru HEAD~20..HEAD, și înseamnă „începe de la 20a părinte al confirmării HEAD și inversați toate confirmările ulterioare până la HEAD”.

În acest fel, vor fi inversate ultimele 20 de validări, presupunând că niciuna dintre acestea nu este o comutare de fuziune. În cazul în care există comenzi de fuziune, nu le puteți inversa pe toate printr-o singură comandă, ci va trebui să le inversați individual cu

git revert -m 1 <merge-commit>

Rețineți, de asemenea, că am testat utilizarea unui interval cu git revert folosind versiunea git 1.9.0. Dacă utilizați o versiune mai veche de git, utilizarea unui interval cu git revert ar putea sau nu să funcționeze.

În acest caz, git revert este preferat în locul lui git checkout.

Rețineți că, spre deosebire de acest răspuns care spune să folosiți git checkout, , git revertva elimina de fapt orice fișier care a fost adăugat în oricare dintre modificările pe care le redați., , ceea ce face ca aceasta să fie modalitatea corectă de a reveni la o serie de revizuiri.

Documentație

Comentarii

  • Notă: acest creează un nou commit cu modificările inversate. Perfect pentru întrebarea lui OP. Dar asigurați-vă că este ceea ce doriți. (Exemplele din git-revert la care se face trimitere mai sus sunt excelente). Dacă, în schimb, doriți să investigheați confirmările anterioare (adică înainte de a alege la ce confirmare să reveniți), utilizați opțiunea checkout menționată în alte răspunsuri, ținând cont de comentariile făcute de alții cu privire la fișierele șterse. –  > Por SherylHohman.
  • @SherylHohman Revenirea la o confirmare anterioară nu creează o nouă confirmare. Nu-mi pot imagina ce vrei să spui aici. – user146043
Igor

Pasul 1: Obține lista de comenzi:

git log

Veți obține o listă ca în acest exemplu:

[Comp:Folder User$ git log
commit 54b11d42e12dc6e9f070a8b5095a4492216d5320
Author: author <[email protected]>
Date:   Fri Jul 8 23:42:22 2016 +0300

This is last commit message

commit fd6cb176297acca4dbc69d15d6b7f78a2463482f
Author: author <[email protected]>
Date:   Fri Jun 24 20:20:24 2016 +0300

This is previous commit message

commit ab0de062136da650ffc27cfb57febac8efb84b8d
Author: author <[email protected]>
Date:   Thu Jun 23 00:41:55 2016 +0300

This is previous previous commit message
...

Pasul 2: copiați hash-ul de commit necesar și lipiți-l pentru checkout:

git checkout fd6cb176297acca4dbc69d15d6b7f78a2463482f

Asta e tot.

Comentarii

  • Și acest lucru afectează doar localul tău, nu? Trebuie să găsesc locul unde a apărut o eroare și aveam de gând să folosesc această abordare pentru a continua să obțin diferite comenzi până când eroarea dispare. Totuși, vreau să modific doar localul meu, nu și remote. –  > Por Bob Horn.
jthill
git read-tree -um @ $commit_to_revert_to

o va face. Este „git checkout”, dar fără a actualiza HEAD.

Puteți obține același efect cu

git checkout $commit_to_revert_to
git reset --soft @{1}

dacă preferați să înșirați comenzi de confort împreună.

Acestea vă lasă cu arborele de lucru și indexul în starea dorită, puteți doar git commit pentru a termina.

Comentarii

  • Aceasta este singura abordare directă care a funcționat ca prin minune! Am verificat din head, am rulat această comandă și a eliminat cu succes fișierele adăugate pe care le-am introdus și a anulat toate modificările. Excelent. –  > Por kamranicus.
basickarl

Doriți modul detașat HEAD?

Dacă doriți să reveniți X timp la o anumită confirmare cu un HEAD DETACHED (adică nu puteți strica nimic), atunci, prin toate mijloacele, folosiți următoarele:

(înlocuiți X cu numărul de comenzi la care doriți să vă întoarceți)

git checkout HEAD~X

De exemplu, pentru a vă întoarce înapoi cu un singur commit:

git checkout HEAD~1

Comentarii

  • aș elimina partea cu …greu de crezut… Pare ceva personal și, de asemenea, cineva a menționat acest lucru într-un comentariu de mai sus, precum și @ken în răspunsul său. –  > Por meJustAndrew.
  • @meJustAndrew Așa este, atât de multe răspunsuri pe SO care doar încurcă oamenii, este destul de enervant. –  > Por basickarl.
  • Ce răspuns simplu și direct. –  > Por Ammad.
Donato

Să spunem că lucrezi la un proiect și după o zi sau două. Observați că o caracteristică vă dă în continuare erori. Dar nu știți ce modificare ați făcut care a cauzat eroarea. Așa că trebuie să pescuiești comenzile de lucru anterioare. Pentru a reveni la o anumită confirmare:

git checkout 8a0fe5191b7dfc6a81833bfb61220d7204e6b0a9 .

Bine, deci acel commit funcționează pentru tine. Nu mai există erori. Ați identificat problema. Acum vă puteți întoarce la ultima confirmare:

git checkout 792d9294f652d753514dc2033a04d742decb82a5 .

și să verificați un anumit fișier înainte de a cauza eroarea (în cazul meu folosesc exemplul Gemfile.lock):

git checkout 8a0fe5191b7dfc6a81833bfb61220d7204e6b0a9 -- /projects/myproject/Gemfile.lock

Și aceasta este o modalitate de a gestiona erorile pe care le-ați creat în comisioane fără să vă dați seama de erori până mai târziu.

Naved Ahmad

Puteți găsi ID-ul de comitere legat de fiecare comitere în secțiunea de comitere din GitHub/BitBucket/Gitlab. este foarte simplu, să presupunem că ID-ul dvs. de comitere este 5889575 atunci, dacă doriți să vă întoarceți la această parte din codul dumneavoastră, trebuie doar să tastați

git checkout 5889575 .

Acest lucru vă va duce la acel moment din cod.

ken

Nu sunt sigur ce s-a schimbat, dar nu pot să verific o anumită confirmare fără opțiunea --detach. Comanda completă care a funcționat pentru mine a fost:git checkout --detach [commit hash]

Pentru a mă întoarce din starea detașată a trebuit să fac checkout la ramura mea locală: git checkout master

Comentarii

  • Checking out master rezolvă problema de a rămâne detașat, în timp ce a face git reset --hard sau git checkout -- . did a funcționat, dar a rămas detașat –  > Por DarkCygnus.
mcvkr

Aici este un exemplu pentru a face asta

    cd /yourprojects/project-acme 


    git checkout efc11170c78 .