CodeGym /Kurslar /C# SELF /Təhlükəsiz eksperimentlər: branch-larla işləmək

Təhlükəsiz eksperimentlər: branch-larla işləmək

C# SELF
Səviyyə, Dərs
Mövcuddur

1. Branch nədir və niyə lazımdır?

Git-də branches ilə işləmək — versiyaların idarə olunmasının əsas aspektlərindən biridir və bir repository-də paralel inkişaf xətləri aparmağa imkan verir. Branch-lər Git-i kollaborasiya, eksperimentlər və layihənin müxtəlif versiyalarının idarəsi üçün güclü alət edir.

            gitGraph
            commit id: "Initial setup"
            commit id: "Add base features"
            branch feature/new-idea
            checkout feature/new-idea
            commit id: "Implement new logic"
            commit id: "Refactor the logic"
            checkout main
            commit id: "Urgent bugfix on main"
            merge feature/new-idea
            commit id: "Prepare for release"
        
Əsas branch olan main-dən yeni branch — feature/new-idea ayrılır və təhlükəsiz inkişaf üçün istifadə olunur. İş tamamlandıqda o yenidən main-ə merge edilir.

Təsəvvür edin ki, layihənizdə nəsə ciddi dəyişmək və ya riskli eksperiment aparmaq istəyirsiniz. Git olmadan nə edərdiniz? Çox güman ki, layihəni yeni qovluğa kopyalayardınız və orada işləyərdiniz. Nəticə xoşunuza gələrsə — onu əsas qovluğa keçirərdiniz. Gəlməzsə — nüsxəni silərdiniz.

Git-də branch-lər eyni prinsiplə işləyir, amma daha eleqant şəkildə. Gəlin bunu kitab yazma nümunəsində nəzərdən keçirək:

  1. Sizin hazır əl yazınız var (bu sizin əsas branch-ınız — main).
  2. Alternativ final yazmaq istəyirsinizsə (məsələn, yeni ideya üçün) yeni branch yaradırsınız — məsələn, feature/new-idea.
  3. Yeni finalı əsas mətnə toxunmadan yazırsınız (yeni branch-də işləyirsiniz).
  4. Yeni final daha yaxşıdırsa, onu əsas mətndə əvəz edirsiniz (branch-ləri merge edirsiniz — merge).
  5. Lazımsız eskizləri silə bilərsiniz (branch-i silirsiniz).

2. Yeni branch yaratmaq və onun üzərində işləmək

1-ci addım. Branch idarəetmə menyusunu açın.

IDE-nin üst panelində cari branch-in adını göstərən widget var (default olaraq — main). Ona klikləyin və + New Branch seçin.

2-ci addım. Yeni branch üçün ad.

Yaxşı təcrübə odur ki, branch-ləri həll etdiyiniz tapşırığa uyğun adlandrasınız. Məsələn, feature/add-usage-examples.

Branch yaradıldıqdan sonra IDE avtomatik olaraq ona keçəcək. Siz həmin widget-də yeni adı görəcəksiniz.

3-cü addım. Dəyişiklikləri edin və commit aparın.

İndi siz öz "sandbox"ınızdasınız. Gəlin faylımıza — README.md — istifadə nümunələri bölməsi əlavə edək. Dəyişiklikləri edib commit edin, keçən mühazirədə öyrəndiyiniz kimi.

3. Branch-lər arasında keçid

Siz artıq istifadə nümunələri ilə bağlı dəyişiklikləri feature/add-usage-examples branch-də etmisiniz. Gəlin əsas branch — main-ə qayıdaq və orada nə olduğunu yoxlayaq.

1-ci addım. Yenə cari branch adını göstərən widget-ə klikləyin.

2-ci addım. Local və ya Recent siyahısından main branch-ini seçin və açılan menyuda Checkout-a klikləyin.

3-cü addım. Nəticəni yoxlayın.

Keçid etdikdən sonra README.md-i açın. Siz orada istifadə nümunələri bölməsinin olmadığını görəcəksiniz! O, yalnız digər branch-də qaldı. Beləliklə, yeni funksionallıq üzərində işləyərkən əsas, stabil versiyaya toxunmur və onu pozmursunuz.

4. Branch-lərin merge edilməsi (Merge)

merge əmri feature/add-examples branch-dən (bu halda C3 commit) bütün commit-ləri götürüb cari branch — main ilə birləşdirir və yeni merge commit yaradır.

            gitGraph
            commit id: "C1"
            commit id: "C2"
            branch feature/add-examples
            checkout feature/add-examples
            commit id: "C3: Add new section"
            checkout main
            merge feature/add-examples
        

Beləliklə, siz feature/add-usage-examples branch-də işinizi bitirdiniz və bu dəyişiklikləri əsas layihəyə əlavə etmək istəyirsiniz.

1-ci addım. Hədəf branch-ə keçin.

Əmin olun ki, siz həmin branch-dəsiniz, HARA dəyişiklikləri əlavə etmək istəyirsiniz. Bizim nümunədə bu — main.

2-ci addım. Merge edin.

Yenə branch idarəetmə widget-ına klikləyin. Siyahıdan HARADAN dəyişiklikləri götürmək istədiyiniz branch-i seçin (feature/add-usage-examples) və alt menyuda Merge — feature/add-usage-examples to main seçimini edin.

3-cü addım. Nəticəni yoxlayın.

İndi README.md-də main branch-də sizin yeni istifadə nümunələri bölməsi görünür. Siz işinizi əsas layihə ilə uğurla birləşdirdiniz!

5. Merge konfliktləri: qorxmayın, bu normaldır!

Bəzən branch-ləri merge edərkən konfliktlər yaranır. Bu, hər iki branch-də eyni fayldakı eyni sətrlərin dəyişdirildiyi zaman baş verir. Git hansı versiyanın doğru olduğunu avtomatik seçə bilməz və sizin müdaxilənizi istəyir.

            gitGraph
            commit id: "C1: Ümumi baza"
            branch feature/new-title
            checkout main
            commit id: "C2: Dəyişiklik main-də"
            checkout feature/new-title
            commit id: "C3: Dəyişiklik feature-də"
        
Hər iki branch — main və feature/new-title — ümumi ancestor (C1) üzərindən yeni commit-lər (C2 və C3) aldı. Bu, merge zamanı mütləq konflikt yaradacaq.

Gəlin konflikti modelləşdirək:

  1. Əmin olun ki, siz main branch-indəsiniz və saxlanılmamış dəyişiklikləriniz yoxdur.
  2. Dərhal yeni branch yaradın — feature/new-title, amma hələ ona keçməyin. Checkout branch seçimini boş saxlayın.
  3. İndi main-də olarkən README.md-in ilk sətrini "My Awesome Project" olaraq dəyişdirin və commit edin.
  4. feature/new-title-ə keçin. Siz görəcəksiniz ki, README.md-in ilk sətri burada köhnə vəziyyətdədir — bu faylın branch yaradıldığı anın vəziyyətidir. Eyni sətri "My Super Project" olaraq dəyişdirin və commit edin.
  5. main-ə geri dönün və feature/new-title-i merge edin.

İndi Git görəcək ki, hər iki branch-də ümumi ancestor-dan ayrılan yeni, diverge olan tarixçə var. Hər iki tərəfdə eyni sətrin dəyişdirildiyi üçün Git hansının doğru olduğunu seçə bilməyəcək və konfliktin həlli üçün sizə pəncərə göstərəcək.

Merge Revision

Burada nə görürsünüz:

  • Solda (Your changes): faylın sizin cari branch-dən gələn versiyası (main).
  • Sağda (Changes from branch...): merge etdiyiniz branch-dən gələn fayl versiyası.
  • Mərkəzdə (Result): son versiya — onu siz yığmalısınız.

Siz tam bir variantı qəbul etmək üçün ox işarələrinə >> və ya << klikləyə bilərsiniz.

Orta paneldə nəticə sizi qane etdikdə, Apply-a klikləyin. IDE öz-özünə merge commit yaradacaq və konflikt həll olunacaq.

Niyə konflikt olmadı?

Bəzən bütün addımları etdikdən sonra konflikt yaranmır. Ən çox rast gəlinən səbəb budur ki, Git fast-forward merge edə bilir, yəni bir branch-in tarixçəsi sadəcə digərinin tarixçəsinin davamıdır. Konfliktin yaranması üçün branch-lərin tarixçələri ümumi ancestor-dan fərqli istiqamətlərə ayrılmalıdır.

Nümunə:

  1. Sizin main-də bir commit var (məsələn, C1).
  2. Siz main-də "My Awesome Project" məzmunu ilə yeni commit edirsiniz. İndi main C2 commit-ə göstərir (main -> C1 -> C2).
  3. Siz cari vəziyyətdən yeni branch — feature/new-title yaradırsınız. Bu o deməkdir ki, yeni branch də C2-dən başlayır.
  4. feature/new-title-də "My Super Project" ilə commit edirsiniz. Bu branch "irəli gedir" və indi C3 commit-ə göstərir (feature/new-title -> C1 -> C2 -> C3).
  5. Şərtlər belədir: siz main-ə qayıdırsınız (hələ C2-də saxlanılıb) və feature/new-title-i merge edirsiniz.

Git vəziyyəti qiymətləndirir və görür ki, main branch-i feature/new-title-in birbaşa ancestor-dur. Main-də sizin başqa heç bir yeni commit yox idi, siz digər branch-də işləyərkən. Git belə düşünür: "Burada sadəcə main-i C3-ə sürüşdürmək lazımdır. Heç bir ziddiyyət yoxdur". Və sadəcə main pointer-inə C3 qoyur.

            gitGraph
            commit id: "C1"
            commit id: "C2"
            branch feature/new-title
            checkout feature/new-title
            commit id: "C3"
            checkout main
            merge feature/new-title
        

6. Dəyişiklik tarixçəsinə baxış

Layihənizdə nə baş verdiyini daha yaxşı anlamaq üçün onun tarixçəsinə baxmaq faydalıdır.

IDE-nin alt hissəsində Git tabını açın və Log-u seçin. Siz bütün branch-lərin və commit-lərin qrafik təsvirini görəcəksiniz. Bu, hansı branch-in hansıdan ayrıldığını və harada merge edildiyini vizual şəkildə izləməyə kömək edəcək.

Burada istənilən commit-ə klikləyərək onun hansı dəyişiklikləri ehtiva etdiyini, kim və nə vaxt etdiyini görə bilərsiniz. Bu, kod üçün həqiqi zaman maşınıdır!

Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION