Merge — Git-də bir budaqdan digərinə dəyişiklikləri birləşdirən, birləşmə commiti (merge commit) yaradan əməliyyatdır. Git bir neçə strategiyanı dəstəkləyir: fast-forward (xətti tarix), three-way merge (merge commit yaradılması ilə) və squash merge (bütün commitlərin birinə sıxışdırılması). git-scm.com, 2025 məlumatlarına görə, merge komanda şəraitində Git-in ən çox istifadə olunan kod inteqrasiya mexanizmi olaraq qalır.
Əsas məqamlar
Merge (birləşdirmə) — Git-də bir budaqdan (source) digərinə (target) dəyişiklikləri birləşdirən fundamental əməliyyatdır. Birləşdirmə nəticəsində hədəf budaq mənbə budaqdan olan bütün commitləri alır. Vəziyyətdən asılı olaraq Git merge-i üç fərqli şəkildə yerinə yetirə bilər.
Merge-in əsas dəyəri tarixin qorunmasıdır: merge commit budaqların birləşmə faktını qeyd edir, nə vaxt və hansı budaqların birləşdirildiyi barədə məlumatı saxlayır. Bu, dəyişikliklərin auditi, reqressiyaların axtarışı və inkişaf xronologiyasının anlaşılmasını asanlaşdırır. Böyük layihələrdə merge commit kod inteqrasiyasının standart üsuludur.
GitLab Flow məlumatlarına görə, merge commitlər Git ilə işləyən komandaların 73%-də istifadə olunur. Alternativ yanaşmaları (rebase, squash) xətti tarixə yönəlmiş komandalar üstünlük verir. Strategiya seçimi komanda ölçüsündən, buraxılış tezliyindən və layihədə qəbul edilmiş razılaşmalardan asılıdır.
Merge tələb olunur ki, proqramçı funksiya üzərində işi bitirib onu develop və ya main-ə inteqrasiya etmək istəyir. Tipik ssenari: proqramçı develop-dan funksiya budağı yaratdı, bir neçə gün işlədi, bu müddətdə develop-da digər iştirakçılar tərəfindən yeni commitlər peyda oldu. Birləşdirmədən əvvəl dəyişiklikləri birləşdirmək lazımdır — və bunun üçün merge istifadə olunur.
Merge olmadan Git-də bir kod üzərində birgə işləmək mümkün deyil. Hər dəfə iki proqramçı eyni kod bazasına eyni vaxtda dəyişikliklər daxil etdikdə, onların budaqları ayrılır. Merge — bu dəyişiklikləri məlumat itkisi olmadan geri birləşdirməyin yeganə yoludur.
Git üç növ merge dəstəkləyir, hər biri öz ssenarisi üçün nəzərdə tutulub. Birləşdirmə növünün seçimi commit tarixinə, geri qaytarma rahatlığına və log-un oxunaqlılığına təsir edir.
Fast-forward o zaman baş verir ki, hədəf budaq mənbə budaq yaradıldıqdan sonra yeni commitlərə malik olmasın. Bu halda Git sadəcə hədəf budaqın göstəricisini irəli, mənbə budaqın son commitinə aparır. Tarix merge commit olmadan xətti qalır.
# Fast-forward merge: develop feature yaradıldığı andan dəyişməyib
git checkout develop
git merge feature/new-login
# Nəticə: develop göstəricisi feature-un sonuna keçdi
# Heç bir merge commit yaradılmadı
Fast-forward qısaömürlü budaqlar üçün əlverişlidir, burada proqramçı tək işləyirdi. Lakin bu yanaşmanın çatışmazlığı var: budağın mövcud olduğu barədə məlumat itir — bütün commitlər birbaşa develop-də edilmiş kimi görünür.
Three-way merge hər iki budaq ayrılma nöqtəsindən sonra yeni commitlərə malik olduqda yerinə yetirilir. Git iki valideyni olan ayrıca merge commit yaradır ki, budaqların birləşmə faktını qeyd edir. Bu yanaşma komanda işində funksiya budaqları üçün tövsiyə olunur.
# --no-ff bayrağı ilə məcburi three-way merge
git checkout develop
git merge --no-ff feature/new-login
# Varsayılan mesajla merge commit yaradıldı
# -m vasitəsilə öz mesajınızı təyin edə bilərsiniz
git merge --no-ff feature/new-login -m "Merge feature/new-login into develop"
--no-ff bayrağı fast-forward mümkün olsa belə, merge commit yaradılmasını təmin edir. Bu, layihədə budaqlanma haqqında məlumatı qorumaq üçün ən yaxşı təcrübədir.
Squash merge mənbə budağın bütün commitlərini birinə sıxışdırır və hədəf budağa tətbiq edir. Funksiya tarixi itir — budağa bütün dəyişikliklərlə bir commit daxil olur. Bu, funksiya budağındakı detallı commitlər ümumi tarix üçün dəyər daşımadıqda əlverişlidir.
# Squash merge: feature-un bütün commitləri birinə sıxışdırıldı
git checkout develop
git merge --squash feature/experimental
git commit -m "feat: experimental login flow (squashed)"
Squash qaralama, eksperimental budaqlar və tarixin təmizliyini qorumağın vacib olduğu hallar üçün uyğundur. Minus — orijinal commitlərlə əlaqə itir, bu da ayrı-ayrı dəyişikliklərin geri qaytarılmasını çətinləşdirir.
Ours və Theirs — Git-də iki xüsusi merge strategiyası. Ours mənbə budaqdan dəyişiklikləri tamamilə nəzərə almır, yalnız hədəf budaqda olanları saxlayır. Theirs isə əksinə, hər hansı konfliktdə mənbə budağın versiyasını qəbul edir. Bu strategiyalar hansı versiyanın qalib gəlməli olduğu əvvəlcədən məlum olduqda böyük həcmdə kodun birləşdirilməsində faydalıdır.
Git-də merge mexanizmi üç nöqtənin müqayisəsinə əsaslanır: ümumi əcdad (merge base), mənbə budağın vəziyyəti və hədəf budağın vəziyyəti. Git merge base-i — hər iki budaq üçün ümumi olan son commiti tapır və ayrılmadan sonra hər budaqda hansı dəyişikliklərin baş verdiyini hesablayır.
Git üçtərəfli birləşdirmə alqoritmindən istifadə edir ki, bu da təkcə iki müqayisə edilən fayl versiyasını deyil, həm də onların ümumi əcdadını nəzərə alır. Bunun sayəsində Git bir budaqdakı dəyişikliklər digərinin dəyişdirilmiş hissələrinə toxunmadıqda avtomatik həll edə bilər — hər iki fayl dəyişdirilmiş olsa belə.
Ssenarini nəzərdən keçirək: iki proqramçı eyni funksiya budağında müxtəlif fayllar üzərində işləyir. Birincisi LoginActivity.kt-ni, ikincisi ProfileFragment.kt-ni dəyişdi. Onlar öz dəyişikliklərini birləşdirdikdə, Git dəyişikliklərin müxtəlif fayllara toxunduğunu görür və insan müdaxiləsi olmadan avtomatik merge yerinə yetirir.
Əgər hər iki proqramçı LoginActivity.kt-ni, lakin müxtəlif metodlarda dəyişibsə — Git də avtomatik öhdəsindən gəlir, dəyişiklikləri sətir-sətir birləşdirir. Konflikt yalnız hər ikisi eyni sətirləri dəyişdikdə və ya biri digərinin dəyişdirdiyi kodu sildikdə yaranır.
Merge konflikti o zaman yaranır ki, Git dəyişiklikləri avtomatik birləşdirə bilmir, çünki hər iki budaq eyni sətirləri fərqli şəkildə dəyişib. Bu halda Git fayllarda konfliktli hissələri qeyd edir və proqramçıdan əl ilə həll gözləyir.
Konfliktli hissələr xüsusi markerlərlə işarələnir: <<<<<<< HEAD hədəf budaqdan kodu göstərir, ======= — ayırıcı, >>>>>>> source-branch — mənbə budaqdan kodu. Proqramçı əl ilə hansı variantı saxlayacağını seçməli və ya onları birləşdirməlidir.
# 1. Merge-i işə salmaq və konflikti görmək
git merge feature/new-login
# Nəticə: CONFLICT (content): Merge conflict in LoginActivity.kt
# 2. Konfliktli faylların siyahısına baxmaq
git status
# both modified: src/ui/login/LoginActivity.kt
# 3. Konflikti həll etmək: faylı redaktə etmək, markerləri silmək
# 4. Həll edilmiş faylı əlavə etmək və merge-i bitirmək
git add src/ui/login/LoginActivity.kt
git merge --continue
# və ya: git commit (--continue olmadan)
Konfliktləri həll etmək üçün alətlər mövcuddur: git mergetool vizual merger açır (Meld, Beyond Compare, VS Code). Bir çox proqramçı konfliktləri IDE-də həll etməyə üstünlük verir — IntelliJ IDEA və Android Studio üçpanelli müqayisə ilə daxili alət təqdim edir ki, bu da prosesi xeyli asanlaşdırır.
Konfliktlərin həlli üçün məsləhətlər: həmişə konfliktin hər tərəfinin nə etdiyini anlayın, başqasının kodunu onun məntiqini anlamadan silməyin və konflikt çox mürəkkəbdirsə — hər iki budağın müəllifini birgə həllə cəlb edin.
Merge və Rebase arasında seçim — Git-də ən çox rast gəlinən memarlıq qərarlarından biridir. Hər iki yanaşma dəyişiklikləri birləşdirir, lakin fərqli şəkildə: merge budaqlanma tarixini qoruyur, rebase tarixi yenidən yazaraq onu xətti edir.
Bir çox komanda hibrid yanaşma istifadə edir: funksiya budağını develop-in cari vəziyyətinə gətirmək üçün rebase (git rebase develop), sonra birləşməni qeyd etmək üçün --no-ff bayrağı ilə merge. Bu, funksiya daxilində təmiz tarix və develop səviyyəsində məlumatlandırıcı birləşmə nöqtələri verir.
Tez-tez verilən suallar
--no-ff olmadan Git mümkün olduqda fast-forward merge yerinə yetirir — sadəcə budaq göstəricisini aparır. --no-ff ilə Git həmişə merge commit yaradır, budaqlanma haqqında məlumatı qoruyur. Komanda işində funksiya budaqları üçün tövsiyə olunur.
Git mergetool istifadə edin və ya IDE-nin daxili alətini. Konflikt onlarla fayla təsir edirsə — bəlkə budaqlar çox ayrılıb. Bu halda komanda ilə birləşmə planını müzakirə etmək, bəlkə də onu bir neçə mərhələyə bölmək dəyər.
Bəli: git merge --abort merge-i ləğv edir, əgər hələ başa çatmayıbsa (konflikt). Merge artıq başa çatıbsa — təhlükəsiz geri qaytarma üçün git reset --hard HEAD~1 və ya git revert -m 1 <merge-commit> istifadə edin.
Komanda işi üçün tövsiyə olunur. Merge commit birləşmə faktını qeyd edir, hər iki budağa istinadlar ehtiva edir və tarixi anlamağı asanlaşdırır. Şəxsi və ya eksperimental budaqlar üçün squash merge və ya fast-forward məqbuldur.
Git ikili faylları avtomatik birləşdirə bilmir — versiyalardan birini tamamilə seçir. İkili fayllar (şəkillər, .aab, .apk) üçün paralel dəyişiklikləri minimuma endirmək və böyük fayllar üçün Git LFS istifadə etmək tövsiyə olunur.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun