Git kullanırken yaptığımız değişiklikler otomatik olarak kaydedilmez. Git versiyonlama sistemi değişikliği kalıcı hale (commit) getirmek için bizden dosyalarımızı seçmemizi ister.

git add komutu bu değişikleri bildirmek için kullanılır. Bu komut ile bilgisayarımızdaki dosyalar (Git terminolojisiyle Working Tree) kaydedilmeden önceki yer olan Staging Area'ya taşınır. Bu kavramı daha iyi anlamak için ilgili yazımıza göz atabilirsiniz: Staging Area nedir? Ama burada da kısaca bahsetmemiz gerekiyor;

Git'in Üç Aşamalı Yapısı Vardır

  • Working Tree (Çalışma Dizini): Kısaca projemiz, yani dosyalarımız üzerinde çalıştığımız alana verilen addır.
  • Staging Area (Hazırlık Alanı): Sürümlenecek olan dosyaların bekletildiği tampon bölgedir. git add ile bu alana dosyalarımızı taşırız.
  • Repository ya da kısaca Repo: Değişikliklerin kalıcı olarak mühürlendiği alandır (git commit ile).
Git'in Üç Aşamalı Yapısı

Bunu basit bir örnekle açıklayacak olursak;

  • Working Tree: Evin içi. Eşyalarımız (dosyalar) dağınık halde duruyor. Bazılarını değiştirdik bazılarını yeni aldık.
  • Staging Area: Açık bir kargo kutusu olarak düşünün.
  • git add komutu: Evdeki eşyaları seçip kargo kutusuna koyma eylemi (sadece paketlemek istediklerimizi kutuya koyarız değil mi?).
  • git commit komutu: Kutunun kapağını kapatıp, bantlayıp üzerine "kışlık kıyafetler" gibi bir etiket yapıştırma eylemidir.

Yani git add kutuyu kapatmaz. Sadece kutunun (Staging Area) içine eşya koymaya yarar. Kutuyu kapatana kadar içine git add ile eşya ekleyebilir veya git restore --staged ile çıkartabiliriz. Eğer ne koyduğumuzu hatırlamıyorsak git status ile listeye bakabiliriz.

Değişiklikleri Staging Area'ya aldıktan sonra aynı dosyada değişiklik yapsak bile otomatik olarak bu tampon bölge güncellenmez. Aynı dosyalar için bile olsa git add komutu ile yeniden eklememiz gerekir.

Git Add Komutunun Parametreleri Nelerdir?

Aşağıda bu komutun parametreleri en sık kullanımdan en az kulanıma göre listelenmiştir.

Git Add . (nokta)

Ne yapar: Bulunduğu dizin ve alt dizinlerindeki bulduğu her şeyi yeni, değiştirilmiş ve silinmiş dosyaları Staging Area'ya ekler. Untracked (yeni) dosyaları da kapsar.

Neden kullanılır: Yaptığımız tüm değişiklikleri tek seferde eklemek için kullanırız.

Git Add "dosya_adi" "dosya_adi"

Ne yapar: Sadece adını ve yolunu belirttiğimiz dosyaları Staging Area'ya taşır. Birden fazla dosyanın arasında boşluk bırakılır.

Neden kullanılır: Sadece belirli bir özelliği veya hata düzeltmesini (bozduğumuz yerleri) commitlemek istediğimizde (örn: git add index.html style.css).

Git Add *.uzantı (Filtreleyerek Ekleme)

Ne yapar: Sadece belirli uzantıya sahip dosyaları ekler. Örn: git add *.css sadece stil dosyalarını hazırlar.

Neden kullanılır: Projede hem kod hem görsel değişikliği yaptıysanız ama sadece kodları göndermek istiyorsanız hayat kurtarır.

Git Add -A veya Git Add --all

Ne yapar: Ne varsa yoksa ekle! Projenin hangi klasöründe olursak olalım tüm Working Tree'deki eklenmiş, yeni ve silinmiş dosyaları tampon bölgeye taşır. Untracked (yeni) dosyaları da kapsar.

Neden kullanılır: Git Add komutuna çok benzer ama sadece bulunduğu dizini değil tüm projeyi kapsar.

Git Add . ile Git Add -A Arasındaki Fark Nedir?

Aralarındaki temel fark, "bulunulan dizin" vs "tüm proje" ayrımıdır. Aklınızda bulunması adına Git 2.0 sürümünden önce git add . komutu silinen dosyaları kapsamazdı. Ancak güncel sürümlerde iki komutta silinin dosyaları kapsar.

Git Add -u veya Git Add --update

Ne yapar: Sadece ama sadece halihazırda takip edilen (daha önce commitlenmiş) dosyalardaki değişiklik ve silinenleri (eklenen yok) ekler. Yeni oluşturulan ve untracked olan dosyaları Staging Area'ya taşımaz.

Neden kullanılır: Projeye deneme amaçlı yeni dosyalar ekledik diyelim. ama bunları commit'e dahil etmek istemiyorsak sadece mevcut dosyaları Staging Area'ya taşımak için kullanılır.

"Eğer projenin en üst klasöründeysek (root), bu iki komut aynı işi yapar." Fark sadece bir alt klasörün (örneğin /css klasörü) içindeyken ortaya çıkar.

Git Add -p veya Git Add --patch (parça parça interaktif ekleme)

Ne yapar: Dosyalardaki değişiklikleri bize parça parça gösterir ve bu kısmı ekleyeyim mi? (y/n) diye sorar.

Neden kullanılır: Özellikle deneyimli geliştiriciler ve kod incelemesi (review) kültürünün katı olduğu takımlarda koda ne eklendiğini satır satır gözden geçirmek ve aynı dosya içindeki farklı değişiklikleri ayrı ayrı commitlere bölmek için kullanılır.

Git Add -f veya Git Add --force

Ne yapar: .gitignore dosyasındaki kurallara takılarak git tarafından görmezden gelinen dosyaları zorla ekler.

Neden kullanılır: Şöyle düşünelim, bir log veya ayar dosyası var. .ignore dosyasına eklenmiş biz ise istisna olarak eklemek istiyoruz ama .ignore dosyasını değiştirmek istemiyoruz. Bu durumda zorbalıkla ekliyoruz.

Git Add -i veya Git Add --interactive (etkileşimli mod)

Ne yapar: Terminalde menü tabanlı bir arayüz açar. Dosyaların durumunu görür ve numaraları tuşlayarak nelerin eklenip/çıkarılacağını sağlayan komuttur.

Neden kullanılır: Git için görsel arayüz (GUI) kullanmayıp terminalde bir bakış isteyen kullanıcılar tarafından tercih edilir. Kullanım sıklığı olarak -p parametresi kadar yaygın değildir.

Git Add -n veya Git Add --dry-run (test amaçlı çalıştırma)

Ne yapar: Eğer bozmaktan korkuyorsak bu komutu çalıştırınca hangi dosyalar eklenirdi diye görmek için kullanılır.

Neden kullanılır: Çok karmaşık dizin yapısında veya büyük projelerde yanlışlıkla bir şeyi bozmadığımızdan emin olmak için bir tür "prova" olarak kullanılır.

git add komutu hiçbir dosyayı kalıcı olarak tarihçeye yazmaz; sadece bir sonraki commit işlemine hangi dosyaların dahil edileceğini Staging Area'ya gönderir.

Özetlemek gerekirse git add komutu pek çok parametre alır ve bunları efektif olarak kullanmak için git simülatöründe istediğiniz kadar deneme/yanılma yapabilirsiniz.