-
1. Başlanğıc
- 1.1 Versiyaya Nəzarət Haqqında
- 1.2 Git’in Qısa Hekayəsi
- 1.3 Git Nədir?
- 1.4 Əmr Sətiri
- 1.5 Git’i Quraşdırmaq
- 1.6 İlk Dəfə Git Quraşdırması
- 1.7 Kömək Almaq
- 1.8 Qısa Məzmun
-
2. Git’in Əsasları
-
3. Git’də Branch
- 3.1 Nutshell’də Branch’lar
- 3.2 Sadə Branching və Birləşdirmə
- 3.3 Branch İdarəedilməsi
- 3.4 Branching İş Axınları
- 3.5 Uzaq Branch’lar
- 3.6 Rebasing
- 3.7 Qısa Məzmun
-
4. Server’də Git
- 4.1 Protokollar
- 4.2 Serverdə Git Əldə Etmək
- 4.3 Sizin öz SSH Public Key’nizi yaratmaq
- 4.4 Server qurmaq
- 4.5 Git Daemon
- 4.6 Smart HTTP
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 Üçüncü Tərəf Seçimləri
- 4.10 Qısa Məzmun
-
5. Paylanmış Git
-
6. GitHub
-
7. Git Alətləri
- 7.1 Reviziya Seçimi
- 7.2 Interaktiv Səhnələşdirmə
- 7.3 Stashing və Təmizləmə
- 7.4 İşinizin İmzalanması
- 7.5 Axtarış
- 7.6 Tarixi Yenidən Yazmaq
- 7.7 Reset Demystified
- 7.8 İnkişaf etmiş Birləşmə
- 7.9 Rerere
- 7.10 Git ilə Debugging
- 7.11 Alt Modullar
- 7.12 Bundling
- 7.13 Dəyişdirmək
- 7.14 Etibarlı Yaddaş
- 7.15 Qısa Məzmun
-
8. Git’i Fərdiləşdirmək
- 8.1 Git Konfiqurasiyası
- 8.2 Git Atributları
- 8.3 Git Hook’ları
- 8.4 Git-Enforced Siyasət Nümunəsi
- 8.5 Qısa Məzmun
-
9. Git və Digər Sistemlər
- 9.1 Git Müştəri kimi
- 9.2 Git’ə Miqrasiya
- 9.3 Qısa Məzmun
-
10. Git’in Daxili İşləri
- 10.1 Plumbing və Porcelain
- 10.2 Git Obyektləri
- 10.3 Git Referansları
- 10.4 Packfile’lar
- 10.5 Refspec
- 10.6 Transfer Protokolları
- 10.7 Maintenance və Məlumatların Bərpası
- 10.8 Mühit Dəyişənləri
- 10.9 Qısa Məzmun
-
A1. Appendix A: Digər Mühitlərdə Git
- A1.1 Qrafik interfeyslər
- A1.2 Visual Studio’da Git
- A1.3 Visual Studio Code’da Git
- A1.4 Eclipse’də Git
- A1.5 Sublime Text’də Git
- A1.6 Bash’da Git
- A1.7 Zsh’də Git
- A1.8 PowerShell’də Git
- A1.9 Qısa Məzmun
-
A2. Appendix B: Proqramlara Git Daxil Etmək
- A2.1 Əmr-sətri Git
- A2.2 Libgit2
- A2.3 JGit
- A2.4 go-git
- A2.5 Dulwich
-
A3. Appendix C: Git Əmrləri
- A3.1 Quraşdırma və Konfiqurasiya
- A3.2 Layihələrin Alınması və Yaradılması
- A3.3 Sadə Snapshotting
- A3.4 Branching və Birləşmə
- A3.5 Layihələrin Paylaşılması və Yenilənməsi
- A3.6 Yoxlama və Müqayisə
- A3.7 Debugging
- A3.8 Patching
- A3.9 E-poçt
- A3.10 Xarici Sistemlər
- A3.11 İdarəetmə
- A3.12 Plumbing Əmrləri
3.1 Git’də Branch - Nutshell’də Branch’lar
Demək olar ki, hər bir VNS’nin bir növ branching dəstəyi var. Branching əsas inkişaf xəttindən uzaqlaşmağınız və bu ana xəttlə qarışmadan işinizi davam etdirməyiniz deməkdir. Bir çox VNS alətində bu, bir qədər bahalı bir prosesdir və tez-tez mənbə kodu qovluğunun yeni bir nüsxəsini yaratmağınızı tələb edir, bu da böyük layihələr üçün çox vaxt apara bilər.
Bəzi insanlar Git’in branching modelini “qatil xüsusiyyəti” olaraq adlandırırlar və bu, Git’i VNS cəmiyyətində fərqləndirir. Niyə bu qədər xüsusidir? Git branch’larının yolu inanılmaz dərəcədə yüngüldür və branching əməliyyatlarını anında edir və branch’lar arasında ümumiyyətlə eyni sürətlə irəliləyir. Bir çox digər VNS’lərdən fərqli olaraq Git, gündə bir neçə dəfə dəfələrlə branch və birləşən iş axınlarını təşviq edir. Bu xüsusiyyəti anlamaq və mənimsəmək sizə güclü və bənzərsiz bir vasitə verir və inkişaf yolunuzu tamamilə dəyişə bilər.
Nutshell’də Branch’lar
Git-in branching yolunu həqiqətən başa düşmək üçün geri addım atmalı və Git-in məlumatlarını necə saxladığını araşdırmalıyıq.
Başlanğıc fəsildən xatırladığınız kimi, Git məlumatları bir sıra dəyişikliklər və ya fərqlər kimi saxlamır, əksinə snapshotlar kimi saxlayır.
Commit etdiyiniz zaman Git, səhnələşdirdiyiniz məzmunun snapshotu olan bir commit obyekti saxlayır. Bu obyekt eyni zamanda müəllifin adını və e-poçt adresini, yazdığınız mesajı və bu commit-i yerinə yetirmədən əvvəl gələn (törədicisi və ya valideynləri) göstəriş və göstərişləri göstərmişdir: ilkin commit üçün sıfır valideynlər, normal bir commit üçün bir valideyn və iki və ya daha çox branch-ın birləşməsi nəticəsində əmələ gələn çoxlu valideynlər.
Bunu görüntüləmək üçün üç fayldan ibarət bir qovluğunun olduğunu fərz edək və hamısını səhnələşdirib commit götürdünüz. Faylların qurulması hər biri üçün bir yoxlama cədvəlini tərtib edir (Başlanğıcbəhs etdiyimiz SHA-1 hash), faylın həmin versiyasını Git depolarında saxlayır (Git kimi blobs onlara aiddir) istifadə edərək sahəsinə nəzarət hissəsini əlavə edir:
$ git add README test.rb LICENSE
$ git commit -m 'Initial commit'
git commit
əmrini yerinə yetirdikdə, Git hər alt bölməni yoxlayır (bu vəziyyətdə yalnız root layihə qovluğu) və onları Git deposunda ağac obyekti kimi saxlayır.
Git sonra metadata və root layihə ağacına göstərici olan bir obyekt yaradır ki, lazım olduqda həmin anı yenidən yarada bilsin.
Git deposunda artıq beş obyekt var: üç blobs (hər üç fayldan birinin məzmununu təmsil edən), qovluğun məzmununu sadalayan bir tree və hansı fayl adlarının blobs kimi saxlanıldığını və o root ağacına və göstərilən bütün metadata göstərici ilə bir commit.
![Commit və onun ağacı](png/commit-and-tree.png)
Bəzi dəyişikliklər etsəniz və yenidən commit etsəniz, növbəti əmr əvvəlcədən gələn commit göstəricisini saxlayır.
![Commitlər və onun valideynləri](png/commits-and-parents.png)
Git-dəki bir branch, onun commit-ləri arasındakı yüngül daşınan göstəricilərindən biridir.
Git-də standart branch adı master
-dir.
Commit etməyə başladığınız zaman etdiyiniz son commit-ə işarə edən bir master
branch verilir.
Hər dəfə commit etdiyiniz zaman master
branch-ı göstəricisi avtomatik olaraq irəliləyir.
Note
|
“mater” branch-ı Git-də xüsusi branch deyildir.
Tamamilə hər hansı digər branch kimidir.
Təxminən hər bir deponun bir səbəbi, |
![Branch və onun commit tarixi](png/branch-and-history.png)
Təzə Branch Yaratmaq
Yeni bir branch yaratdıqda nə baş verir?
Yaxşı, bunu etmək hərəkət etməyiniz üçün yeni bir göstərici yaradır.
Deyək ki, testing
adlı yeni bir branch yaratmaq istəyirsiniz.
Bunu git branch
əmri ilə edirsiniz:
$ git branch testing
Bu, hazırda olduğunuz eyni commit yeni bir göstərici yaradır.
![Eyni seriyaya commit edən iki branch](png/two-branches.png)
Git hazırda hansı branch-ın üzərində olduğunu necə bilir?
HEAD
adlı xüsusi bir göstərici saxlayır.
Qeyd edək ki, Subversion və ya CVS kimi istifadə oluna biləcəyiniz digər VNS-lərdəki HEAD
anlayışından çox fərqlidir.
Git-də bu, hazırda olduğunuz lokal branch-a işarədir.
Bu vəziyyətdə yenə də master
-in üstündəsiniz.
git branch
əmri yalnız yeni bir branch yaratdı - o branch-a keçmədi.
![Branch-a HEAD göstəricisi](png/head-to-master.png)
Şöbə nöqtələrinin göstərildiyi yerləri göstərən sadə git log
əmrini işlədərək bunu asanlıqla görə bilərsiniz.
Bu seçim --decorate
adlanır.
$ git log --oneline --decorate
f30ab (HEAD -> master, testing) Add feature #32 - ability to add new formats to the central interface
34ac2 Fix bug #1328 - stack overflow under certain conditions
98ca9 Initial commit
f30ab
əməlinin yanında orada olan master
və testing
branch-larını görə bilərsiniz.
Switching Branches
Mövcud bir branch-a keçmək üçün git checkout
əmrini yerinə yetirirsiniz.
Yeni testing
branch-a keçək:
$ git checkout testing
Bu, testing
şöbəsinə işarə etmək üçün HEAD
-ı hərəkətə gətirir.
![HEAD mövcud filiala işarə edir](png/head-to-testing.png)
Bunun əhəmiyyəti nədir? Yaxşı, başqa bir commit edək:
$ vim test.rb
$ git commit -a -m 'made a change'
![HEAD branch-ı bir commit götürüldükdə irəliləyir](png/advance-testing.png)
Bu, maraqlıdır, çünki indi testing
branch-nız irəliləmişdir, ancaq master
branch-nız branch-ları dəyişmək üçün git checkout
zamanı işlədiyiniz vəzifəni göstərir.
Gəlin yenidən master
branch-a qayıdaq:
$ git checkout master
Note
|
git log həmişə _bütün branch-ları göstərmirHal-hazırda Branch yoxa çıxmadı; Git sadəcə bu branch-la maraqlandığınızı bilmir və sizə nə istədiyini göstərməyə çalışır.
Başqa sözlə, default olaraq, İstədiyiniz branch üçün törəmə tarixçəsini göstərmək üçün onu dəqiq göstərməlisiniz: |
![Siz çıxış edəndə HEAD hərəkət edir](png/checkout-master.png)
Bu əmr iki şeyi etdi.
HEAD göstəricisini master
branch-a göstərmək üçün geri qoydu və işçi qovluğunuzdakı faylları master
işarələdiyi şəklə geri çevirdi.
Bu da bu anda etdiyiniz dəyişikliklərin layihənin köhnə versiyasından ayrılacağını bildirir.
Fərqli bir istiqamətə gedə bilmək üçün testing
şöbənizdə gördüyünüz işləri geri qaytarır.
Note
|
Branch-ları dəyişdirmək işçi qovluğunuzdakı faylları dəyişdirir
Git-də filialları dəyişdirdiyiniz zaman işlədiyiniz qovluqdakı faylların dəyişəcəyini nəzərə almaq vacibdir. Köhnə bir branch-a keçsəniz, işlədiyiniz qovluq bu branch-da sonuncu dəfə etdiyiniz kimi görünəcəkdir. Git təmiz bir şəkildə edə bilmirsə, ümumiyyətlə keçməyə imkan verməz. |
Yeniən bir neçə dəyişiklik və commit edək:
$ vim test.rb
$ git commit -a -m 'made other changes'
İndi layihənizin tarixi fərqləndi (bax Fərqli tarix).
Bir branch yaratdınız və işə keçdiniz, bir az iş gördünüz, sonra yenidən əsas branch-a keçdiniz və başqa işlər gördünüz.
Bu dəyişikliklərin hər ikisi ayrı-ayrı branch-da ayrılır: hazır olduqda filiallar arasında geri və irəli keçə bilərsiniz.
Və siz bunların hamısını sadə branch
, checkout`və `commit
əmrləri ilə etdiniz.
![Fərqli tarix](png/advance-master.png)
Bunu git log
əmri ilə də asanlıqla görə bilərsiniz.
git log --oneline --decorate --graph --all
işlədirsinizsə,branch-larınızın harada olduğunu və tarixinizin necə ayrıldığını göstərən əmrlərinizin tarixini çap edəcəkdir.
$ git log --oneline --decorate --graph --all
* c2b9e (HEAD, master) Made other changes
| * 87ab2 (testing) Made a change
|/
* f30ab Add feature #32 - ability to add new formats to the central interface
* 34ac2 Fix bug #1328 - stack overflow under certain conditions
* 98ca9 initial commit of my project
Git-dəki bir branch, əslində, işarələdiyi 40 simvol SHA-1 çeki olan sadə bir fayl olduğundan, branch-lar yaratmaq və məhv etmək asan və ucuzdur. Yeni bir filial yaratmaq, 41 baytı bir fayla yazmaq qədər sürətli və sadədir (40 simvol və yeni bir xətt).
Bu, ən köhnə VNS alətlər şöbəsinin, layihənin bütün sənədlərinin ikinci qovluğa kopyalanmasını özündə cəmləşdirən yoldan kəskin şəkildə fərqlidir. Layihənin ölçüsündən asılı olaraq bu bir neçə saniyə və ya hətta dəqiqə çəkə bilər, halbuki Git-də proses həmişə ani olur. Ayrıca, valideynlərimizi etdiyimiz zaman qeyd etdiyimiz üçün birləşmə üçün uyğun bir birləşmə bazası tapmaq avtomatik olaraq bizim üçün edilir və ümumiyyətlə bunu etmək çox asandır. Bu xüsusiyyətlər inkişaf etdiriciləri tez-tez filial yaratmağa və istifadə etməyə həvəsləndirməyə kömək edir.
Görək niyə belə etməlisiniz.
Note
|
Yeni bir branch yaratmaq və eyni zamanda ona keçid
Yeni bir branch yaratmaq və eyni zamanda yeni branch-a keçmək istəmək tipikdir - bu bir əməliyyatla with |