Când lucrați cu Git, veți descoperi că uneori commit-urile trebuie eliminate deoarece au introdus o eroare sau trebuie să fie refăcute.
Dacă este ultima comitere este foarte simplă. Pur și simplu rulați:
git reset HEAD^
Acest lucru va apărea de la ultima validare, dar va lăsa intacte toate modificările dvs. la fișiere.
Dacă trebuie să ștergeți mai mult decât ultimul commit, există două metode pe care le puteți utiliza. Primul este utilizarea rebase, acest lucru vă va permite să eliminați una sau mai multe confirmări consecutive, cealaltă este cherry-pick, care vă permite să eliminați confirmări non consecutive.
Exemplu git log
Număr | Hash | Mesaj de confirmare | Autor |
---|---|---|---|
1 | 2c6a45b | (HEAD) Adăugarea unei metode publice pentru a accesa metoda protejată | Tom |
2 | ae45fab | Actualizări ale interfeței bazei de date | Contractor 1 |
3 | 77b9b82 | Îmbunătățirea interfeței bazei de date | Contractor 2 |
4 | 3c9093c | Fuzionat dezvoltat ramură în master | Tom |
5 | b3d92c5 | Adăugarea unui nou modul CMS pentru evenimente | Paul |
6 | 7feddbb | Adăugarea clasei și fișierelor CMS | Tom |
7 | a809379 | Adăugarea proiectului la Git | Tom |
Folosind Rebase
Folosind jurnalul git de mai sus, dorim să eliminăm următoarele confirmări; 2 & 3 (ae45fab & 77b9b82). Deoarece sunt confirmări consecutive, putem folosi rebase.
git rebase --onto <branch name>~<first commit number to remove> <branch name>~<first commit to be kept> <branch name>
de exemplu, pentru a elimina confirmările 2 & 3 de mai sus
git rebase --onto repair~3 repair~1 repair
Utilizarea Cherry Pick
Pasul 1: Găsiți commitul înainte de commit doriți să eliminați git log
Pasul 2: Verificați comiterea git checkout <commit hash>
Pasul 3 : Faceți o nouă ramură folosind comitetul dvs. actual de verificare git checkout -b <new branch>
Pasul 4: Acum trebuie să adăugați comitetul după comiterea eliminată git cherry-pick <commit hash>
Pasul 5: Repetați acum Pasul 4 pentru toate celelalte confirmări pe care doriți să le păstrați.
Pasul 6: Odată ce toate validările au fost adăugate la noua filială și au a fost angajat. Verificați dacă totul este în starea corectă și funcționează conform intenției. Verifică de două ori totul a fost angajat: git status
Pasul 7: comută la ramura ta ruptă git checkout <broken branch>
Pasul 8: acum efectuați o resetare hard pe ramura ruptă la commit înainte de cea pe care doriți să o eliminați git reset --hard <commit hash>
Pasul 9: Mergeți ramură fixă în această ramură git merge <branch name>
Pasul 10: împingeți modificările combinate înapoi la origine. AVERTISMENT: Aceasta va suprascrie repo la distanță! git push --force origin <branch name>
Puteți face procesul fără a crea o ramură nouă înlocuind pasul 2 & 3 cu pasul 8, apoi nu efectuați pasul 7 & 9.
Exemplu
Spuneți că dorim să eliminăm comitetele 2 & 4 din repo.
-
git checkout b3d92c5
Verificați ultima comitere utilizabilă. -
git checkout -b repair
Creați o ramură nouă pe care să lucrați. -
git cherry-pick 77b9b82
Rulați prin commit 3. -
git cherry-pick 2c6a45b
Rulați prin commit 1. -
git checkout master
Master checkout. -
git reset --hard b3d92c5
Resetează masterul pentru ultima comitere utilizabilă. -
git merge repair
Îmbină noua ramură pe master. -
git push --hard origin master
Push master la repo la distanță.
Notă finală
Git rebase & cherrypick sunt periculoase, dar puternice soluții care ar trebui folosite doar ca ultim opțiune și să fie întreprinsă numai de cineva care știe ce fac. Aveți grijă că ambele soluții ar putea avea efecte adverse asupra altor utilizatori care lucrează la același depozit / ramură.
În cele din urmă, nu uitați să aveți grijă și noroc!