Bine ați venit la ghidul nostru final la git reset și git revert comenzi. Acest tutorial vă va învăța tot ce trebuie să știți despre remedierea greșelilor obișnuite și anularea comiterilor greșite în timp ce utilizați Git.

Înțelegeți cele trei secțiuni ale unui proiect Git

Un proiect Git are următoarele trei secțiuni principale:

  1. Director Git
  2. Director de lucru (sau arborele de lucru)
  3. Zona de organizare

Director Git (situat în YOUR-PROJECT-PATH/.git/) este locul unde Git stochează tot ce are nevoie pentru a urmări cu precizie proiectul. Aceasta include metadate și o bază de date obiect care include versiuni comprimate ale fișierelor proiectului.

director de lucru este locul în care un utilizator face modificări locale la un proiect. Directorul de lucru extrage fișierele proiectului din baza de date a obiectelor din directorul Git și le plasează pe mașina locală a utilizatorului.

Notă: Director este, de asemenea, cunoscut sub numele de Repertoriu sau repo formă scurtă. Repo pe mașina locală a utilizatorului se numește „Repo local”, în timp ce repo pe serverul git se numește „Repoare la distanță”.

zona de punere în scenă este un fișier (numit și „index”, „etapă” sau „cache”) care stochează informații despre ceea ce va intra în următorul dvs. commit. Un commit este atunci când îi spui Git să salveze aceste modificări etapizate. Git face un instantaneu al fișierelor așa cum sunt și stochează permanent acel instantaneu în directorul Git.

Cu trei secțiuni, există trei stări principale în care un fișier poate fi în orice moment: modificat, comis sau aranjat. Tu modifica un fișier de fiecare dată când faceți modificări în directorul dvs. de lucru. În continuare, este pus în scenă când îl mutați în zona de înscenare. În cele din urmă, este angajat după o comitere.

Resetare Git

git reset comanda vă permite să RESTAȚI capul curent într-o stare specificată. Puteți reseta starea anumitor fișiere, precum și o întreagă ramură. Acest lucru este util dacă nu v-ați împins până acum commitul către GitHub sau alt depozit la distanță.

Resetați un fișier sau un set de fișiere

Următoarea comandă vă permite să alegeți selectiv bucăți de conținut și să îl reveniți sau să îl dezinstalați.

git reset (--patch | -p) [tree-ish] [--] [paths]

Deconectați un fișier

Dacă ați mutat un fișier în zona intermediară cu git add, dar nu mai doriți să facă parte dintr-un commit, puteți utiliza git reset pentru a dezinstala acel fișier:

git reset HEAD FILE-TO-UNSTAGE

Modificările pe care le-ați făcut vor fi în continuare în fișier, această comandă elimină doar fișierul din zona dvs. de stocare.

Resetați o sucursală la o confirmare anterioară

Următoarea comandă resetează HEAD-ul ramurii curente la cel dat COMMIT și actualizează indexul. Practic, derulează starea sucursalei dvs., apoi toate angajamentele pe care le faceți înainte scriu peste orice a venit după punctul de resetare. Dacă omiteți MODE, este implicit --mixed:

git reset MODE COMMIT

Opțiunile pentru MODE sunteți:

  • --soft: nu resetează fișierul index sau arborele de lucru, dar resetează HEAD la commit. Modifică toate fișierele în „Modificări care urmează să fie comise”
  • --mixed: resetează indexul, dar nu arborele de lucru și raportează ceea ce nu a fost actualizat
  • --hard: resetează indexul și arborele de lucru. Orice modificare a fișierelor urmărite din arborele de lucru de atunci commit sunt aruncate
  • --merge: resetează indexul și actualizează fișierele din arborele de lucru care sunt diferite între commitși HEAD, dar păstrează cele care sunt diferite între index și arborele de lucru
  • --keep: resetează intrările index și actualizează fișierele din arborele de lucru care sunt diferite între commitși CAP. Dacă un fișier care diferă între commit iar HEAD are modificări locale, resetarea este întreruptă

Notă importantă despre resetările hard

Fiți foarte atenți când utilizați --hard opțiune cu git reset deoarece resetează comiterea, zona de organizare și directorul de lucru. Dacă această opțiune nu este utilizată corespunzător, atunci se poate pierde codul scris.

Git Revert

Amandoua git revert și git reset comenzile anulează comitetele anterioare. Dar dacă v-ați împins deja comitetul către un depozit la distanță, este recomandat să nu îl utilizați git reset întrucât rescrie istoria comiterilor. Acest lucru poate face foarte dificil lucrul la un depozit cu alți dezvoltatori și menținerea unui istoric consecvent al comitetelor.

În schimb, este mai bine să utilizați git revert, care anulează modificările făcute de un commit anterior prin crearea unui commit complet nou, totul fără a modifica istoricul comiterilor.

Reveniți la un commit sau un set de commit

Următoarea comandă vă permite să reveniți la modificările dintr-o confirmare sau validări anterioare și să creați o nouă validare.

git revert [--[no-]edit] [-n] [-m parent-number] [-s] [-S[<keyid>]] <commit>…
git revert --continue
git revert --quit
git revert --abort

Opțiuni comune:

  -e
  --edit
  • Aceasta este opțiunea implicită și nu trebuie setată în mod explicit. Deschide editorul de text implicit al sistemului și vă permite să editați noul mesaj de confirmare înainte de a comite revenirea.
  • Această opțiune face opusul -e, și git revert nu va deschide editorul de text.
  • Această opțiune previne git revert de la anularea unui commit anterior și crearea unuia nou. În loc să creeze un nou commit, -n va anula modificările de la validarea anterioară și le va adăuga în Indexul de etapizare și în Directorul de lucru.
  --no-edit
-n
-no-commit

Exemplu.

Să ne imaginăm următoarea situație: 1.) Lucrați la un fișier și adăugați și comiteți modificările. 2.) Apoi lucrați la alte câteva lucruri și faceți câteva angajamente. 3.) Acum îți dai seama, acum trei sau patru comisii, ai făcut ceva ce ai vrea să anulezi – cum poți face asta?

S-ar putea să vă gândiți, pur și simplu folosiți git reset, dar aceasta va elimina toate validările după cea pe care ați dori să o modificați – git revert la salvare! Să parcurgem acest exemplu:

mkdir learn_revert # Create a folder called `learn_revert`
cd learn_revert # `cd` into the folder `learn_revert`
git init # Initialize a git repository

touch first.txt # Create a file called `first.txt`
echo Start >> first.txt # Add the text "Start" to `first.txt`

git add . # Add the `first.txt` file
git commit -m "adding first" # Commit with the message "Adding first.txt"

echo WRONG > wrong.txt # Add the text "WRONG" to `wrong.txt`
git add . # Add the `wrong.txt` file
git commit -m "adding WRONG to wrong.txt" # Commit with the message "Adding WRONG to wrong.txt"

echo More >> first.txt # Add the text "More" to `first.txt`
git add . # Add the `first.txt` file
git commit -m "adding More to first.txt" # Commit with the message "Adding More to first.txt"

echo Even More >> first.txt # Add the text "Even More" to `first.txt`
git add . # Add the `first.txt` file
git commit -m "adding Even More to First.txt" # Commit with the message "Adding More to first.txt"

# OH NO! We want to undo the commit with the text "WRONG" - let's revert! Since this commit was 2 from where we are not we can use git revert HEAD~2 (or we can use git log and find the SHA of that commit)

git revert HEAD~2 # this will put us in a text editor where we can modify the commit message.

ls # wrong.txt is not there any more!
git log --oneline # note that the commit history hasn't been altered, we've just added a new commit reflecting the removal of the `wrong.txt`

Și cu asta ești cu un pas mai aproape de a-ți pune centura neagră în Git.