# Git Cheatsheet - Ghid Complet ## Bază - Comenzi Esențiale ### Configurare ```bash git config --global user.name "Numele Tău" git config --global user.email "email@tau.com" git config --global credential.helper store # Salvează parola ``` ### Început proiect ```bash git init # Inițializează repo local git clone # Copiază repo de pe server ``` ### Status și Informații ```bash git status # Vezi starea fișierelor git log # Istoric commit-uri git log --oneline # Istoric compact git log --oneline --graph --all # Istoric vizual cu branch-uri ``` --- ## Lucrul cu Fișiere ### Adăugare și Commit ```bash git add file.txt # Adaugă un fișier git add . # Adaugă toate fișierele git commit -m "mesaj" # Commit cu mesaj git commit -am "mesaj" # Add + commit (doar fișiere tracked) ``` ### Vedere Diferențe ```bash git diff # Diferențe neincluse în commit git diff --staged # Diferențe pregătite pentru commit git diff branch1 branch2 # Diferențe între branch-uri ``` --- ## Branch-uri ### Creare și Navigare ```bash git branch # Lista branch-uri locale git branch -a # Lista toate branch-urile (local + remote) git branch nume-branch # Creează branch nou git checkout nume-branch # Mergi pe branch git checkout -b nume-branch # Creează ȘI mergi pe branch nou git switch nume-branch # Alternativă modernă la checkout ``` ### Ștergere Branch ```bash git branch -d nume-branch # Șterge branch local (safe) git branch -D nume-branch # Șterge forțat git push origin --delete branch # Șterge branch remote ``` --- ## Remote (Colaborare) ### Adăugare și Vedere ```bash git remote -v # Vezi remote-urile configurate git remote add origin # Adaugă remote (de obicei origin) git remote add upstream # Adaugă al 2-lea remote ``` ### Push și Pull ```bash git push origin main # Trimite pe server (branch main) git push origin nume-branch # Trimite branch specific git push -u origin main # Push + setează tracking git push --force # Push forțat (PERICULOS!) git pull origin main # Descarcă + merge automat git fetch origin # Doar descarcă info (fără merge) git fetch origin main # Descarcă info despre branch specific ``` --- ## Fetch vs Pull ### Git Fetch (Doar informații) ```bash git fetch origin main # Descarcă info, NU modifică codul git log origin/main # Vezi ce e nou git diff main origin/main # Compară diferențele git merge origin/main # Aplici manual când ești gata ``` ### Git Pull (Fetch + Merge automat) ```bash git pull origin main # Descarcă ȘI aplică imediat # Echivalent cu: # git fetch origin main # git merge origin/main ``` --- ## Merge vs Rebase ### Merge (Combină branch-uri) ```bash git checkout main git merge feature-branch # Combină feature în main # Rezultat: istoric cu ramificații ``` ### Rebase (Istoricul liniar) ```bash git checkout feature-branch git rebase main # Mută commit-urile după main # Rezultat: linie dreaptă git rebase --continue # Continuă după rezolvare conflict git rebase --abort # Anulează rebase ``` **REGULĂ:** NU face rebase pe branch-uri publice (main, develop)! --- ## Stash (Salvare Temporară) ```bash git stash # Salvează modificările neterminate git stash save "mesaj" # Stash cu mesaj descriptiv git stash list # Vezi toate stash-urile git stash pop # Recuperează ultimul stash (îl șterge) git stash apply # Recuperează fără să-l șteargă git stash drop # Șterge stash-ul git stash clear # Șterge toate stash-urile ``` **Când:** Trebuie să schimbi branch-ul, dar nu vrei commit. --- ## Reset vs Revert ### Reset (Anulare locală) ```bash git reset --soft HEAD~1 # Anulează commit, păstrează modificările git reset --mixed HEAD~1 # Anulează commit + staging git reset --hard HEAD~1 # ȘTERGE tot (PERICULOS!) git reset --hard origin/main # Resetează la versiunea de pe server ``` **ATENȚIE:** NU folosi după push (strici istoricul)! ### Revert (Anulare publică) ```bash git revert abc123 # Creează commit NOU care anulează abc123 git revert HEAD # Anulează ultimul commit ``` **Sigur pentru branch-uri publice!** --- ## Cherry-pick (Ia commit specific) ```bash git cherry-pick abc123 # Copiază commit-ul abc123 în branch-ul curent git cherry-pick abc123 def456 # Copiază mai multe commit-uri ``` **Când:** Vrei UN bug fix dintr-un branch în altul, fără tot branch-ul. --- ## Tags (Versiuni) ```bash git tag # Lista tag-uri git tag v1.0.0 # Creează tag git tag -a v1.0.0 -m "Release 1.0.0" # Tag cu mesaj git push origin v1.0.0 # Trimite tag pe server git push origin --tags # Trimite toate tag-urile git tag -d v1.0.0 # Șterge tag local git push origin --delete v1.0.0 # Șterge tag remote ``` **Când:** Release-uri, versiuni stabile (v1.0.0, v2.1.3). --- ## .gitignore (Fișiere Ignorate) Creează fișier `.gitignore`: ``` # Dependencies node_modules/ vendor/ # Environment .env .env.local # Logs *.log # OS .DS_Store Thumbs.db # IDE .vscode/ .idea/ ``` --- ## Git Blame (Cine a scris codul) ```bash git blame file.txt # Vezi cine a modificat fiecare linie git blame -L 10,20 file.txt # Doar liniile 10-20 git log -p file.txt # Istoric complet al unui fișier git log --follow file.txt # Urmărește și redenumiri ``` --- ## Reflog (Recuperare după greșeli) ```bash git reflog # Vezi TOT istoricul (chiar și după reset) git reset --hard abc123 # Recuperezi la un commit vechi ``` **Când:** Ai dat reset din greșeală și vrei să recuperezi. --- ## Submodules (Repo în repo) ```bash git submodule add path/to/folder # Adaugă submodule git submodule init # Inițializează submodules git submodule update # Actualizează submodules git submodule update --init --recursive # Tot într-o comandă git submodule update --remote # Actualizează la versiunea nouă ``` **Când:** Include alte repo-uri (librării) în proiectul tău. --- ## Bisect (Găsește bug-ul) ```bash git bisect start # Începe căutarea git bisect bad # Commit-ul curent e stricat git bisect good abc123 # Commit-ul abc123 era OK # Git te plimbă prin istoric git bisect reset # Termină bisect ``` **Când:** Găsești commit-ul care a introdus bug-ul. --- ## Aliases (Scurtături) ```bash git config --global alias.st status git config --global alias.co checkout git config --global alias.br branch git config --global alias.ci commit git config --global alias.lg "log --oneline --graph --all" # Apoi folosești: git st # în loc de git status git lg # log frumos ``` --- ## Conventional Commits (Mesaje standardizate) ```bash git commit -m "feat: adaugă buton login" git commit -m "fix: rezolvă memory leak" git commit -m "docs: actualizează README" git commit -m "style: formatează cod" git commit -m "refactor: restructurează funcție" git commit -m "test: adaugă teste unitare" git commit -m "chore: actualizează dependencies" ``` --- ## Git Flow (Strategia de branch-uri) ### Branch-uri standard: - `main` / `master` - Production (cod live) - `develop` - Development (cod în dezvoltare) - `feature/*` - Funcționalități noi - `hotfix/*` - Fix-uri urgente pentru production - `release/*` - Pregătire release ### Workflow: ```bash # Feature nou git checkout develop git checkout -b feature/login # lucrezi... git checkout develop git merge feature/login # Hotfix urgent git checkout main git checkout -b hotfix/critical-bug # fix... git checkout main git merge hotfix/critical-bug git checkout develop git merge hotfix/critical-bug # Release git checkout develop git checkout -b release/v1.0.0 # pregătire... git checkout main git merge release/v1.0.0 git tag v1.0.0 ``` --- ## Rezolvare Conflicte ```bash # Conflict apare la merge/rebase git status # Vezi fișierele în conflict # Editezi manual fișierele (caută <<<<<<<, =======, >>>>>>>) git add file.txt # Marchezi ca rezolvat git commit # Pentru merge # SAU git rebase --continue # Pentru rebase # Anulare: git merge --abort # Anulează merge git rebase --abort # Anulează rebase ``` --- ## Comenzi Utile pentru Debugging ```bash git show abc123 # Arată detalii commit git show abc123:file.txt # Arată fișier dintr-un commit git diff HEAD~2 HEAD~1 # Compară 2 commit-uri git log --author="Nume" # Commit-uri de la o persoană git log --since="2 weeks ago" # Commit-uri recente git log --grep="bug" # Caută în mesaje commit git shortlog -sn # Statistici contribuitori ``` --- ## SSH Setup (Nu mai cere parolă) ```bash # Generează cheie ssh-keygen -t ed25519 -C "email@tau.com" # Copiază cheia publică cat ~/.ssh/id_ed25519.pub # Adaugă pe GitHub/Gitea: Settings → SSH Keys # Schimbă URL repo git remote set-url origin git@github.com:user/repo.git ``` --- ## Situații Comune ### Am uitat să fac pull înainte de modificări ```bash git stash # Salvează modificările git pull origin main # Actualizează git stash pop # Recuperează modificările ``` ### Vreau să modific ultimul commit ```bash git add file.txt git commit --amend # Modifică ultimul commit git commit --amend --no-edit # Fără să schimbi mesajul ``` ### Am făcut commit pe branch greșit ```bash git log # Notează hash-ul (abc123) git checkout branch-corect git cherry-pick abc123 # Copiază commit-ul git checkout branch-gresit git reset --hard HEAD~1 # Șterge commit-ul greșit ``` ### Vreau să văd ce va face pull ```bash git fetch origin main git diff main origin/main # Vezi diferențele git merge origin/main # Când ești gata ``` ### Am făcut push din greșeală ```bash git reset --hard HEAD~1 # Anulează local git push --force origin main # Anulează pe server (PERICULOS!) ``` **ATENȚIE:** --force șterge istoricul pentru toată lumea! --- ## Reguli de Aur 1. ✅ **Commit des** cu mesaje clare 2. ✅ **Pull înainte de push** pentru a evita conflicte 3. ✅ **Branch-uri pentru feature-uri** noi 4. ❌ **NU face rebase** pe branch-uri publice (main, develop) 5. ❌ **NU face push --force** dacă alții lucrează pe branch 6. ✅ **Folosește .gitignore** pentru fișiere sensibile 7. ✅ **Tag-uri pentru release-uri** --- ## Link-uri Utile - [Git Documentation](https://git-scm.com/doc) - [Git Cheatsheet Official](https://training.github.com/) - [Conventional Commits](https://www.conventionalcommits.org/) - [Git Flow](https://nvie.com/posts/a-successful-git-branching-model/) --- **Salvează acest cheatsheet și îl ai mereu la îndemână!** 🚀