Jak používat git diff - praktický průvodce
Používám git diff denně. Před každým commitem, při code review, když hledám kde jsem něco rozbil. Tady jsou příkazy co mi fakt pomáhají.
Co git diff umí
Porovná různé stavy v repozitáři:
- Co jsem změnil a ještě nepřidal do stage
- Co je připravené ke commitu
- Rozdíl mezi commity nebo větvemi
Kdy to potřebuju
- Před commitem - co vlastně commituju?
- Code review - co kolega změnil?
- Debugging - kdy se ten bug objevil?
- Merge konflikty - kdo co změnil?
Základní git diff příkazy
Zobrazení nestaged změn
# Zobrazí změny, které ještě nejsou staged
git diff
Tohle mi ukáže co jsem změnil, ale ještě nedal do stage.
Zobrazení staged změn
# Zobrazí změny připravené ke commitu
git diff --staged
# Starší syntaxe (funguje stejně)
git diff --cached
Tohle ukáže co přesně půjde do commitu.
Zobrazení všech změn
# Všechny změny (staged + unstaged) vs. HEAD
git diff HEAD
Porovnávání commitů a větví
Porovnání dvou commitů
# Porovná dva konkrétní commity
git diff abc123 def456
# Porovná commit s jeho předchůdcem
git diff abc123^..abc123
# Zkrácená verze pro předchůdce
git diff abc123^!
Porovnání větví
# Porovná dvě větve
git diff main feature-branch
# Co přibyde, když mergnu feature-branch do main
git diff main...feature-branch
# Změny pouze v souborech, které existují v obou větvích
git diff main..feature-branch
Pozor na tečky!
main..feature– Rozdíl mezi špičkami větvímain...feature– Rozdíl od společného předka
Porovnání s remote větví
# Porovná lokální main s origin/main
git diff main origin/main
# Co jsem změnil oproti remote
git diff origin/main HEAD
# Po git fetch vidíte nové změny na remote
git fetch origin
git diff main origin/main
Užitečné přepínače a možnosti
Statistiky změn
# Souhrn změněných souborů
git diff --stat
# Výstup:
# src/App.tsx | 25 ++++++++++++---
# src/utils.ts | 12 +++----
# README.md | 5 ++-
# 3 files changed, 30 insertions(+), 12 deletions(-)
Pouze názvy souborů
# Seznam změněných souborů (bez obsahu)
git diff --name-only
# S typem změny (Added, Modified, Deleted)
git diff --name-status
# Výstup:
# M src/App.tsx
# A src/NewComponent.tsx
# D src/OldComponent.tsx
Filtrování souborů
# Diff pouze pro konkrétní soubor
git diff -- src/App.tsx
# Diff pouze pro .tsx soubory
git diff -- "*.tsx"
# Diff pro celou složku
git diff -- src/components/
# Vyloučení souborů
git diff -- . ":(exclude)package-lock.json"
git diff -- . ":!package-lock.json"
Ignorování whitespace
# Ignoruje změny mezer a odsazení
git diff -w
# Ignoruje pouze změny na konci řádků
git diff --ignore-space-at-eol
# Ignoruje změny v množství mezer
git diff -b
Kontextové řádky
# Zobrazí více kontextu (výchozí je 3 řádky)
git diff -U10
# Zobrazí celý soubor
git diff -U9999
Výstupní formáty
Word diff
# Zobrazí změny po slovech, ne po řádcích
git diff --word-diff
# Výstup:
# Toto je [-starý-]{+nový+} text.
Perfektní pro dokumentaci, kde se mění jen jednotlivá slova.
Barevný výstup
# Vynucení barevného výstupu (i při přesměrování)
git diff --color=always | less -R
# Bez barev
git diff --color=never
Strojově čitelný formát
# Pro skripty – raw diff
git diff --raw
# Patch formát pro email
git diff --patch
Pokročilé techniky
Porovnání bez kontextu merge
# Zobrazí jen změny, ne merge context
git diff --no-ext-diff
Hledání konkrétních změn
# Najde commity, které přidaly/odebraly "TODO"
git log -S "TODO" --oneline
# Zobrazí diff těchto commitů
git log -S "TODO" -p
# Regex varianta
git log -G "function.*async" -p
Diff mezi soubory mimo git
# Porovná dva libovolné soubory (i mimo repo)
git diff --no-index file1.txt file2.txt
Interaktivní staging s diff
# Interaktivní výběr hunků ke staging
git add -p
# V interaktivním módu:
# y - stage tento hunk
# n - přeskočit
# s - rozdělit na menší hunky
# e - editovat hunk manuálně
Git diff pro code review
Efektivní review pull requestu
# 1. Stáhněte PR lokálně
git fetch origin pull/123/head:pr-123
git checkout pr-123
# 2. Porovnejte s cílovou větví
git diff main...pr-123
# 3. Zkontrolujte statistiky
git diff main...pr-123 --stat
# 4. Projděte soubor po souboru
git diff main...pr-123 -- src/components/
Vytvoření patch souboru
# Export diff jako patch
git diff main feature > my-changes.patch
# Aplikace patch souboru
git apply my-changes.patch
# Kontrola, zda patch půjde aplikovat
git apply --check my-changes.patch
Konfigurace git diff
Nastavení externího diff nástroje
# Nastavení VS Code jako diff tool
git config --global diff.tool vscode
git config --global difftool.vscode.cmd 'code --wait --diff $LOCAL $REMOTE'
# Použití diff tool
git difftool main feature
Užitečné aliasy
# Přidejte do ~/.gitconfig
[alias]
d = diff
ds = diff --staged
dw = diff --word-diff
dstat = diff --stat
dlast = diff HEAD~1..HEAD
dbranch = diff main...HEAD
Po nastavení můžete používat:
git d # rychlý diff
git ds # staged změny
git dw # word diff
git dlast # poslední commit
git dbranch # změny ve větvi
Git diff vs. online nástroje
Kdy použít git diff
- ✅ Lokální vývoj a debugging
- ✅ Práce s historií repozitáře
- ✅ Automatizace ve skriptech
- ✅ Integrace s IDE
Kdy použít online nástroj
- ✅ Porovnání textů mimo Git
- ✅ Rychlé jednorázové porovnání
- ✅ Sdílení výsledků s ne-technickými kolegy
- ✅ Vizuálně přehlednější zobrazení
Pro online porovnání můžete využít PorovnejText.cz, který nabízí barevné zvýraznění syntaxe pro 22 programovacích jazyků.
Řešení běžných problémů
"Diff zobrazuje změny, které jsem neudělal"
# Problém může být v line endings
git diff --ignore-space-at-eol
# Nebo v .gitattributes
echo "* text=auto" > .gitattributes
"Diff je příliš velký"
# Omezení na konkrétní soubory
git diff -- src/important-file.ts
# Nebo pouze statistiky
git diff --stat
# Nebo jen názvy souborů
git diff --name-only
"Potřebuji vidět starší verzi souboru"
# Zobrazí soubor z konkrétního commitu
git show abc123:src/App.tsx
# Porovná aktuální s verzí z před týdne
git diff HEAD@{1.week.ago} -- src/App.tsx
Git diff ve workflows
Pre-commit kontrola
#!/bin/bash
# .git/hooks/pre-commit
# Kontrola staged změn pro debug statements
if git diff --staged | grep -E "console\.log|debugger" > /dev/null; then
echo "VAROVÁNÍ: Nalezeny debug statements v kódu!"
echo "Odstraňte console.log nebo debugger před commitem."
git diff --staged | grep -n -E "console\.log|debugger"
exit 1
fi
CI/CD pipeline
# .github/workflows/lint-changed.yml
name: Lint Changed Files
on: pull_request
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Get changed files
id: changed
run: |
echo "files=$(git diff --name-only origin/main...HEAD -- '*.ts' '*.tsx' | tr '\n' ' ')" >> $GITHUB_OUTPUT
- name: Lint changed files
if: steps.changed.outputs.files != ''
run: npx eslint ${{ steps.changed.outputs.files }}
Tipy pro efektivní používání
1. Nastavte si aliasy – Často používané příkazy zkraťte
2. Používejte --stat první – Získejte přehled před detailním zkoumáním
3. Filtrujte soubory – Neztrácejte se v package-lock.json
4. Kombinujte s git log – Pochopte kontext změn
5. Naučte se git add -p – Commitujte jen relevantní změny
Co si z toho odnést
Git diff používám fakt denně. Základy (git diff, git diff --staged) stačí na 90% práce. Aliasy šetří čas. A -S pro hledání v historii je killer feature.
Naučte se to a code review i debugging budou mnohem rychlejší.
Potřebujete rychle porovnat dva kusy kódu bez přístupu ke git? Vyzkoušejte náš Code Diff nástroj s podporou 22 programovacích jazyků – vše probíhá přímo ve vašem prohlížeči.
Vyzkoušejte PorovnejText.cz zdarma
Nejrychlejší český nástroj pro porovnání textů. Vše probíhá ve vašem prohlížeči, žádná registrace není potřeba.
Porovnat texty nyní →Související články
Git diff mi nestačí - kdy a proč používám online diff
Jako programátor pracuju s git diff denně. Ale někdy potřebuju rychle porovnat dva kousky kódu a nechce se mi kvůli tomu otvírat IDE. Kdy použít co.
Jak jsem psal bakalářku (a co bych udělal jinak)
Praktické tipy pro studenty - jak verzovat práci, zpracovat feedback od vedoucího a nepřijít o text.
Markdown a README - jak kontroluju změny
Píšete dokumentaci v Markdownu? Tady je jak porovnávám změny v README a dalších md souborech.