Ștergerea unui commit git

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.

  1. git checkout b3d92c5 Verificați ultima comitere utilizabilă.
  2. git checkout -b repair Creați o ramură nouă pe care să lucrați.
  3. git cherry-pick 77b9b82 Rulați prin commit 3.
  4. git cherry-pick 2c6a45b Rulați prin commit 1.
  5. git checkout master Master checkout.
  6. git reset --hard b3d92c5 Resetează masterul pentru ultima comitere utilizabilă.
  7. git merge repair Îmbină noua ramură pe master.
  8. 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!

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *