Merge — to je operace slučování větví v Git, která spojuje změny ze dvou různých vývojových linií do jedné cílové větve. Na rozdíl od rebase, merge zachovává úplnou historii větvení a vytváří speciální merge commit se dvěma rodiči. Podle oficiální dokumentace Git (2026) je merge nejbezpečnějším způsobem slučování větví, protože nepřepisuje historii a umožňuje sledovat, kdy a které větve byly sloučeny. Je to standardní volba pro slučování ve veřejných větvích, jako jsou main, develop a release.
Hlavní body
Merge — to je příkaz git merge, který spojuje změny z určené větve do aktuální větve. Git najde společného předka (společný základní commit), vypočítá diff každé větve vůči předkovi a vytvoří merge commit obsahující kombinovanou sadu změn. Výsledek — cílová větev je doplněna o všechny změny ze sloučené větve.
Syntaxe: v cílové větvi (např. main) proveď git merge feature. Git automaticky vytvoří merge commit, pokud nejsou konflikty. Ve výchozí zprávě merge commitu je uvedeno: „Merge branch ’feature’ into main“. Zprávu lze změnit pomocí flagu -m nebo upravit v otevřeném editoru.
Merge je nepoškozující operace. Na rozdíl od rebase, merge nezasahuje do existujících commitů: zůstávají se stejnými hashi, autory a daty. To činí merge jediným bezpečným způsobem slučování pro větve, na kterých současně pracuje více vývojářů. Pokud se něco pokazí, merge lze zrušit příkazem git merge --abort.
# Přepni na cílovou větev
git checkout main
# Sloučit feature větev
git merge feature
# Výsledek — merge commit se dvěma rodiči
git log --oneline --graph
# Sloučit s vlastní zprávou
git merge feature -m "feat: integrate authentication module"
Git podporuje tři režimy slučování, které se volí v závislosti na požadovaném výsledku. Regular merge (výchozí) vytváří merge commit. Squash merge spojuje všechny commity feature větve do jednoho. Fast-forward — posouvá ukazatel větve vpřed bez vytváření commitu, pokud je to možné. Volba režimu závisí na workflow týmu a pravidlech historie.
Regular merge (--no-ff) — vytváří merge commit, i když lze sloučení provést jako fast-forward. Doporučeno pro main větev: merge commit explicitně označuje okamžik integrace funkce a umožňuje snadné vrácení všech změn feature větve jedním revert merge commitu. GitHub používá tento režim ve výchozím nastavení při slučování PR tlačítkem Merge.
Squash merge (--squash) — shromažďuje všechny commity feature větve do jednoho commitu v cílové větvi. Užitečné, když hrubá historie feature větve nemá vstoupit do main. Nevýhoda: ztrácí se spojení s původními commity — není vidět, jak se funkce vyvíjela krok za krokem. GitHub používá tento režim při výběru „Squash and merge“ v PR.
Fast-forward (--ff) — pokud cílová větev nemá nové commity po odbočení funkce, Git jednoduše posouvá ukazatel vpřed, bez vytvoření merge commitu. Historie zůstává lineární. Flag --no-ff vynucuje vytvoření merge commitu, --ff-only skončí chybou, pokud fast-forward není možný.
# Vynutit merge commit (doporučeno pro main)
git merge --no-ff feature
# Squash merge — všechny commity do jednoho
git merge --squash feature
git commit -m "feat: add authentication"
# Fast-forward pouze pokud je možné
git merge --ff-only feature
# Zrušit konfliktní sloučení
git merge --abort
Strategie slučování určují algoritmus, který Git používá ke kombinování změn. Každá strategie je vhodná pro různé scénáře. Git automaticky vybírá vhodnou strategii, ale vývojář ji může explicitně uvést pomocí flagu --strategy. Porozumění strategiím pomáhá předvídat chování Gitu při složitých sloučeních.
Recursive — výchozí strategie pro sloučení dvou větví. Git najde společného předka, vypočítá změny v každé větvi a spojí je. Pokud je společný předek nalezen, recursive správně zpracovává přejmenování souborů a přidávání nových. Při konfliktech může recursive použít další možnosti: ours (automaticky vybere naši verzi) a theirs (vybere jejich verzi).
Octopus — pro současné sloučení více než dvou větví: git merge feature1 feature2 feature3. Octopus nepodporuje řešení konfliktů — všechny konflikty musí být vyřešeny před voláním příkazu. Používá se zřídka, hlavně ke spojení několika nezávislých větví, které se zaručeně nekolidují (např. různé moduly).
| Strategie | Počet větví | Řešení konfliktů |
|---|---|---|
| Recursive | 2 | Automatické + možnosti ours/theirs |
| Octopus | 3+ | Ne — všechny konflikty musí být vyřešeny předem |
| Ours | Libovolný | Vždy vybírá naši verzi, cizí změny jsou ignorovány |
| Subtree | 2 | Pro slučování podstromů (subtree merge) |
Ours — speciální strategie, která zcela ignoruje změny ze slučované větve a zachovává aktuální obsah cílové větve. Merge commit je vytvořen, ale obsah zůstává nezměněn. Užitečné, když je třeba v historii zaznamenat fakt sloučení, ale prakticky odmítnout všechny změny z cizí větve.
Merge konflikt vzniká, když jsou stejné řádky souboru změněny v obou větvích odlišně. Git nemůže automaticky určit, která verze je správná, a pozastaví merge. Konflikt může také vzniknout při přejmenování souboru v jedné větvi a jeho změně v druhé, nebo při současném smazání a úpravě stejného souboru.
Proces řešení: Git označí konfliktní soubory značkami. V souboru se objeví části s <<<<<<< HEAD (naše verze), ======= (oddělovač) a >>>>>>> feature (jejich verze). Vývojář ručně upraví konfliktní část, vybere potřebné řádky z obou verzí, odstraní značky, uloží soubor a přidá ho do indexu pomocí git add.
Pro vizuální řešení konfliktů Git podporuje mergetool — externí nástroj pro porovnávání. Populární nástroje mergetool: Meld, KDiff3, Beyond Compare, VS Code (vestavěný editor konfliktů). Mergetool zobrazuje tři panely: naši verzi, jejich verzi a výsledek. Vývojář vizuálně vybírá bloky kódu k zahrnutí do konečného souboru.
# Zahájit sloučení a detekovat konflikt
git merge feature
# KONFLIKT (obsah): Merge konflikt v src/main.swift
# Zkontrolovat konfliktní soubory
git status
# Otevřít vizuální mergetool
git mergetool
# Po vyřešení — přidat a commitovat
git add src/main.swift
git commit
# Zrušit sloučení
git merge --abort
Merge je upřednostňován před rebase v několika klíčových situacích. Za prvé: při práci s veřejnými větvemi přístupnými jiným vývojářům. Merge nepřepisuje historii a kolegové se mohou bezpečně synchronizovat. Rebase ve veřejné větvi vytvoří rozbíhající se historii a konflikty pro všechny, kteří již obdrželi staré commity.
Druhá situace: při dokončování feature větve. Většina týmů preferuje merge (s flagem --no-ff) do main, aby zaznamenala okamžik integrace funkce. To zjednodušuje navigaci historií a umožňuje snadné vrácení celé funkce jedním git revert merge commitu. GitHub Flow ve výchozím nastavení nabízí tři možnosti merge: jednoduchý merge, squash merge a rebase merge.
Třetí situace: při práci s pull requestem, který prošel recenzí. GitHub a GitLab nabízejí merge tlačítko s různými možnostmi. Merge (Create a merge commit) — plná historie s merge commitem. Squash and merge — čistá historie bez detailů vývoje. Rebase and merge — lineární historie bez merge commitu, ale s přepisem commitů. Volba závisí na pravidlech týmu.
První pravidlo: vždy buďte na aktuální verzi cílové větve před mergem. Proveďte git checkout main && git pull před sloučením funkce. To minimalizuje konflikty a zaručuje, že merge commit bude obsahovat všechny aktuální změny. Pokud cílová větev hodně pokročila, nejprve proveďte git merge main uvnitř feature větve pro vyřešení konfliktů v jejím kontextu.
Druhé pravidlo: testujte kód po mergu. Merge může změnit chování, i když nedošlo ke konfliktům. CI/CD pipeline by měla spustit testy na merge commitu před odesláním do produkce. Některé týmy používají merge gates — povinné kontroly, které blokují merge, dokud nejsou dokončeny.
Třetí pravidlo: dokumentujte merge commity. Standardní zpráva „Merge branch ’feature’ into main“ je málo užitečná. Doporučuje se přidat popis toho, co bylo sloučeno: „Merge authentication module: login, registration, password recovery“. To zjednodušuje analýzu historie a hledání regresí. Ve velkých projektech jsou merge commity automaticky generovány z názvu PR.
Často kladené otázky
Sloučit (merge) — provést git merge pro spojení změn z jedné větve do druhé. Výsledkem je merge commit, který zaznamenává fakt sloučení a obsahuje změny z obou větví. To je hlavní způsob integrace feature větví do main, develop nebo release v Git Flow.
Squash merge spojí všechny commity feature větve do jednoho commitu v cílové větvi, čímž ztrácí mezilehlou historii vývoje. Běžný merge vytvoří merge commit, zachovávající všechny commity feature větve. Squash merge poskytuje čistou historii, ale neumožňuje sledovat postupný vývoj funkce.
Otevřete konfliktní soubor, najděte části se značkami <<<<<<< HEAD a >>>>>>>. Upravte obsah, ponechte potřebné řádky z obou verzí, odstraňte značky. Uložte soubor, proveďte git add a git commit. Můžete použít git mergetool pro vizuální řešení.
Merge je vždy používán pro veřejné větve (main, develop, release), protože nepřepisuje historii. Rebase se aplikuje v osobních feature větvích před jejich publikací. Poté, co se větev stala součástí sdíleného repozitáře a kolegové se na ni odvolali, je povolen pouze merge.
Před dokončením merge (během konfliktu) — git merge --abort zruší sloučení úplně. Po dokončení — git revert <merge-commit-hash> -m 1 vytvoří vracející commit. Flag -m 1 určuje, který rodičovský větev zachovat (cílovou). Git revert je bezpečnější než git reset pro publikované větve.
Shrnutí
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í.
Přečtěte si také