Git
Chapters ▾ 2nd Edition

3.5 Git’də Branch - Uzaq Branch’lar

Uzaq Branch’lar

Uzaqdan verilən arayışlar, filiallar, etiketlər və sair də daxil olmaqla, uzaq depolarınızdakı istinadlar (işarələr). Əlavə məlumat üçün uzaq filiallar üçün git ls-remote <remote>`və ya `git remote show <remote> ilə açıq arayışların tam siyahısını əldə edə bilərsiniz. Buna baxmayaraq, daha yaygın bir yol, uzaqdan idarə olunan branch-lardan faydalanmaqdır.

Uzaqdan izləyən branch-la, uzaq branch-ların vəziyyətinə istinadlardır. Onlar hərəkət edə bilməyəcəyiniz yerli istinadlardır; Hər hansı bir şəbəkə rabitəsi etdikdə Git onları sizin üçün uzaq depo vəziyyətini dəqiq şəkildə təmsil etdiyinə əmin olmaq üçün hərəkət etdirir. Uzaqdakı depolarınızdakı filialların son dəfə bağlandığınızı xatırlatmaq üçün onları bookmark kimi düşünün.

Uzaqdan izləyən branch adları <remote>/<branch> şəklini alır. Məsələn, uzaqdan origin uzaqdakı master branch-nın nə ilə əlaqə qurduğunu görməyini istəsəniz, origin.master branch-nı yoxlayırsınız. Bir tərəfdaşla bir problem üzərində işləyirdinizsə və onlar iss53 branch-nı push etdilərsə, local iss53 branch-nız ola bilər, ancaq serverdəki branch uzaqdan izləmə branch-ı origin/iss53 ilə təmsil ediləcəkdir .

Bu bir az qarışıq ola bilər, buna görə bir nümunəyə baxaq. Deyək ki, şəbəkənizdə Git serveriniz var git.ourcompany.com. Bundan klonlasanız, Git-in clone əmrini avtomatik olaraq sizin üçün origin adlandırır, bütün məlumatları aşağı salır, master branch-nın olduğu yerə bir göstərici yaradır və local olaraq origin/master adlandırır. Git, local master branch-ı ilə eyni yerdə başlayaraq local master branch-nı verir, buna görə işləmək üçün bir şeyiniz var.

Note
“origin” xüsusi deyil

Nə branch adı “master”, nə də “origin” Git’də xüsusi bir məna daşımır. Geniş istifadə edilməsinin yeganə səbəbi olan git init işlədikdə “master” başlanğıc branch üçün standart ad olsa da,git clone işlədərkən “origin” uzaqdan verilən addır. Bunun əvəzinə git clone -o booyah işlədirsinizsə, standart uzaq filialınız olaraq booyah/master olacaqdır.

Klonlamadan sonra server və local depo.
Figure 30. Klonlamadan sonra server və local depo

Local master branch-nızda bir az iş görsəniz və bu vaxt başqa birisi git.ourcompany.com`a push etsə və `master branch-nı yeniləyirsə, onda tarixləriniz fərqli şəkildə irəliləyəcəkdir. Ayrıca, origin serverinizlə əlaqədən kənarda qaldığınız müddətcə, origin/master markeriniz hərəkət etmir.

Local və uzaqdan iş bir-birindən ayrıla bilər
Figure 31. Local və uzaqdan iş bir-birindən ayrıla bilər

Uzaqdan işinizi sinxronlaşdırmaq üçün git fetch <remote> əmrini işlədirsiniz (bizim vəziyyətimizdə git fetch origin). Bu əmr “origin” hansı server olduğunu (bu vəziyyətdə bu git.ourcompany.com) axtarır, olmayan hər hansı bir məlumat alır və local mənbənizi yeniləyir `origin/master`i yeni, daha müasir vəziyyətə gətirir.

`git fetch` uzaqdan izləyən branch-ları yeniləyir
Figure 32. git fetch uzaqdan izləyən branch-ları yeniləyir

Fərz edək ki, çoxsaylı uzaq serverlərin olduğunu və bu uzaq layihələr üçün hansı uzaq filialların göründüyünü göstərmək üçün yalnız sprint komandalarınızdan birinin inkişafı üçün istifadə olunan başqa bir daxili Git serveriniz var. Bu server git.team1.ourcompany.com-dadır. Bunu Git’in Əsasları bəhs etdiyimiz kimi git remote add əmrini işlədərək hazırladığınız layihəyə yeni bir uzaq istinad kimi əlavə edə bilərsiniz. Bütün bu URL üçün qısa ad olacaq bu uzaq "teamone" adlandırın.

Uzaqdan başqa serverin əlavə edilməsi
Figure 33. Uzaqdan başqa serverin əlavə edilməsi

İndi uzaq olan teamone serverində hələ sizdə olmayan şeyləri əldə etmək üçün git fetch teamone işlədə bilərsiniz. Çünki bu server sizin origin serverinizdə hazırda verilənlərin alt hissəsinə malikdir. Git heç bir məlumat əldə etmir, lakin teamone nin master branch-ı kimi götürdüyü tapşırığa işarə etmək üçün teamone/master adlı uzaqdan izləmə branch-ı təyin edir.

`teamone/master` üçün uzaqdan izləmə filialı
Figure 34. teamone/master üçün uzaqdan izləmə filialı

Pushing (İtələmə)

Bir filialı dünya ilə bölüşmək istədikdə, onu yazmaq imkanı olan uzaq bir yerə itələməlisiniz. Local branch-larınız avtomatik olaraq yazdığınız məsafələrə sinxronizasiya olunmur - bölüşmək istədiyiniz branch-ları açıq şəkildə göstərməlisiniz. Beləliklə, bölüşmək istəmədiyiniz iş üçün private branch-lardan istifadə edə bilərsiniz və yalnız əməkdaşlıq etmək istədiyiniz topic branchl-larını push edə bilərsiniz.

Başqaları ilə işləmək istədiyiniz serverfix adlı bir branch-nız varsa, ilk branch-nızı push etdiyiniz kimi push edə bilərsiniz. git push <remote> <branch> əmrini işlət:

$ git push origin serverfix
Counting objects: 24, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (15/15), done.
Writing objects: 100% (24/24), 1.91 KiB | 0 bytes/s, done.
Total 24 (delta 2), reused 0 (delta 0)
To https://github.com/schacon/simplegit
 * [new branch]      serverfix -> serverfix

Bu bir az qısa yoldur. Git avtomatik olaraq serverfix branch adını refs/heads/serverfix:refs/heads/serverfix olaraq genişləndirir. Bu o deməkdir ki, “Take my serverfix local branch and push it to update the remote’s serverfix branch.” refs/heads/ hissəsini detallı Git’in Daxili İşləri üzərində keçəcəyik, ümumiyyətlə onu bağlıya da bilərsiniz. Eyni şeyi git push origin serverfix:serverfix-də edə bilərsiniz — “Take my serverfix and make it the remote’s serverfix.” Local bir branch-ı fərqli adlandırılan uzaq bir brancha-a push etmək üçün bu formatdan istifadə edə bilərsiniz. Uzaqdan serverfix adlandırılmasını istəməsəniz, local serverfix branch-nı uzaq layihədəki awesomebranch branch-a push etmək üçün git push origin serverfix:awesomebranch işlətmək olar.

Note
Şifrənizi hər dəfə yazmayın

Üzərinə push etmək üçün bir HTTPS URL istifadə edirsinizsə, Git server istifadəçi adınızı və identifikasiyanız üçün şifrənizi istəyəcək. Varsayılan olaraq, bu məlumat üçün terminalda ad və şifrənizi soruşacaq, buna görə server təkan verə biləcəyinizi söyləyə bilər.

Hər dəfə push etdiyiniz zaman onu yazmaq istəmirsinizsə, “credential cache” qura bilərsiniz. Ən sadə, onu git config --global credential.helper cache ilə asanlıqla qurub bir neçə dəqiqə ərzində yaddaşda saxlamaqdır.

Daha çox məlumat üçün Etibarlı Yaddaş-ə bax.

Növbəti dəfə əməkdaşlarınızdan biri serverdən aldıqda serverfix-ın server versiyasının uzaq branch-ı origin/serverfix altında olduğu barədə bir məlumat əldə edəcəklər:

$ git fetch origin
remote: Counting objects: 7, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 3 (delta 0)
Unpacking objects: 100% (3/3), done.
From https://github.com/schacon/simplegit
 * [new branch]      serverfix    -> origin/serverfix

Diqqətə çatdırmaq lazımdır ki, yeni uzaqdan idarə olunan branch-ları çıxaran zaman avtomatik olaraq onların local, düzəliş olunan kopyaları olmur. Başqa sözlə, bu vəziyyətdə yeni bir serverfix branch-nız yoxdur - yalnız dəyişdirə bilmədiyiniz bir origin/serverfix göstərici var.

Bu işi cari işləyən branch-ınıza birləşdirmək üçün git merge origin/serverfix işlədə bilərsiniz. Çalışa biləcəyiniz öz serverfix branch-nızı istəyirsinizsə, onu uzaqdan izləyən branch-nızdan əsas götürə bilərsiniz:

$ git checkout -b serverfix origin/serverfix
Branch serverfix set up to track remote branch serverfix from origin.
Switched to a new branch 'serverfix'

Bu, origin/serverfix olduğu yerdə başlaya biləcəyiniz local bir branch verir.

İzləmə Branch-ları

Local bir branch-ı uzaqdan izləyən bir branch-dan yoxlamaq avtomatik olaraq “tracking branch” adlandırılan bir şey yaradır (və izlədiyi branch “upstream branch”'adlanır). İzləmə branch-larınız uzaq bir branch-la birbaşa əlaqəsi olan local branch-lardır. Bir izləmə branch-ında olsanız və git pull yazsanız, Git hansı serverdən alınacağını və hansı branch-a qoşulacağını avtomatik olaraq bilir.

Bir depo klonlaşdırdıqda, ümumiyyətlə avtomatik olaraq origin/master izləyən bir master branch-ı yaradır. Ancaq istəsəniz digər izləmə branch-larını - digər uzaqdan branch-ları izləyənləri və ya master branch-nı izləməyənləri qura bilərsiniz. Gördüyünüz nümunə sadə işdir, git checkout -b <branch> <remote>/<branch>. Bu Git --track təqdim etdiyi kifayət qədər ümumi bir əməliyyatdır:

$ git checkout --track origin/serverfix
Branch serverfix set up to track remote branch serverfix from origin.
Switched to a new branch 'serverfix'

Əslində, bu o qədər yaygındır ki, hətta bu qısa yol üçün qısa yol var. Əgər yoxlamağa çalışdığınız branch-ın adı yoxdursa (a) yalnız bir uzaqdan bir adla (b) tam uyğun gəlirsə, Git sizin üçün bir izləmə branch-ı yaradacaq:

$ git checkout serverfix
Branch serverfix set up to track remote branch serverfix from origin.
Switched to a new branch 'serverfix'

Uzaq branch-dan fərqli bir adla local bir branch qurmaq üçün ilk versiyanı fərqli bir local branch adı ilə asanlıqla istifadə edə bilərsiniz:

$ git checkout -b sf origin/serverfix
Branch sf set up to track remote branch serverfix from origin.
Switched to a new branch 'sf'

İndi sf local branch-nız avtomatik olaraq`origin/serverfix`-dən pull olacaq. Artıq local bir branch-nız varsa və onu yeni pull down etdiyiniz uzaq bir branch-a qurmaq və ya izlədiyiniz yuxarı branch-ı dəyişdirmək istəyirsinizsə, -u və ya --set-upstream-to istifadə edə bilərsiniz. İstədiyiniz zaman açıq şəkildə təyin etmək üçün git branch seçimini seçin.

$ git branch -u origin/serverfix
Branch serverfix set up to track remote branch serverfix from origin.
Note
Yuxarıdakı shorthand

Bir izləmə branch-ı qurulduğunda onun yuxarı hissəsini @{upstream} və ya @{u} shorthand-ləri ilə istinad edə bilərsiniz. Beləliklə, master branch-ında olsanız və origin/master izləyirsinizsə,git merge origin/master yerinə git merge @{u} istifadə edə bilərsiniz.

Hansı izləmə branch-larını qurduğunuzu görmək istəyirsinizsə, -vv seçimini git branch-a a istifadə edə bilərsiniz. Bu, hər branch-ın izlədiyi və local branch-ın qabaqda, arxada və ya hər ikisində olduğu kimi daha çox məlumatla local branch-larınızı siyahıya alacaq.

$ git branch -vv
  iss53     7e424c3 [origin/iss53: ahead 2] Add forgotten brackets
  master    1ae2a45 [origin/master] Deploy index fix
* serverfix f8674d9 [teamone/server-fix-good: ahead 3, behind 1] This should do it
  testing   5ea463a Try something new

Beləliklə, görürük ki, iss53 branch-mız origin/iss53-i izləyir və iki addım qabaqdadır, yəni yerli olaraq serverə sövq edilməyən iki tapşırıq var. Bir də görə bilərik ki, bu günə qədər master branch-mız origin/master-i izləyir. Sonradan görürük ki, serverfix branch-mız teamone serverimizdəki server-fix-good branch-nı izləyir və üç qabaqda və bir arxadadır.Bu o deməkdir ki, hələ birləşmədiyimiz serverdə bir commit var və üçü push etmədyimizi local olaraq həyata keçirir. Nəhayət, testing branch-mızın heç bir branch-ı izləmədiyini görə bilərik.

Bu nömrələr yalnız hər bir serverdən sonuncu dəfə alındıqdan bəri qeyd etmək vacibdir. Bu əmr serverlərə çatmır, local olaraq bu serverlərdən nə saxladığını izah edir. Tamamilə əvvəlcədən və arxadan nömrələrin yenilənməsini istəyirsinizsə, bu işə başlamazdan əvvəl bütün uzaqdan məlumatları gətirməlisiniz. Siz bunu belə edə biləsiniz:

$ git fetch --all; git branch -vv

Pulling (Çəkmək)

git fetch əmri hələ olmayan serverdəki bütün dəyişiklikləri götürsə də, işləyən qovluğunuzu ümumiyyətlə dəyişdirməyəcəkdir. Sadəcə sizin üçün məlumatları əldə edəcək və özünüzü birləşdirməyə imkan verəcəkdir. Bununla birlikdə, git pull deyilən bir əmr var və əksər hallarda dərhal git merge ilə izlənilən git fetch deməkdir. Son hissədə göstərildiyi kimi bir izləmə branch-ı varsa, onu açıq şəkildə təyin etməklə və ya clone və ya checkout əmrləri ilə yaradaraq, git pull server və branch-nıza baxacaq. Cari branch-ı izləyib, həmin serverdən alacaq və sonra uzaq branch-da birləşməyə çalıcaqsınız. Ümumiyyətlə fetchmerge əmrlərini istifadə etmək daha yaxşıdır, çünki git pull əmri çox vaxt qarışıq ola bilər.

Uzaq Branch-ların Silinməsi

Uzaq bir branch-la bitdiyinizi düşünün - sizin və əməkdaşlarınızın bir xüsusiyyət ilə tamamlandığını və uzaqdan master branch-nıza birləşdirin (və ya sabit bir kod xəttiniz olan hər hansı bir şöbə). git push-da --delete seçimini istifadə edərək uzaqdan bir branch-ı silmək olar.

Serverdən serverfix branch-nı silmək istəyirsinizsə, aşağıdakı əmrləri izləyə bilərsiniz

$ git push origin --delete serverfix
To https://github.com/schacon/simplegit
 - [deleted]         serverfix

Əsas olaraq bütün bunlar göstəricini serverdən silməkdir. Git server ümumiyyətlə məlumatları bir garbage collection işləməyincə bir müddət saxlayacaq, buna görə təsadüfən silinibsə, tez-tez bərpa etmək asandır.