Hər bir developer gec-tez bu suallarla üzləşir: "dünən nəyi dəyişdim ki, hər şey sındı?", "keçən həftə işləyən versiyanı necə geri qaytarım?", "iki nəfər eyni layihə üzərində necə işləsin ki, bir-birinin işini silməsin?". Bu suallara versiya nəzarəti sistemi (Version Control System, VCS) cavab verir — layihədəki bütün dəyişikliklərin tarixçəsini saxlayan proqram. Bu gün sənayenin standartı Git-dir: onu demək olar ki, bütün şirkətlər istifadə edir və onunla işləmək bacarığı istənilən müsahibədə yoxlanılır.

"final_v2_final" problemi

Versiya nəzarəti olmadan layihə qovluğu zaman keçdikcə belə görünməyə başlayır:

text
my-site/
├── index.html
├── index_old.html
├── index_backup_12_09.html
├── index_final.html
├── index_final_v2.html
├── index_final_v2_FINAL.html
└── index_final_v2_FINAL_Murad_fixes.html

Hansı versiyanın aktual olduğu, nüsxələrin bir-birindən nə ilə fərqləndiyi, dəyişikliyi kimin və nə üçün etdiyi bəlli deyil. Yalnız vaxtında çıxarmağı unutmadığınız nüsxəyə qayıtmaq olar, iki nəfər işləyəndə isə arxivləri bir-birinə göndərmək və başqasının dəyişikliklərini əl ilə köçürmək lazım gəlir.

Versiya nəzarəti sistemi bu problemi başqa cür həll edir: qovluqda tək bir index.html qalır, tarixçə isə ayrıca saxlanılır. Tarixçədə saxlanmış hər nöqtə commit adlanır. Commit faylların vəziyyətini, müəllifi, tarixi və mesajı — nəyin və nə üçün dəyişdirildiyini saxlayır:

text
Commit 3   Aysel   12.09   "Əlaqə formasını əlavə et"
Commit 2   Murad   10.09   "Mobil menyunu düzəlt"
Commit 1   Aysel   08.09   "Saytın strukturunu yarat"

Layihə bütün tarixçəsinin bazası ilə birlikdə repozitori (repository, "repo") adlanır.

Lokal, mərkəzləşdirilmiş və paylanmış sistemlər

Lokal VCS-lər (məsələn, RCS, 1982-ci il) tarixçəni bir kompüterdə saxlayırdı: birgə işləmək çətin idi, diskin sıradan çıxması isə hər şeyi məhv edirdi.

Mərkəzləşdirilmiş sistemlər (CVS, SVN, Perforce) bütün tarixçəni bir serverdə saxlayır, developerlər isə oradan faylların yalnız cari versiyasını alırlar. Şəbəkə olmadan nə dəyişikliyi tarixçəyə yazmaq, nə də ona baxmaq olur; server əlçatan deyilsə, bütün komanda dayanır. SVN (Subversion) hələ də köhnə korporativ layihələrdə və oyun sənayesində rast gəlinir.

Paylanmış sistemlər (Git, Mercurial) hər developerə bütün tarixçə ilə birlikdə repozitorinin tam nüsxəsini verir. Commit etmək, tarixçəyə baxmaq və branch yaratmaq internetsiz mümkündür, server isə yalnız dəyişiklikləri mübadilə etmək üçün lazımdır. Server itərsə, tarixçəni komandanın istənilən üzvünün kompüterindən bərpa etmək olar.

text
 Mərkəzləşdirilmiş (SVN)                Paylanmış (Git)

       [ Server ]                           [ Server ]
       (tarixçə)                            (tarixçə)
      /    |     \                         /    |     \
[Aysel] [Murad] [Leyla]              [Aysel]  [Murad]  [Leyla]
fayllar fayllar fayllar              tarixçə  tarixçə  tarixçə
                                     +fayllar +fayllar +fayllar

Fərqlər siyahısı əvəzinə snapshot-lar

Bir çox köhnə sistemlər faylın ilk versiyasını və sonra ona edilən dəyişikliklər zəncirini saxlayır. Git isə snapshot-larla (anlıq görüntülərlə) düşünür: hər commit zamanı bütün layihənin necə göründüyünü yadda saxlayır. Yer itirməmək üçün dəyişməmiş fayllar kopyalanmır — yeni snapshot sadəcə artıq saxlanmış versiyaya istinad edir.

text
             index.html     style.css     app.js
Commit 1  →  index v1       style v1      app v1
Commit 2  →  index v2       style v1 ↺    app v1 ↺
Commit 3  →  index v2 ↺     style v2      app v1 ↺

↺ — fayl dəyişməyib: Git onu kopyalamır, saxlanmış versiyaya istinad edir

Buna görə layihənin istənilən versiyasını tam və sürətlə əldə etmək olar, hər snapshot isə 9d03f5a… kimi yoxlama cəmi — hash ilə qorunur: məlumat zədələnərsə, Git bunu görəcək. Təfərrüatlar "Git daxildən" bölməsindədir.

Git GitHub deyil

Git sizin kompüterinizdə işləyən proqramdır. Onu 2005-ci ildə Linus Torvalds Linux nüvəsinin hazırlanması üçün yaradıb. Git pulsuz və açıq mənbəlidir, internetsiz və hesabsız işləyir.

GitHub, GitLab və Bitbucket Git repozitorilərinin nüsxələrinin saxlandığı onlayn servislərdir (hostinqlər). Onlar komandalar üçün alətlər əlavə edir: pull request-lər, code review, tapşırıqlar (issues), CI/CD.

AlətNədirƏsas təyinatı
Gitkompüterinizdəki proqramtarixçə, commit-lər, branch-lar
GitHubveb-servis (Microsoft-a məxsusdur)hostinq, pull request-lər, GitHub Actions, open source
GitLabveb-servis, öz serverinizdə də qurmaq olarhostinq, daxili CI/CD
BitbucketAtlassian şirkətinin veb-servisihostinq, Jira ilə inteqrasiya

Bənzətmə: Git layihənin şəklini çəkən fotoaparatdır, GitHub isə bu şəkillərin komanda ilə müzakirə olunduğu bulud albomudur. Şəkil çəkmək albomsuz da mümkündür.

💡 "Git-in GitHub-dan fərqi nədir?" sualı müsahibələrdə tez-tez verilir. Qısa cavab: Git versiya nəzarəti alətidir, GitHub isə repozitorilərin saxlanması və Git əsasında birgə iş üçün servisdir.

Zaman maşını kimi layihə tarixçəsi

Kiçik real layihənin tarixçəsi terminalda belə görünür (əmrləri sonra öyrənəcəyik, hələlik sadəcə nəticəyə baxın):

bash
git log --oneline
text
e41b7c2 (HEAD -> main, origin/main) Merge pull request #12 from aysel/contact-form
9d03f5a Validate contact form fields
6ab2e18 Add contact form
3c7f9e0 Fix mobile menu overlap
b58d41a Add course cards section
71e2c9d Add header and navigation
0f3a6b4 Initial commit: project structure

Hər sətir bir commit-dir, yeniləri yuxarıdadır. Solda qısa hash (unikal identifikator), sağda mesaj yazılıb. HEAD -> main hazırda harada olduğunuzu, origin/main isə serverdə hansı vəziyyətin olduğunu göstərir. İstənilən commit-i açıb orada məhz nəyin dəyişdiyini görmək olar:

diff
 <nav class="menu">
-  <a href="#about">About</a>
+  <a href="#about">About us</a>
+  <a href="#contact">Contact</a>
 </nav>

- ilə başlayan sətirlər silinib, + ilə başlayanlar əlavə olunub — bu görünüş diff adlanır. Tarixçə sayəsində faylı istənilən vəziyyətə qaytarmaq və xətanın hansı commit-də yarandığını tapmaq olar.

Dəyişikliyin yolu: redaktədən main-ə qədər

Komandada hər dəyişiklik eyni yolu keçir (hər addıma kursda ayrıca mövzular həsr olunub):

text
1. Redaktə        faylları redaktorda dəyişirsiniz
      ↓
2. Commit         snapshot-u lokal repozitorinizdə qeydə alırsınız
      ↓
3. Push           commit-ləri serverə göndərirsiniz (məsələn, GitHub-a)
      ↓
4. Pull request   komandadan dəyişiklikləri yoxlamağı xahiş edirsiniz
      ↓
5. Merge          code review-dan sonra dəyişikliklər əsas main branch-ına düşür

1–2-ci addımlar yalnız sizin kompüterinizdə baş verir: push-a qədər həmkarlarınız commit-lərinizi görmür. Pull request Git-in özünün deyil, hostinqin funksiyasıdır (GitLab-da — merge request): orada həmkarlar kodu müzakirə edir və birləşdirmə düyməsini basırlar.

Tipik səhvlər

  1. "Git və GitHub eyni şeydir". Git tamamilə lokal, hesabsız və internetsiz işləyir. GitHub repozitorinin nüsxəsini göndərmək mümkün olan yerlərdən sadəcə biridir.
  2. "Versiya nəzarəti yalnız komandalara lazımdır". Tək işləyəndə də Git təhlükəsiz eksperiment etməyə və uğursuz dəyişiklikləri geri qaytarmağa imkan verir, açıq repozitorilər isə portfolionun bir hissəsidir.
  3. "Commit etdim — deməli, kod təhlükəsizdir". Serverə göndərilənə qədər commit yalnız sizin diskinizdə saxlanılır. Noutbuk push-dan əvvəl xarab olsa, commit-lər də itəcək.
  4. Repozitoridə hər şeyi saxlamaq. Parollar, .env, node_modules və böyük videolar Git-ə qoyulmur: tarixçə hər şeyi əbədi yadda saxlayır (ətraflı — .gitignore mövzusunda).
  5. Həftədə bir nəhəng commit. Zaman maşını yalnız tarixçədə dayanacaqlar olduqda işləyir. Kiçik, məntiqli addımlarla commit edin.

Xülasə

  • Versiya nəzarəti sistemi dəyişikliklərin tarixçəsini saxlayır: kim, nə vaxt, nəyi və nə üçün dəyişib.
  • Commit müəllifi, tarixi və mesajı olan saxlanmış layihə snapshot-udur; repozitori bütün tarixçəsi ilə birlikdə layihədir.
  • Mərkəzləşdirilmiş sistemlər (SVN) tarixçəni serverdə, paylanmış sistemlər (Git) isə hər developerdə saxlayır.
  • Git bütün layihənin snapshot-larını saxlayır, dəyişməmiş faylları isə təkrarlamır.
  • Git kompüterinizdəki proqramdır; GitHub, GitLab və Bitbucket komandalar üçün alətləri olan hostinqlərdir.
  • Dəyişikliyin tipik yolu: redaktə → commit → push → pull request → main-ə merge.

Praktika

  1. Kompüterinizdə "final", "kopiya", "old" kimi faylları olan qovluq tapın. Bu mövzudakı problemlərdən hansılarla artıq qarşılaşdığınızı yazın.
  2. GitHub-da məşhur açıq layihəni açın (məsələn, vuejs/core) və commit-lər siyahısına keçin. Son commit-in müəllifini, tarixini və mesajını tapın, onu açıb diff-ə baxın.
  3. Üç developerdən ibarət komanda üçün mərkəzləşdirilmiş və paylanmış sistemin sxemini çəkin. Yazılı cavab verin: server bir sutkalıq sıradan çıxsa, hər halda nə baş verəcək?
  4. Dostunuzla Bakıdakı kafe üçün lendinq hazırlayırsınız. "Menyu blokunu əlavə et" dəyişikliyinin redaktorunuzdan main branch-ına necə çatdığını 5–7 addımda təsvir edin və bu sözlərdən istifadə edin: commit, push, pull request, code review, merge.

💡 Git-in rəsmi saytındakı pulsuz Pro Git kitabı bütün kurs boyu əla məlumat mənbəyidir.