git mergetool / git difftool în Git

Deschide conflictele de îmbinare sau diferențele dintre versiuni într-o unealtă vizuală (VS Code, Meld, vimdiff, KDiff3).

Sintaxă comandă
git mergetool [--tool=<unealtă>] [-y] [<fișier>...]
git difftool [--tool=<unealtă>] [-y] [-d] [<commit> [<commit>]] [-- <cale>...]

Ce face git mergetool / git difftool

git mergetool pornește, pe rând, pentru fiecare fișier aflat în conflict, o unealtă de îmbinare vizuală care arată trei variante: ce ai tu (LOCAL), ce vine din cealaltă ramură (REMOTE) și strămoșul comun (BASE). După ce salvezi rezultatul (MERGED), Git marchează fișierul ca rezolvat.

git difftool primește aceleași argumente ca git diff, dar deschide diferențele în unealta aleasă. Cu -d (--dir-diff) compari directoare întregi dintr-o dată. Unealta implicită se setează o dată, de exemplu git config --global merge.tool vscode și git config --global diff.tool vscode; git mergetool --tool-help listează uneltele recunoscute pe sistemul tău.

Opțiuni și argumente

Opțiune / Parametru Descriere
-t, --tool=UNEALTĂ Unealta folosită acum (de exemplu vscode, meld, vimdiff, kdiff3).
--tool-help Listează uneltele disponibile.
-y, --no-prompt Nu mai întreabă înainte de a deschide fiecare fișier.
-d, --dir-diff Doar la difftool: compară directoare întregi.
mergetool.keepBackup Variabilă de configurare: false nu mai lasă fișiere .orig după rezolvare.
mergetool.&lt;nume&gt;.cmd Comandă proprie pentru o unealtă, cu variabilele $LOCAL, $REMOTE, $BASE, $MERGED.

Exemple

Exemplul 1: Configurarea VS Code ca unealtă de diff și merge

Setări globale, făcute o singură dată. --wait face ca Git să aștepte închiderea tab-ului din VS Code.

git config --global merge.tool vscode
git config --global mergetool.vscode.cmd 'code --wait --merge $REMOTE $LOCAL $BASE $MERGED'
git config --global diff.tool vscode
git config --global difftool.vscode.cmd 'code --wait --diff $LOCAL $REMOTE'
git config --global mergetool.keepBackup false
git mergetool

Ieșire în terminal

Merging:
pret.txt

Normal merge conflict for 'pret.txt':
  {local}: modified file
  {remote}: modified file

Exemplul 2: Rezolvarea unui conflict cu o unealtă proprie

Ca exemplul să ruleze fără interfață grafică, definim o „unealtă” care alege mereu varianta din cealaltă ramură. Observă fișierul pret.txt.orig lăsat ca rezervă.

git init -q -b main magazin
cd magazin
git config user.name "Ana Popescu" && git config user.email "ana@exemplu.ro"
echo 'Livrare: 15 lei' > pret.txt && git add . && git commit -q -m "Pret initial"
git switch -q -c reducere
echo 'Livrare: 10 lei' > pret.txt && git commit -q -am "Livrare 10 lei"
git switch -q main
echo 'Livrare: 20 lei' > pret.txt && git commit -q -am "Livrare 20 lei"
git merge reducere >/dev/null || true
git config mergetool.alegeremea.cmd 'cp "$REMOTE" "$MERGED"'
git config mergetool.alegeremea.trustExitCode true
git mergetool --tool=alegeremea --no-prompt
git status --short
cat pret.txt

Rezultat

Merging:
pret.txt

Normal merge conflict for 'pret.txt':
  {local}: modified file
  {remote}: modified file
M  pret.txt
?? pret.txt.orig
Livrare: 10 lei

Exemplul 3: Diferențele dintre două commit-uri într-o unealtă externă

Aici „unealta” este chiar diff -u, ca să vezi ce primește: o copie a fișierului din fiecare commit.

git init -q -b main magazin
cd magazin
git config user.name "Ana Popescu" && git config user.email "ana@exemplu.ro"
echo 'Livrare: 15 lei' > pret.txt && git add . && git commit -q -m "Pret initial"
echo 'Livrare: 20 lei' > pret.txt && git commit -q -am "Livrare 20 lei"
git -c difftool.arata.cmd='diff -u "$LOCAL" "$REMOTE" | tail -n +3' difftool --tool=arata -y HEAD~1 HEAD

Rezultat

@@ -1 +1 @@
-Livrare: 15 lei
+Livrare: 20 lei

Greșeli frecvente

  • Comiterea fișierelor *.orig rămase după git mergetool: setează mergetool.keepBackup false sau adaugă *.orig în .gitignore.
  • Lipsa opțiunii --wait la editoare grafice (VS Code, Sublime): Git crede că unealta s-a închis imediat și întreabă dacă îmbinarea a reușit înainte să apuci să rezolvi conflictul.

Comenzi înrudite

  • git merge: Îmbină istoricul și modificările dintr-o altă ramură în ramura curentă.
  • git diff: Afișează diferențele de cod (linie cu linie) între directorul de lucru, staging sau două versiuni diferite.
  • git config: Configurează setările Git la nivel global (utilizator), de sistem sau local pentru depozitul curent.