Merge — co to je, typy slučování a mechanismus fungování

Autor: IT Sectr Publikováno: 2026-05-10 Doba čtení: 10 min

Merge — je operace v Gitu, která spojuje změny z jedné větve do druhé a vytváří commit sloučení (merge commit). Git podporuje několik strategií: fast-forward (lineární historie), three-way merge (s vytvořením merge commitu) a squash merge (stlačení všech commitů do jednoho). Podle údajů git-scm.com, 2025, zůstává merge nejpoužívanějším mechanismem integrace kódu v týmovém vývoji s Gitem.

Hlavní body

  • Merge — operace sloučení větví v Gitu s nebo bez commitu sloučení
  • Fast-forward merge — lineární sloučení bez dodatečného commitu, když nedochází k divergenci
  • Three-way merge — vytváří merge commit při divergenci větví
  • Squash merge — stlačí všechny commity větve do jednoho před sloučením
  • Konflikty vznikají při změně stejných řádků v obou větvích

Co je Merge?

Merge (sloučení) — je základní operace v Gitu, která spojuje změny z jedné větve (source) do druhé (target). Výsledkem sloučení je, že cílová větev obdrží všechny commity ze zdrojové větve, které v ní ještě nebyly. V závislosti na situaci může Git provést merge třemi různými způsoby.

Hlavní hodnotou merge je zachování historie: merge commit zaznamenává fakt sloučení větví, ukládá informaci o tom, kdy a které větve byly sloučeny. To usnadňuje audit změn, hledání regresí a pochopení chronologie vývoje. Ve velkých projektech je merge commit standardním způsobem integrace kódu.

Podle údajů GitLab Flow se merge commity používají v 73 % týmů pracujících s Gitem. Alternativní přístupy (rebase, squash) preferují týmy orientované na lineární historii. Volba strategie závisí na velikosti týmu, frekvenci vydání a přijatých dohodách v projektu.

Kdy nastává Merge

Merge je potřebný, když vývojář dokončil práci na funkci a chce ji integrovat do develop nebo main. Typický scénář: vývojář vytvořil větev funkce z develop, pracoval na ní několik dní a během té doby se v develop objevily nové commity od ostatních účastníků. Před sloučením je třeba změny spojit — a k tomu slouží merge.

Bez merge není možné společně pracovat na jednom kódu v Gitu. Pokaždé, když dva vývojáři současně provádějí změny ve stejné kódové základně, jejich větve se rozcházejí. Merge — je jediný způsob, jak tyto změny znovu spojit bez ztráty dat.

Typy slučování v Gitu

Git podporuje tři typy merge, každý určený pro svůj scénář. Volba typu sloučení ovlivňuje historii commitů, pohodlí vracení a čitelnost logu.

Fast-forward merge

Fast-forward nastává, když cílová větev neměla od vytvoření zdrojové větve žádné nové commity. V tomto případě Git jednoduše posune ukazatel cílové větve vpřed na poslední commit zdrojové větve. Historie zůstává lineární, bez merge commitu.

bash
# Fast-forward merge: develop se nezměnil od vytvoření feature
git checkout develop
git merge feature/new-login

# Výsledek: ukazatel develop se přesunul na konec feature
# Nebyl vytvořen žádný merge commit

Fast-forward je vhodný pro krátkodobé větve, kde vývojář pracoval sám. Tento přístup má však nevýhodu: ztrácí se informace o tom, že větev existovala — všechny commity vypadají jako provedené přímo v develop.

Three-way merge

Three-way merge se provádí, když obě větve mají nové commity po bodu divergence. Git vytvoří samostatný merge commit se dvěma rodiči, který zaznamenává fakt sloučení větví. Tento přístup se doporučuje pro větve funkcí v týmovém vývoji.

bash
# Vynucený three-way merge s příznakem --no-ff
git checkout develop
git merge --no-ff feature/new-login

# Vytvořen merge commit s výchozí zprávou
# Vlastní zprávu lze nastavit pomocí -m
git merge --no-ff feature/new-login -m "Merge feature/new-login into develop"

Příznak --no-ff zaručuje vytvoření merge commitu, i když je fast-forward možný. To je nejlepší praxe pro zachování informací o větvení v projektu.

Squash merge

Squash merge stlačí všechny commity zdrojové větve do jednoho a aplikuje je na cílovou větev. Historie funkce se ztrácí — do větve přijde jeden commit se všemi změnami. To je vhodné, když podrobné commity ve větvi funkce nenesou hodnotu pro celkovou historii.

bash
# Squash merge: všechny commity feature stlačeny do jednoho
git checkout develop
git merge --squash feature/experimental
git commit -m "feat: experimental login flow (squashed)"

Squash je vhodný pro koncepty, experimentální větve a situace, kdy je důležité udržet čistotu historie. Nevýhoda — ztrácí se spojení s původními commity, což komplikuje vracení jednotlivých změn.

Strategie Ours a Theirs

Ours a Theirs — dvě speciální strategie merge v Gitu. Ours zcela ignoruje změny ze zdrojové větve a ponechává pouze to, co je v cílové větvi. Theirs naopak při každém konfliktu přijímá verzi zdrojové větve. Tyto strategie jsou užitečné při slučování velkých objemů kódu, když je předem známo, která verze má zvítězit.

Jak Merge funguje

Mechanismus merge v Gitu je založen na porovnání tří bodů: společného předka (merge base), stavu zdrojové větve a stavu cílové větve. Git najde merge base — poslední commit společný pro obě větve — a vypočítá, jaké změny nastaly v každé větvi po divergenci.

  • Krok 1 — Git určí merge base: poslední commit, který existuje v obou větvích
  • Krok 2 — Git vytvoří dva diffy: od merge base k source a od merge base k target
  • Krok 3 — Git se pokusí aplikovat obě sady změn na merge base
  • Krok 4 — Pokud změny nekolidují — merge se automaticky dokončí
  • Krok 5 — Pokud dojde ke konfliktu — Git se zastaví a požádá o řešení

Git používá třícestný algoritmus slučování, který bere v úvahu nejen dvě porovnávané verze souboru, ale také jejich společného předka. Díky tomu může Git automaticky řešit situace, kdy změny v jedné větvi neovlivňují změněné části druhé — i když byly oba soubory změněny.

Algoritmus fungování merge na příkladu

Uvažujme scénář: dva vývojáři pracují na různých souborech ve stejné větvi funkce. První změnil LoginActivity.kt, druhý — ProfileFragment.kt. Když spojí své změny, Git vidí, že změny se týkají různých souborů, a provede merge automaticky, bez lidského zásahu.

Pokud oba vývojáři změnili LoginActivity.kt, ale v různých metodách — Git si také poradí automaticky a spojí změny řádek po řádku. Konflikt vzniká pouze tehdy, když oba změnili stejné řádky nebo když jeden smazal kód, který druhý změnil.

Řešení konfliktů při Merge

Konflikt merge vzniká, když Git nemůže automaticky spojit změny, protože obě větve změnily stejné řádky různým způsobem. V tomto případě Git označí konfliktní místa v souborech a očekává ruční řešení od vývojáře.

Konfliktní místa jsou označena speciálními značkami: <<<<<<< HEAD zobrazuje kód z cílové větve, ======= — oddělovač, >>>>>>> source-branch — kód ze zdrojové větve. Vývojář musí ručně vybrat, kterou variantu ponechat, nebo je spojit.

bash
# 1. Spustit merge a vidět konflikt
git merge feature/new-login
# Výstup: CONFLICT (content): Merge conflict in LoginActivity.kt

# 2. Zobrazit seznam souborů s konflikty
git status
# both modified: src/ui/login/LoginActivity.kt

# 3. Vyřešit konflikt: upravit soubor, odstranit značky
# 4. Přidat vyřešený soubor a dokončit merge
git add src/ui/login/LoginActivity.kt
git merge --continue
# nebo: git commit (bez --continue)

Pro řešení konfliktů existují nástroje: git mergetool otevře vizuální nástroj pro slučování (Meld, Beyond Compare, VS Code). Mnoho vývojářů dává přednost řešení konfliktů v IDE — IntelliJ IDEA a Android Studio poskytují vestavěný nástroj s třípanelovým porovnáním, který tento proces výrazně zjednodušuje.

Tipy pro řešení konfliktů: vždy rozumějte tomu, co dělá každá strana konfliktu, neodstraňujte cizí kód bez pochopení jeho logiky, a pokud je konflikt příliš složitý — zapojte autora obou větví do společného řešení.

Merge vs Rebase: kdy co zvolit

Volba mezi Merge a Rebase — jedno z nejčastějších architektonických rozhodnutí v Gitu. Oba přístupy spojují změny, ale dělají to odlišně: merge zachovává historii větvení, rebase přepisuje historii a činí ji lineární.

  • Merge — zachovává kontext: je vidět, kdy a ze které větve bylo sloučení provedeno. Lepší pro veřejné větve (develop, main) a týmovou práci
  • Rebase — vytváří čistou lineární historii bez zbytečných merge commitů. Lepší pro osobní větve funkcí před odesláním k recenzi
  • Pravidlo: nikdy nedělejte rebase na veřejných větvích, které používají jiní vývojáři

Mnoho týmů používá hybridní přístup: rebase pro uvedení větve funkce do aktuálního stavu develop (git rebase develop), poté merge s příznakem --no-ff pro zaznamenání sloučení. To poskytuje čistou historii uvnitř funkce a informativní body sloučení na úrovni develop.

Často kladené otázky

Jaký je rozdíl mezi merge a merge --no-ff?

Bez --no-ff Git provádí fast-forward merge, pokud je to možné — jednoduše přesune ukazatel větve. S --no-ff Git vždy vytvoří merge commit a zachová informace o větvení. Doporučeno pro větve funkcí v týmovém vývoji.

Co dělat, když je merge konflikt velmi velký?

Použijte git mergetool nebo vestavěný nástroj IDE. Pokud konflikt zahrnuje desítky souborů — možná se větve příliš rozcházejí. V takovém případě je vhodné probrat s týmem plán sloučení, případně jej rozdělit do několika fází.

Lze merge zrušit?

Ano: git merge --abort zruší merge, pokud ještě není dokončen (konflikt). Pokud merge již byl dokončen — použijte git reset --hard HEAD~1 nebo git revert -m 1 <merge-commit> pro bezpečné vrácení.

Je nutné vytvářet merge commit pro každou funkci?

Doporučeno pro týmovou práci. Merge commit zaznamenává fakt sloučení, obsahuje odkazy na obě větve a usnadňuje pochopení historie. Pro osobní nebo experimentální větve je squash merge nebo fast-forward přijatelný.

Jak merge funguje s binárními soubory?

Git nemůže automaticky slučovat binární soubory — vybírá jednu z verzí v celku. Pro binární soubory (obrázky, .aab, .apk) se doporučuje minimalizovat paralelní změny a používat Git LFS pro velké soubory.

Shrnutí

  • Merge — základní operace Gitu pro spojení změn z jedné větve do druhé
  • Fast-forward — lineární sloučení bez merge commitu, když nedochází k divergenci
  • Three-way merge — vytváří merge commit se dvěma rodiči, zachovává kontext
  • Squash merge — stlačí všechny commity větve do jednoho, ztrácí historii funkce
  • Konflikty vznikají při změně stejných řádků a řeší se ručně
  • Merge se liší od Rebase: první zachovává větvení, druhý činí historii lineární
  • Pro veřejné větve se doporučuje merge s --no-ff, pro osobní — rebase nebo squash

Vyvineme mobilní aplikaci na klíč

IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.

Prodiskutovat projekt

Přečtěte si také