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 applypentru patch-uri create cugit format-patchcând vrei să păstrezi autorul și mesajul: pentru acestea foloseștegit 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.