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

11 KiB

Git Cheatsheet - Ghid Complet

Bază - Comenzi Esențiale

Configurare

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

git init                          # Inițializează repo local
git clone <url>                   # Copiază repo de pe server

Status și Informații

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

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

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

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

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

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

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)

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)

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)

git checkout main
git merge feature-branch         # Combină feature în main
# Rezultat: istoric cu ramificații

Rebase (Istoricul liniar)

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ă)

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ă)

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ă)

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)

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)

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)

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)

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)

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)

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)

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)

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:

# 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

# 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

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ă)

# 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

git stash                        # Salvează modificările
git pull origin main             # Actualizează
git stash pop                    # Recuperează modificările

Vreau să modific ultimul commit

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

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

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ă

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


Salvează acest cheatsheet și îl ai mereu la îndemână! 🚀