456 lines
11 KiB
Markdown
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ă!** 🚀 |