Összeolvasztás (merge) — mi ez, hogyan működik a merge és az egyesítési stratégiák

Szerző: IT Sectr Megjelenés: 2026-08-01 Olvasási idő: 9 perc

Merge — ez az ágak egyesítésének művelete Git-ben, amely két különböző fejlesztési vonal változásait egyesíti egy célágba. A rebase-szel ellentétben a merge megtartja a teljes elágazási történetet, létrehozva egy speciális merge-kommitot két szülővel. A hivatalos Git dokumentáció (2026) szerint a merge a legbiztonságosabb módja az ágak egyesítésének, mivel nem írja felül a történetet, és lehetővé teszi annak nyomon követését, hogy mikor és mely ágak lettek egyesítve. Ez a standard választás a nyilvános ágak, például a main, develop és release egyesítéséhez.

Főbb pontok

  • Merge — ágak egyesítése merge-kommit létrehozásával, amely megtartja mindkét ág történetét.
  • Merge-kommit — speciális kommit két szülővel, rögzíti az egyesítés tényét.
  • Egyesítési stratégiák — recursive, octopus, ours, squash — mindegyik különböző forgatókönyvekhez alkalmas.
  • Konfliktusok — akkor keletkeznek, ha ugyanazokat a sorokat mindkét ágban egyidejűleg módosítják, és kézi megoldást igényelnek.
  • Biztonság — a merge nem változtatja meg a meglévő kommitokat, ezért biztonságos a nyilvános ágak számára.

Mi a merge Git-ben

Merge — ez a git merge parancs, amely egyesíti a megadott ág változásait az aktuális ágba. A Git megtalálja a közös őst (közös alap kommit), kiszámítja az egyes ágak diff-jét az őshöz képest, és létrehoz egy merge-kommitot, amely az egyesített változások halmazát tartalmazza. Eredmény — a célág kiegészül az egyesített ág összes változásával.

Szintaxis: a célágban (pl. main) tartózkodva hajtsd végre a git merge feature parancsot. A Git automatikusan létrehoz egy merge-kommitot, ha nincsenek konfliktusok. A merge-kommit alapértelmezett üzenetében ez szerepel: „Merge branch ’feature’ into main“. Az üzenet a -m flag segítségével módosítható vagy a megnyitott szerkesztőben szerkeszthető.

A merge egy nem romboló művelet. A rebase-szel ellentétben a merge nem nyúl a meglévő kommitokhoz: azok ugyanazokkal a hashekkel, szerzőkkel és dátumokkal maradnak. Ez teszi a merge-t az egyetlen biztonságos egyesítési móddá az olyan ágak számára, amelyeken egyszerre több fejlesztő dolgozik. Ha valami rosszul sül el, a merge a git merge --abort paranccsal visszavonható.

bash
# Válts célágra
git checkout main

# Feature ág egyesítése
git merge feature

# Eredmény — merge-kommit két szülővel
git log --oneline --graph

# Egyesítés egyéni üzenettel
git merge feature -m "feat: integrate authentication module"

Merge típusok: regular, squash, fast-forward

A Git három egyesítési módot támogat, amelyeket a kívánt eredménytől függően választanak ki. A regular merge (alapértelmezett) merge-kommitot hoz létre. A squash merge a feature-ág összes kommitját egyesíti egyetlen kommittá. A fast-forward — előre mozgatja az ág mutatóját kommit létrehozása nélkül, ha lehetséges. A mód kiválasztása a csapat workflow-jától és a történeti szabályoktól függ.

Regular merge (--no-ff) — merge-kommitot hoz létre akkor is, ha az egyesítés fast-forwardként is végrehajtható. A main ág számára ajánlott: a merge-kommit explicit módon jelöli a funkció integrációjának pillanatát, és lehetővé teszi a feature-ág összes változásának egyszerű visszavonását egyetlen revert merge-kommit segítségével. A GitHub alapértelmezés szerint ezt a módot használja a PR-ek Merge gombon keresztüli egyesítésekor.

Squash merge (--squash) — összegyűjti a feature-ág összes kommitját egyetlen kommittá a célágban. Hasznos, ha a feature-ág kezdetleges története nem kerülhet a main-be. Hátrány: az eredeti kommitokkal való kapcsolat megszűnik — nem látható, hogy a funkció lépésről lépésre hogyan fejlődött. A GitHub ezt a módot használja a „Squash and merge“ kiválasztásakor a PR-ben.

Fast-forward (--ff) — ha a célágban nincsenek új kommitok a feature elágazása után, a Git egyszerűen előre mozgatja a mutatót, merge-kommit létrehozása nélkül. A történet lineáris marad. A --no-ff flag kényszeríti a merge-kommit létrehozását, a --ff-only hibaüzenettel végződik, ha a fast-forward nem lehetséges.

bash
# Merge-kommit kényszerítése (ajánlott main-hez)
git merge --no-ff feature

# Squash merge — az összes kommit egyetlen kommittá
git merge --squash feature
git commit -m "feat: add authentication"

# Fast-forward csak ha lehetséges
git merge --ff-only feature

# Konfliktusos merge megszakítása
git merge --abort

Git egyesítési stratégiák

Az egyesítési stratégiák meghatározzák azt az algoritmust, amelyet a Git a változások kombinálásához használ. Minden stratégia különböző forgatókönyvekhez alkalmas. A Git automatikusan kiválasztja a megfelelő stratégiát, de a fejlesztő explicit módon megadhatja azt a --strategy flag segítségével. A stratégiák megértése segít előre jelezni a Git viselkedését összetett egyesítéseknél.

Recursive — az alapértelmezett stratégia két ág egyesítésére. A Git megtalálja a közös őst, kiszámítja a változásokat minden ágban, és egyesíti azokat. Ha a közös ős megtalálható, a recursive helyesen kezeli a fájlok átnevezését és új fájlok hozzáadását. Konfliktusok esetén a recursive további opciókat használhat: ours (automatikusan a mi verziót választja) és theirs (az ő verziót választja).

Octopus — kettőnél több ág egyidejű egyesítéséhez: git merge feature1 feature2 feature3. Az Octopus nem támogatja a konfliktusmegoldást — minden konfliktust meg kell oldani a parancs meghívása előtt. Ritkán használatos, főként több független ág összekapcsolására, amelyek garantáltan nem ütköznek (pl. különböző modulok).

StratégiaÁgak számaKonfliktusmegoldás
Recursive2Automatikus + ours/theirs opciók
Octopus3+Nem — minden konfliktust előre meg kell oldani
OursBármennyiMindig a mi verziót választja, a külső változásokat figyelmen kívül hagyja
Subtree2Részfák egyesítéséhez (subtree merge)

Ours — egy különleges stratégia, amely teljesen figyelmen kívül hagyja az egyesített ág változásait, és megtartja a célág aktuális tartalmát. A merge-kommit létrejön, de a tartalom változatlan marad. Hasznos, ha a történetben rögzíteni kell az egyesítés tényét, de gyakorlatilag el kell utasítani a másik ág összes változását.

Merge-konfliktusok megoldása

Merge-konfliktus akkor keletkezik, amikor egy fájl ugyanazokat a sorait mindkét ágban eltérően módosították. A Git nem tudja automatikusan meghatározni, melyik verzió a helyes, és felfüggeszti a merge-t. Konfliktus keletkezhet akkor is, ha egy fájlt az egyik ágban átneveznek, a másikban pedig módosítanak, vagy ha ugyanazt a fájlt egyszerre törlik és módosítják.

A megoldás folyamata: A Git megjelöli a konfliktusos fájlokat markerekkel. A fájlban megjelennek a <<<<<<< HEAD (a mi verziónk), ======= (elválasztó) és >>>>>>> feature (az ő verziónk) részek. A fejlesztő kézzel szerkeszti a konfliktusos részt, kiválasztja a szükséges sorokat mindkét verzióból, eltávolítja a markereket, elmenti a fájlt, és hozzáadja az indexhez a git add paranccsal.

A konfliktusok vizuális megoldásához a Git támogatja a mergetool — egy külső összehasonlító eszközt. Népszerű mergetool eszközök: Meld, KDiff3, Beyond Compare, VS Code (beépített konfliktusszerkesztő). A Mergetool három panelt jelenít meg: a mi verzió, az ő verzió és az eredmény. A fejlesztő vizuálisan választja ki a végső fájlba beillesztendő kódblokkokat.

bash
# Merge indítása és konfliktus érzékelése
git merge feature
# KONFLIKTUS (tartalom): Merge konfliktus a src/main.swift fájlban

# Konfliktusos fájlok ellenőrzése
git status

# Vizuális mergetool megnyitása
git mergetool

# Megoldás után — hozzáadás és commit
git add src/main.swift
git commit

# Merge megszakítása
git merge --abort

Mikor válasszuk a merge-t a rebase helyett

A merge előnyben részesítendő a rebase-szel szemben néhány kulcsfontosságú helyzetben. Első: nyilvános, más fejlesztők számára hozzáférhető ágakkal való munka során. A merge nem írja felül a történetet, és a kollégák biztonságosan szinkronizálhatnak. A rebase egy nyilvános ágban eltérő történetet és konfliktusokat hoz létre mindazok számára, akik már megkapták a régi kommitokat.

Második helyzet: a feature-ág befejezésekor. A legtöbb csapat a merge-t (a --no-ff flaggel) részesíti előnyben a main-be a funkció integráció pillanatának rögzítéséhez. Ez leegyszerűsíti a történetben való navigációt, és lehetővé teszi a teljes funkció egyszerű visszavonását egyetlen git revert merge-kommit segítségével. A GitHub Flow alapértelmezés szerint három merge opciót kínál: egyszerű merge, squash merge és rebase merge.

Harmadik helyzet: pull request használata esetén, amely átesett a review-n. A GitHub és a GitLab merge gombot kínál különböző opciókkal. Merge (Create a merge commit) — teljes történet merge-kommittel. Squash and merge — tiszta történet fejlesztési részletek nélkül. Rebase and merge — lineáris történet merge-kommit nélkül, de a kommitok felülírásával. A választás a csapat szabályaitól függ.

  • Nyilvános ágak (main, develop) — csak merge, soha ne rebase.
  • PR befejezése — merge --no-ff flaggel az integráció pillanatának rögzítéséhez.
  • Mások kommitjaival rendelkező ágak — a merge nem írja felül mások munkáját.
  • Kiadás előtt — a merge biztonságosabb, mivel kevesebb kockázattal jár.
  • Közös ág — ha többen dolgoznak az ágon, a merge kötelező.

Legjobb gyakorlatok az ágak egyesítéséhez

Első szabály: mindig a célág aktuális verzióján legyél a merge előtt. Végre git checkout main && git pull parancsot, mielőtt egyesíted a funkciót. Ez minimalizálja a konfliktusokat, és garantálja, hogy a merge-kommit tartalmazni fogja az összes aktuális változást. Ha a célág messze előrehaladt, először hajtsd végre a git merge main parancsot a feature-ágon belül a konfliktusok annak kontextusában történő megoldásához.

Második szabály: teszteld a kódot merge után. A merge megváltoztathatja a viselkedést, még akkor is, ha nem voltak konfliktusok. A CI/CD pipeline-nak le kell futtatnia a teszteket a merge-kommiton, mielőtt éles környezetbe kerülne. Egyes csapatok merge gates — kötelező ellenőrzéseket használnak, amelyek blokkolják a merge-t, amíg azokon át nem mennek.

Harmadik szabály: dokumentáld a merge-kommitokat. A standard „Merge branch ’feature’ into main“ üzenet kevéssé hasznos. Ajánlott hozzáadni a leírást arról, hogy mi lett egyesítve: „Merge authentication module: login, registration, password recovery“. Ez leegyszerűsíti a történet elemzését és a regressziók keresését. Nagy projektekben a merge-kommitok automatikusan generálódnak a PR nevéből.

  • Aktualitás — merge előtt győződj meg róla, hogy a célág frissítve van (git pull).
  • Tesztelés — a CI/CD futtasson teszteket az eredményül kapott merge-kommiton.
  • Leíró üzenetek — add meg a merge-kommitban, hogy melyik funkció lett egyesítve.
  • Gyakoriság — egyesítsd a feature-ágakat a lehető legkorábban és leggyakrabban (maximum egy hét).
  • Visszavonás — a git revert merge-kommit a teljes funkciót visszavonja.

Gyakran ismételt kérdések

Mit jelent az ágak egyesítése (merge) Git-ben?

Egyesíteni (merge) — végrehajtani a git merge parancsot a változások egyik ágból a másikba történő kombinálásához. Az eredmény egy merge-kommit, amely rögzíti az egyesítés tényét és tartalmazza mindkét ág változásait. Ez a fő módja a feature-ágak main-be, develop-ba vagy release-be történő integrálásának a Git Flow-ban.

Miben különbözik a squash merge a szokásos merge-től?

Squash merge egyesíti a feature-ág összes kommitját egyetlen kommittá a célágban, elveszítve a köztes fejlesztési történetet. Szokásos merge létrehoz egy merge-kommitot, megtartva a feature-ág összes kommitját. A squash merge tiszta történetet ad, de nem teszi lehetővé a funkció lépésről lépésre történő fejlődésének nyomon követését.

Hogyan oldjak meg egy merge-konfliktust Git-ben?

Nyisd meg a konfliktusos fájlt, keresd meg a <<<<<<< HEAD és >>>>>>> markerekkel ellátott részeket. Szerkeszd a tartalmat, hagyd meg a szükséges sorokat mindkét verzióból, távolítsd el a markereket. Mentsd el a fájlt, hajtsd végre a git add és git commit parancsokat. Használhatod a git mergetool-t a vizuális megoldáshoz.

Mikor használjak merge-t rebase helyett?

Merge mindig nyilvános ágak (main, develop, release) esetén használandó, mivel nem írja felül a történetet. Rebase személyes feature-ágakban alkalmazandó a közzététel előtt. Miután az ág a megosztott repozitórium részévé vált, és a kollégák hivatkoztak rá, csak a merge engedélyezett.

Hogyan vonhatok vissza egy merge-t Git-ben?

A merge befejezése előtt (konfliktus alatt) — git merge --abort teljesen visszavonja az egyesítést. Befejezés után — git revert <merge-commit-hash> -m 1 létrehoz egy visszavonó kommitot. A -m 1 flag jelzi, melyik szülőágat kell megtartani (a célt). A git revert biztonságosabb, mint a git reset a közzétett ágak esetében.

Összefoglalás

  • Merge — ágak biztonságos egyesítése a történet megtartásával és merge-kommit létrehozásával két szülővel.
  • Egyesítési módok — regular (--no-ff), squash (--squash) és fast-forward (--ff) különböző célokra.
  • Stratégiák — recursive (alapértelmezett), octopus (3+ ág), ours (külső változások figyelmen kívül hagyása).
  • Konfliktusok — kézzel oldhatók meg a megjelölt részek szerkesztésével vagy mergetool segítségével.
  • Biztonság — a merge nem változtatja meg a meglévő kommitokat, ezért biztonságos a nyilvános ágak számára.
  • Squash merge — az összes kommitot egyesíti egyetlen kommittá, elveszítve a köztes fejlesztési történetet.
  • Merge visszavonása — git revert merge-kommit a -m 1 flag segítségével a közzétett változások biztonságos visszavonásához.

Kulcsrakész mobilalkalmazást fejlesztünk

Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.

Projekt megbeszélése

Olvassa el is