Programlama

Git ve GitHub temelleri

Git, kendi bilgisayarınızda çalışan ve siz söylediğiniz her seferinde projenizin tarihli bir anlık görüntüsünü bir notla birlikte saklayan, sonra da o görüntülerin herhangi birine dönmenize izin veren bir programdır. GitHub ise bu tarihçenin bir kopyasını koyabileceğiniz yerlerden biridir; Git internetsiz ve hesapsız da eksiksiz çalışır.

  • Ders 9 / 14
  • Başlangıç
  • Ücretsiz, kayıt yok

Bir değişikliğin yaşamı: düzenlemeden tarihçeye

  1. 1

    Dosyayı düzenle

    Git henüz hiçbir şey yapmadı. Değişiklik diskte, tarihçede değil.

  2. 2

    git add

    Bu anlık görüntüye neyin gireceğini seçersiniz. Genelde unutulan adım budur.

  3. 3

    git commit

    Anlık görüntü tarih, ad ve bir mesajla kaydedilir. Buradan sonra geri alınabilir.

  4. 4

    git push

    Tarihçenin bir kopyası bir barındırıcıya da iner. Ağ gerektiren tek adım budur.

  5. 5

    git log

    Her anlık görüntü tarihi ve mesajıyla geri gelir. İyi bir mesajın ne değerde olduğu burada anlaşılır.

Bu sıra, tek dalda tek kişi içindir. Takım çalışması pull, merge ve çakışma çözümünü ekler; bu ders onları kapsamaz.

Son kontrol: Bu dersteki bilgiler ve araç adları bu tarihte kaynaklarıyla yeniden doğrulanır.

Klasörü kopyalamanın çözmediği neyi git çözer?

Git öncesi yöntemi herkes gördü: site, site-final, site-final-2 ve kimsenin silmeye cesaret edemediği o klasör. Sorun çirkin olması değil; o klasörlerin hiçbirinin neden yapıldığını ya da hangi dosyaların birlikte değiştiğini söylememesi.

Git bir sürüm kontrol sistemidir: birkaç tam kopya tutmak yerine, projenin durumunu sizin seçtiğiniz noktalarda kaydeder. Her nokta bir committir ve kopyalanmış bir klasörün asla taşımadığı üç şeyi taşır: kesin tarih ve saat, kaydeden kişinin adı ve değişikliğin neden yapıldığını söyleyen bir mesaj.

Git'in asıl değeri de o üçüncü şeydedir. Altı ay sonra anlamını çıkaramadığınız bir satıra geldiğinizde sorunuz bu satır nereden geldi olmaz; biri bunu neden yaptı olur. Git tam da bu soruyu yanıtlar, yeter ki mesajları ciddiye alarak yazmış olun. "değişiklikler" ve "düzeltme" dolu bir tarihçe, final-2 klasörü kadar işe yaramazdır.

Ve diğerlerinden önce işinize yarayacak pratik bir fark: git, iki nokta arasında tam olarak hangi satırların değiştiğini görmenizi sağlar. Dün çalışan bir site bugün bozuksa, bu bir konfor özelliği değil, nedeni saatler yerine dakikalar içinde bulmanın tek yoludur.

Git ile GitHub aynı şey değildir

Git, kendi bilgisayarınıza kurulan ve işi tarihçe tutmak olan bir programdır. GitHub ise bu tarihçeleri sunucularında barındıran ve etraflarına başka şeyler kurmuş bir şirkettir: profil sayfaları, hata takibi, kod incelemesi ve gerisi. Biri araç, öteki hizmet; kabaca kelime işlemcinin e-postaya oranı gibi.

Bu ayrımın, eğitimlerde genelde kaybolan önemli bir sonucu var: git dağıtıktır, yani bilgisayarınızda sunucuya bir işaretçi değil, tarihçenin tam bir kopyası durur. Gün boyu commit atabilir, tarihçeyi okuyabilir ve geriye dönebilirsiniz; bir kez bile internete bağlanmadan. push yalnızca aynı tarihçenin bir kopyasını başka bir yere de koyar.

Yani o barındırıcı yarın erişilemez olursa, makinenizdeki depo eksilmez ve onu başka herhangi bir yere gönderebilirsiniz: GitLab, kişisel bir sunucu, hatta bir harici disk. Barındırıcıyla birlikte kaybolan şey, hata kayıtları, birleştirme istekleri ve altlarındaki tartışmalardır; çünkü onlar git'in içinde değil, o şirketin kendi ürünüdür.

İran'daki okur için pratik bir cümle: yabancı barındırma hizmetlerine erişilip erişilemediği, o gün kendinizin denemesi gereken bir şeydir ve bugüne dair bir iddiayı buraya yazmıyoruz. Doğru karar bundan bağımsız zaten: tarihçeyi, bir hizmet ortadan kalkarsa işinizi durdurmayacak bir yerde tutun. Bu, git'in doğasına uyar ve hiçbir hizmete bağlı değildir.

Tarihçe nerede yaşar? Her iki bilgisayarda

Sizin bilgisayarınız

  • Tarihçenin tam kopyası, işaretçi değil
  • Commit internetsiz çalışır
push ve pull: iki taraf da tüm tarihçeyi tutar

Bir ekip arkadaşının bilgisayarı

  • O da aynı tam tarihçeyi tutar
  • Her biriniz bağımsız çalışır, sonra eşitlersiniz

Barındırıcı yalnızca bir kopyadır, tarihçenin sahibi değil

GitHub ya da başka bir barındırıcı

  • Eşitlemek için ortada paylaşılan bir kopya
  • Hata kaydı, kod incelemesi ve profil onun kendi eklemeleridir

Barındırıcı erişilemez olursa kod tarihçesi sağlamdır ve başka bir yere push edilebilir. Barındırıcıyla giden şey, hata kayıtları ve kod incelemeleridir; çünkü onlar git'in içinde değildir.

İlk dört komut ve add aslında ne işe yarar

Bir projeyi git init ile git'in gözetimine alırsınız. Bu komut .git adlı gizli bir klasör oluşturur ve o andan sonra o klasörde olan her şey kaydedilebilir hale gelir. Henüz hiçbir şey kaydedilmedi; yalnızca defter açıldı.

git init
git add index.html
git commit -m "first page with contact form"
git push origin main

Yeni başlayanları şaşırtan komut addtir, çünkü gereksiz bir fazladan adım gibi görünür. Değildir. Dosyalarınızla tarihçe arasında hazırlık alanı denen bir ara masa vardır ve add "bunu masaya koy, bir sonraki anlık görüntüde olsun" demektir. Bugün değiştirdiğiniz on dosyadan yalnızca tek bir işe ait üçünü tek bir commit'te kaydetmenizi sağlayan şey o masadır.

İlk profesyonel alışkanlık burada oluşur: bir commit bir iş olmalı. Commit mesajında "ve" demek zorunda kalıyorsanız, muhtemelen iki commit olmalıdır. Bu bir zevk meselesi değil; bir değişikliği geri almak istediğiniz ve o değişikliğin başka iki işle aynı commit'e karıştığı gün bedelini ödersiniz.

Dördü içinde ağa ihtiyaç duyan tek komut pushtur. İlk üçü tamamen kendi makinenizde çalışır. Bunu akılda tutarsanız git'in hata mesajları da anlam kazanır: erişim ve kimlik doğrulama hatası neredeyse her zaman push ile ilgilidir, "kaydedilecek bir şey yok" ise neredeyse her zaman add yaptığınızı unuttuğunuz anlamına gelir.

İlk bozulan şey: asla işlenmemesi gereken bir dosya

Projenin kökündeki .gitignore adlı dosya, git'e neye dokunmayacağını söyler. İçinde her zaman üç kategori bulunur: yeniden kurulabilen bağımlılık klasörü, derleme sırasında üretilen dosyalar ve gerçek bir parola ya da anahtar taşıyan her şey.

İnsanların yara aldığı yer üçüncü kategoridir. Veritabanı parolasını içeren bir ayar dosyası bir kez işlenir, sonra biri fark eder, parolayı dosyadan çıkarır ve yeni bir commit atar. İş bitmiş değildir: git tarihçeyi saklar ve o parola hâlâ önceki commit'in içindedir, tek bir basit komutla görünür.

GitHub'ın kendi kılavuzu da aynısını söylüyor: böyle bir şeyden sonra o kimlik bilgisini yanmış saymalı ve değiştirmelisiniz; dosyayı tarihçeden çıkarmak tek başına yeterli değildir. Doğru sıra da insanın beklediğinin tersidir: önce parolayı değiştirin, sonra tarihçeyi temizlemeyi düşünün.

Yani ilk günden edinmeye değer alışkanlık şu: .gitignore dosyasını ilk commit'ten sonra değil, ondan önce yazın. Proje bir ayar örneği gerektiriyorsa, boş değerlerle config.example gibi bir dosya bırakın; böylece sonraki kişi neyin gerektiğini bilir ve hiçbir gerçek değer hiçbir yere kaydedilmez.

Depoya ne girer, ne girmezörnek, tam liste değil

Bunlar işlensin

  • Projenin kendi kodu ve metin dosyaları
  • Bağımlılık kilit dosyası, herkes aynı sürümü kursun diye
  • Boş değerli bir ayar örneği
  • gitignore dosyasının kendisi

Bunlar asla işlenmesin

  • Gerçek parola ya da anahtar içeren ayar dosyası
  • Tek komutla yeniden kurulan bağımlılık klasörü
  • Derleme çıktısı ve üretilmiş dosyalar
  • Veritabanı yedekleri ve kullanıcı yüklemeleri

Bu dosya yalnızca henüz işlenmemiş olanı durdurur. Bir kez işlenmiş bir dosya, bu listeye eklenmekle tarihçeden çıkmaz.

Bu dersin üzerinde yazıldığı site git'te değil

rgb.ir canlı bir sunucuda düzenleniyor ve bir git deposu yok. Bunu yazıyoruz, çünkü yalnızca öğüt veren ve kendisinin nerede durduğunu söylemeyen bir ders gerçeğin yarısıdır.

Peki git'in yerini ne aldı? Tema için yazdığımız düzenleyici, her kaydetmeden önce dosyanın bir kopyasını tarih ve saatle adlandırıp bir kenara koyuyor ve her dosyanın son yirmi sürümünü saklıyor. Sonra yeni dosyayı token_get_all ve TOKEN_PARSE bayrağıyla ayrıştırıyor; çünkü bu sunucuda hem php -l hem proc_open kapalı ve olağan sözdizimi denetimi kullanılamıyor. Yeni dosya ayrıştırılamazsa, canlı sayfa düşmesin diye o önceki kopya otomatik geri yükleniyor.

Bu, bir sürüm sisteminin asgari tanımına yakındır ve işini iyi yapar. Ama git'ten farkı tam da bu dersin konusu olan şeydir: o yirmi kopyanın hiçbiri neden kaydedildiğini söylemez, birlikte değişen iki dosyayı hiçbir şey birbirine bağlamaz ve yirmi birinci sürümden sonra geriye bir şey kalmaz.

Yani projeniz henüz git'te değilse, bu ders bir azar değil. Yalnızca bedelini bilin: git'in olmaması, her şeyin çalıştığı gün hiçbir şeye mal olmaz; çalışmadığı gün ise faturanın tamamını bir kerede keser.

Yapay zekayla hızlı yol

Profesyonellerin 2026'da yapay zeka ve git ile yaptığı şey, modele komut çalıştırma izni vermek değil; tam tersi. Kaydedilmek üzere olan değişiklikleri ona gösterir ve commit'ten önce üç şey istersiniz: birbiriyle ilgisiz işleri karıştırdım mı, burada parolaya benzeyen bir şey var mı ve "ne" değil "neden" diyen bir commit mesajı. İkinci madde, bu reçeteyi sıradan bir commit mesajı isteğinden ayıran şeydir ve değerin çoğu oradadır.

  1. Klasörün tamamını eklemek yerine, masaya neyin gideceğini <code>git add -p</code> ile parça parça seçin. Bu tek komut, bu işteki hataların yarısını daha oluşmadan siler.
  2. The <code>git diff --staged</code> çıktısını alıp aşağıdaki reçeteyle gönderin. Önce birinci ve ikinci maddelerin yanıtlarını okuyun, sonra mesaja geçin.
  3. Anahtara ya da parolaya benzeyen bir şey listelenirse tam orada durun: <code>git restore --staged</code> ile masadan alın, dosyayı gitignore'a koyun ve değer gerçekse onu değiştirin.
  4. Mesajı modelin taslağından alın ama kendiniz yeniden yazın. Model neyin değiştiğini diff'ten okur, ama nedenini yalnızca siz bilirsiniz ve altı ay sonra işe yarayan kısım odur.

Kopyalamaya hazır şablon

Bu, git diff --staged çıktısıdır.

{diff çıktısı}

Şu üç şeyi bu sırayla ver:

1. Bu değişiklikler birbiriyle ilgisiz birden fazla iş içeriyorsa, hangi satırların hangi işe ait olduğunu söyle ve ayrı commit'lere nasıl bölüneceğini öner.
2. Parolaya, anahtara, token'a, iç adrese ya da gerçek müşteri verisine benzeyen her şeyi listele. Hiçbiri yoksa bunu açıkça yaz.
3. Bir commit mesajı yaz: ilk satır en fazla elli karakter ve emir kipinde, sonra boş bir satır, sonra "ne" değil "neden" diye açıklayan iki ila dört satır.

Çalıştırmam için hiçbir git komutu yazma. Yanıt için bu diff'te olmayan bir koda ihtiyacın varsa, hangisi ve neden olduğunu söyle; tahmin etme.

Çıktıya güvenmeden önce: Bu reçetenin aşmadığı iki sınır. Birincisi, model yalnızca o diff'i görür: değişikliğiniz projenin başka bir yerinde bir şeyi bozuyorsa bu çıktıda izi olmaz ve bilmenin tek yolu programı çalıştırmaktır. İkincisi, bir diff göndermek kodunuzu başka bir şirkete göndermek demektir; proje bir müşteriye aitse önce iznini alın ve o hizmetin kendi veri kullanımı sayfasını okuyun. Reçetenin son satırı da süs değil: açıklayamadığınız bir git komutu çalıştırılmaz.

Bu işte yapay zeka

Git ve yapay zeka konusundaki tutumumuz açık: modeli deponuzu işleten değil, metni okuyup yazan rolde tutun. Commit mesajı taslağı, uzun bir diff'i özetlemek ve eski bir commit'in ne yaptığını açıklamak, modellerin gerçekten iyi yaptığı ve size zaman kazandıran üç iştir. Komut çalıştırmak ise ayrı bir mesele ve nedenini risk bölümü söylüyor.

Gerçekten işe yarayan araçlar

  • Claude Code Terminalde deponun yanında durur, yani diff'i elle kopyalamak yerine kendisi okur. "Bu commit ne yaptı" ve "bu satır neden burada" soruları için bu listedeki en iyi seçenek. Ücretsiz kurulur ama bir Claude aboneliği ya da Anthropic Console hesabı olmadan çalışmaz ve İran, Anthropic'in desteklenen ülkeler listesinde yok.
  • Claude Yukarıdaki reçete için bir sohbet penceresi yeter: diff'i yapıştırır ve üç maddeyi alırsınız. İran, Anthropic'in iki desteklenen ülke listesinin hiçbirinde yok; bunu ağ testiyle değil, Anthropic'in kendi sayfasında okuduk.
  • Gemini Commit mesajı ve diff özeti için hızlı ve ucuz bir model yeter, yeri de burasıdır; birbiriyle ilgisiz iki işin karıştığını fark etmek içinse daha güçlü bir model daha iyi yanıt verir. Google'ın kendi sayfası Gemini web uygulamasının 230'dan fazla ülke ve bölgede çalıştığını söylüyor ve İran o listede yok.

Nerede geri teper

Buradaki asıl risk araçlar değil, belirli bir komut sınıfıdır. Git işlemlerinin çoğu geri alınabilir, ama üçü değildir ve modeller tam da o üçünü tam bir güvenle önerir: git'in kendi belgelerine göre çalışma ağacındaki işlenmemiş değişiklikleri atan git reset --hard, izlenmeyen dosyaları silen git clean -fd ve sunucudaki dalı sizin sürümünüzle değiştirip başkasının işini silebilen git push --force. Kural basit: açıklayamadığınız bir komut çalıştırılmaz ve bu üçünden herhangi birinden önce bir git status alın.
İkinci risk çalıştırmaya değil yapıştırmaya aittir: bir sohbete koyduğunuz her diff ya da dosya makinenizden çıkmıştır ve ona ne olacağı o hizmetin planına ve ayarlarına bağlıdır ve kendi veri kullanımı sayfasında yazılıdır. Kişisel bir proje için mesele değil; müşteri kodu için önce izin gerekir. Bu araçların İran'dan nasıl ödenebileceği için satın alma rehberine, kodlama modelleri arasındaki güncel tercihimiz için kodlama için en iyi yapay zeka sayfasına bakın.

Kaynaklar: git-scm: git reset git-scm: git clean git-scm: git push, the force option Anthropic: supported countries Google: where the Gemini web app is available

Bu tavsiyenin sınırı

Bu ders tek dalda tek kişiyi kapsar. Takım çalışmasının eklediği her şey dışarıda kaldı ve her biri kendi dersini istiyor: dallanma, birleştirme ve çakışma çözümü, rebase, kod incelemesi ve birleştirme istekleri, ve git'in kendisi için yapılmadığı büyük dosyalar. Daha az söylenen daha büyük bir sınır da var: git metin dosyaları için yapılmıştır ve projenizde değişen şey dosyalarda değil bir veritabanında yaşıyorsa git onu görmez. Bir WordPress sitesi tam da bu biçimdedir; tema için git'e sahip olmanın tek başına sitenin yedeği sayılmamasının nedeni de budur.

Kendi işimizden

Bu sitenin kendisinin bir git deposu yok ve canlı bir sunucuda düzenleniyor. Yerini alan şey kendi tema düzenleyici eklentimiz: her kaydetmeden önce dosyanın bir kopyasını tarih ve saat artı altı rastgele karakterle adlandırıp bir kenara koyuyor, her dosyanın son yirmi sürümünü saklayıp eskisini siliyor ve iki yüz satırla sınırlı bir olay günlüğü tutuyor. Yazdıktan sonra yeni dosyayı token_get_all ve TOKEN_PARSE bayrağıyla ayrıştırıyor, çünkü bu sunucuda hem php -l hem proc_open kapalı; ayrıştırılamazsa o önceki kopya otomatik geri yükleniyor. Bu, sürüm sistemi denen şeyin asgarisine yakındır ve git'ten uzaklığı tam olarak üç şeydir: nedenini söyleyen bir mesaj, birlikte değişen iki dosya arasındaki bağ ve yirmi sürümle sınırlı olmayan bir tarihçe.

Gerçek devam soruları

Tek kişilik bir proje için git gerekir mi?

Evet, ama genelde söylenen nedenle değil. Neden yedekleme değil, çünkü yedek almanın daha basit yolları var; neden şu: altı ay sonra bir satırın neden yazıldığını çözmesi gereken tek kişi sizsiniz. O sorunun yanıtını saklayan şey git'tir.

git pull ile git fetch arasındaki fark nedir?

fetch, sunucudaki değişiklikleri işinize dokunmadan getirir; böylece önce bakabilirsiniz. pull aynısını yapar ve hemen dalınıza birleştirir. Emin değilseniz önce fetch yapın.

Commit mesajını yanlış yazdım, değiştirebilir miyim?

Henüz push etmediyseniz, git commit --amend son commit'in mesajını değiştirir ve iş biter. Push ettiyseniz bu tarihçeyi yeniden yazar ve o dalı almış herkese sorun çıkarır; paylaşılan bir depoda yanlış mesajı olduğu gibi bırakmak daha iyidir.