Trimiterea și Aplicarea Patch-urilor de Cod cu git format-patch și git am în Git

Ghid complet pentru fluxul clasic descentralizat în Git: generarea patch-urilor conforme email cu git format-patch și aplicarea lor curată cu git am (Apply Mailbox).

Sintaxă comandă
git format-patch -1 HEAD | git am < 0001-modificare.patch

Înainte ca platformele centralizate precum GitHub sau GitLab să popularizeze modelul de Pull Requests, colaborarea distribuită în open-source se baza exclusiv pe schimbul de patch-uri transmise prin email (acesta rămâne și astăzi fluxul oficial prin care este dezvoltat nucleul Linux, Git și PostgreSQL). Comenzile git format-patch și git am (Apply Mailbox) oferă cel mai curat mecanism de transfer al modificărilor fără acces direct la un depozit comun.

1. Generarea fișierelor patch din commit-uri locale
# Generăm un fișier patch pentru ultimul commit:
git format-patch -1 HEAD

# Sau generăm patch-uri pentru toate commit-urile de pe branch-ul curent
# care nu există încă pe 'main':
git format-patch main..feature

# Această comandă creează fișiere numerotate pe disc:
# 0001-feat-adaugare-autentificare-oauth.patch
# 0002-fix-corectare-redirect-callback.patch

Ce conține un fișier generat de format-patch?

Spre deosebire de un simplu git diff (care conține doar diferențele de cod), un fișier format-patch este formatat conform standardului de email RFC 2822 și conține toate metadatele originale de commit: numele autorului, adresa de email, data exactă, mesajul complet de commit și diferența unificată (diff).

2. Aplicarea patch-ului pe depozitul de destinație cu git am
# Pe serverul sau mașina care primește patch-ul:
# Comanda 'git am' aplică patch-ul și RECONSTRUIEȘTE commit-ul original
# păstrând autorul și data exactă din fișierul patch!
git am 0001-feat-adaugare-autentificare-oauth.patch

# Dacă apare un conflict în timpul aplicării:
# 1. Rezolvați conflictul în fișierele marcate.
# 2. Adăugați fișierele rezolvate în staging: git add fisier.php
# 3. Continuați aplicarea: git am --continue
# (Sau renunțați complet la aplicare cu: git am --abort)