diff --git a/git_sheet b/git_sheet new file mode 100644 index 0000000..85f9637 --- /dev/null +++ b/git_sheet @@ -0,0 +1,456 @@ +# 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ă!** 🚀 \ No newline at end of file