Files
second_gitea/git_sheet.md
2025-12-09 11:21:53 +00:00

456 lines
11 KiB
Markdown

# 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 <url> # 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 <url> # Adaugă remote (de obicei origin)
git remote add upstream <url> # 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 <url> 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ă!** 🚀