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.<nume>.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
*.origrămase dupăgit mergetool: seteazămergetool.keepBackup falsesau adaugă*.origîn.gitignore. - Lipsa opțiunii
--waitla 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.