git apply în Git

Aplică un fișier patch (ieșirea lui git diff) peste directorul de lucru, fără să creeze commit, cu verificare înainte.

Sintaxă comandă
git apply [opțiuni] <fișier.patch>...

Ce face git apply

Un patch este un fișier text cu diferențe, obținut de obicei cu git diff > fix.patch. git apply citește acest fișier și face aceleași modificări în proiectul tău. Spre deosebire de git am, nu creează commit și nu păstrează autorul sau mesajul: doar modifică fișierele, ca și cum le-ai fi editat tu.

Comanda este „totul sau nimic”: dacă o singură bucată din patch nu se potrivește, nu aplică nimic. De aceea e bine să verifici întâi cu --stat (ce fișiere se schimbă) și --check (dacă se aplică fără erori). Cu -3 (--3way) Git încearcă o îmbinare cu marcaje de conflict acolo unde patch-ul nu se potrivește exact.

Opțiuni și argumente

Opțiune / Parametru Descriere
--stat Afișează doar statistica (fișiere și linii modificate), fără să aplice.
--check Verifică dacă patch-ul se aplică curat, fără să modifice nimic.
--index Aplică și în index (zona de staging), nu doar în fișiere.
-R, --reverse Aplică patch-ul invers (anulează modificările lui).
-3, --3way Dacă patch-ul nu se potrivește, încearcă o îmbinare în trei direcții și lasă marcaje de conflict.
-p N Elimină N componente din căile din patch (implicit 1, adică prefixele a/ și b/).
--reject Aplică bucățile care se potrivesc și salvează restul în fișiere .rej.

Exemple

Exemplul 1: Verificarea și aplicarea unui patch primit de la un coleg

Ion trimite modificarea ca fișier livrare.patch. Ana vede ce schimbă, verifică dacă se aplică și abia apoi îl aplică.

git init -q -b main magazin
cd magazin
git config user.name "Ana Popescu" && git config user.email "ana@exemplu.ro"
printf 'ORAS = "Iasi"\nLIVRARE = 15\n' > setari.py
git add . && git commit -q -m "Setari"
# Ion face modificarea și o exportă ca patch:
sed -i.bak 's/LIVRARE = 15/LIVRARE = 0  # gratuit peste 200 lei/' setari.py && rm setari.py.bak
git diff > ../livrare.patch
git checkout -q -- setari.py
# Ana primește patch-ul:
git apply --stat ../livrare.patch
git apply --check ../livrare.patch && echo "Patch-ul se aplica fara erori"
git apply ../livrare.patch
git status --short

Rezultat

 setari.py |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
Patch-ul se aplica fara erori
 M setari.py

Exemplul 2: Anularea unui patch aplicat

Cu -R aplici patch-ul invers și revii la starea de dinainte.

git init -q -b main magazin
cd magazin
git config user.name "Ana Popescu" && git config user.email "ana@exemplu.ro"
echo 'Pret: 100 lei' > pret.txt
git add . && git commit -q -m "Pret"
echo 'Pret: 80 lei' > pret.txt
git diff > ../reducere.patch
git apply -R ../reducere.patch
cat pret.txt
git apply ../reducere.patch
cat pret.txt

Rezultat

Pret: 100 lei
Pret: 80 lei

Exemplul 3: Patch care nu se mai potrivește

Între timp fișierul s-a schimbat, iar --check raportează exact linia care nu se potrivește. Nimic nu este modificat.

git apply --check ../livrare.patch

Ieșire în terminal

error: patch failed: setari.py:1
error: setari.py: patch does not apply

Greșeli frecvente

  • Folosirea git apply pentru patch-uri create cu git format-patch când vrei să păstrezi autorul și mesajul: pentru acestea folosește git am, care creează commit-urile.
  • Aplicarea directă fără --check în fișiere cu modificări nesalvate: dacă patch-ul eșuează la jumătatea unei serii aplicate manual, e greu de văzut ce a intrat și ce nu.

Comenzi înrudite

  • git diff: Afișează diferențele de cod (linie cu linie) între directorul de lucru, staging sau două versiuni diferite.
  • git stash: Salvează temporar modificările neterminate pe o stivă privată și lasă directorul de lucru curat.