https://eduspaces.ro/s/pro-git/capitol/s-7/?pdf=1
🧰 7. Git Tools
Unelte avansate: selectarea reviziilor, stash, rescrierea istoricului, reset, fuziuni avansate, submodule.
Bază (10)
Înregistrarea, în istoric, a snapshot-ului pregătit în staging area, cu autorul, mesajul și pointeri către commit-ul sau commit-urile părinte; este identificat prin checksum-ul SHA-1 și poți reveni oricând la el sau compara cu el.
Commit creat automat la o fuziune cu trei căi, special prin faptul că are mai mult de un părinte.
Succesiunea commit-urilor unui depozit, legate prin pointeri spre părinți; se vizualizează cu git log. Pentru unii este o înregistrare a ce s-a întâmplat cu adevărat, pentru alții povestea felului în care a fost făcut proiectul.
git stash (git stash push) salvează modificările neterminate, git stash list arată stiva, git stash apply le reaplică (stash@{2} pentru una mai veche), git stash drop șterge, iar git stash pop aplică și șterge.
Stash-ul preia starea „murdară” a working directory — fișierele urmărite modificate și modificările din staging — și o salvează pe o stivă de modificări neterminate, pe care o poți reaplica oricând, chiar pe altă ramură.
Apare când aceeași parte a aceluiași fișier a fost modificată diferit în cele două ramuri: Git oprește fuziunea fără să creeze merge commit-ul, iar fișierele în conflict apar ca unmerged până le rezolvi și le pui în staging.
Pointer special care arată ramura locală pe care te afli; git checkout îl mută pe altă ramură. Este de obicei o referință simbolică spre ramura curentă și va fi părintele următorului commit.
Cele trei „arbori” (colecții de fișiere) gestionați de Git: HEAD — snapshot-ul ultimului commit și părintele următorului, indexul — următorul commit propus, și working directory — sandbox-ul.
Un checkout al unei versiuni a proiectului: fișierele extrase din baza de date comprimată din directorul Git și puse pe disc ca să le folosești sau să le modifici. În „Reset Demystified” este numit sandbox.
Un fișier, de obicei în directorul Git, care păstrează ce va intra în următorul commit; numele lui tehnic este „index”. În „Reset Demystified”: indexul este următorul commit propus.
Aprofundare (12)
Git recunoaște un commit după primele caractere ale hash-ului SHA-1, dacă sunt cel puțin patru și neambigue (niciun alt obiect nu începe la fel).
Afișează un obiect: pentru o etichetă anotată arată informațiile etichetei, apoi commit-ul etichetat, cu diff-ul lui.
Jurnalul local, ținut de Git în fundal, al locurilor prin care au trecut HEAD și referințele ramurilor în ultimele luni; se vede cu git reflog și se folosește cu HEAD@{n}; util la recuperarea commit-urilor.
Moduri de a indica un commit prin strămoși: ^ (caret) după o referință înseamnă părintele ei (HEAD^, iar ^2 al doilea părinte al unui merge), ~ (tilde) tot primul părinte, iar HEAD~2 înseamnă bunicul.
Commit-ul (sau commit-urile) care precedă direct un commit; fiecare commit păstrează pointeri spre părinți, ceea ce leagă istoricul și permite găsirea automată a bazei de fuziune.
Șterge fișierele neurmărite din working directory (-f obligatoriu, -d și directoarele goale, -n de probă, -x și fișierele ignorate); periculos, fiindcă fișierele se pierd.
Modificarea commit-urilor deja făcute: schimbarea ordinii, a mesajelor sau a fișierelor, comasarea ori divizarea lor sau eliminarea completă — doar înainte de a împărți munca cu alții.
git rebase -i reaplică o serie de commit-uri peste aceeași bază, oprindu-se unde vrei: poți schimba mesaje, reordona, comasa (squash), diviza sau elimina commit-uri.
Comasarea mai multor commit-uri într-unul singur (de exemplu cu „squash” într-un rebase interactiv sau cu reset --soft).
Etapele lui git reset: 1) mută ramura spre care arată HEAD (se oprește aici cu --soft); 2) face indexul la fel ca HEAD (--mixed, implicit); 3) face working directory la fel ca indexul (--hard, singura variantă periculoasă).
Creează un commit nou care anulează toate modificările unui commit existent („revert”); pentru un merge commit se indică părintele păstrat cu -m 1.
Permite păstrarea unui depozit Git ca subdirector al altui depozit: poți clona alt depozit în proiectul tău și păstra commit-urile separate.
Detaliu (8)
Selectarea unui interval de commit-uri: double dot (master..experiment) — accesibile dintr-o referință, dar nu din cealaltă; triple dot — accesibile din oricare dintre ele, dar nu din amândouă.
git add -i (--interactive) deschide un mod interactiv în care pui în staging sau scoți fișiere ori doar porțiuni (patch-uri) din ele.
Semnarea și verificarea muncii cu GPG (GNU Privacy Guard): etichete semnate (git tag -s), verificate (git tag -v) și commit-uri semnate (git commit -S).
„Opțiunea nucleară”: rescrie automat un număr mare de commit-uri (de exemplu schimbarea adresei de e-mail sau eliminarea unui fișier din tot istoricul); doar pentru proiecte încă nepublicate.
„Reuse recorded resolution”: Git ține minte cum ai rezolvat un conflict și aplică automat aceeași rezolvare data viitoare.
Adnotează fiecare linie a unui fișier cu commit-ul și persoana care a modificat-o ultima dată (-L restrânge la un interval de linii).
Face o căutare binară prin istoricul commit-urilor pentru a găsi cât mai repede commit-ul care a introdus o problemă.
Sistemul de credentiale al lui Git (credential.helper: cache în memorie, store pe disc, keychain-ul sistemului) care evită introducerea utilizatorului și a parolei la fiecare acces prin HTTP.
Niciun concept nu se potrivește filtrului.