GIT & GITHUB - 1

Çağrı Esen
Çağrı Esen
Published in
10 min readNov 6, 2020

Versiyon Kontrolü Nedir ?

Versiyon kontrol, belirli versiyonların daha sonra çağrılabilmesi için zaman içerisinde bir dosya veya dosya grubundaki değişiklikleri kaydeden bir sistemdir. Git gibi sistemler tüm bu değişikliklerin tarihçesini ve içeriğini elektronik olarak bizim için takip ederek kayıt altına almamızı sağlayan veri tabanları olarak düşünülebilir.

Bu sistemler sayesinde istediğiniz anda dosyaların mevcut durumlarını kaydedebilir, daha sonra ihtiyaç halinde dosyaların kaydedilmiş haline geri dönebilirsiniz.

NOT :

Versiyon : Dosyaların kayıt altına alınmış herhangi bir andaki hallerine verilen isim.

Source : Atlassian Git Workflows

Versiyon kontrolü programlama dili, programlama kütüphaneleri (framework), dosya tipi veya işletim sisteminden bağımsız olarak çalışmaktadır.

Versiyon kontrolü:

  • HTML dosyalar için kullanılabileceği gibi, mimari tasarım amaçlı proje dosyaları ve iPhone uygulaması kaynak kodunuz için de kullanılabilir
  • Dosyalarınız üzerinde çalışırken hangi işletim sistemini veya hangi programları kullandığınız ile ilgilenmez (Sublime Text, Notepad, Visual Studio, Word, AutoCAD)

Versiyon Kontrolü Neden Kullanılır ?

1- Uyumlu Ekip Çalışması

2- Versiyonların Takip Edilebilmesi

3- Önceki Versiyonlara Geri Dönebilme

4- Dosyalarınızın Neden Değiştiğini Anlama

5- Yedekleme

Git Konfigürasyonu

Git ile çalışmaya başlamak için önce bazı ayarlar yapılmalıdır. Bunun için Git git config isimli bir araç/komut sunar.

Git ayarları aşağıda belirtilen üç konumda kaydedilir ve hiyerarşik olarak bu konumlardan yüklenir:

  1. Seviye (/etc/gitconfig dosyası) : Tüm kullanıcı ve projeler için geçerli olan ayarlar bu dosyada kaydedilir. git config komutunu — system seçeneği ile çalıştırırsanız ayarlar bu dosyada kaydedilecek ve bu dosyadan okunacaktır
  2. Seviye (/.gitconfig dosyası) : Sadece sizin kullanıcınız için tanımlanan ayarların kaydedildiği dosyadır. git config komutunu — global seçeneği ile çalıştırısanız ayarlar bu dosyaya kaydedilecek ve bu dosyadan okunacaktır
  3. Seviye(.git/config): Proje klasörünüzün (projenizin Git ile versiyon kontrolüne alınmış olması gerekiyor) altında yer alan .git/config dosyasında ise proje bazındaki git ayarlarınız yer alır.

NOT :

Git, ayarlarınızın değerini belirlemek için bu üç konumdaki dosyaları 3. seviye, 2. seviye ve 1. seviye sıralaması ile hiyerarşik olarak okur.

Belirli bir ayar’a ilişkin değere ilk hangi seviyede rastlandıysa o seviyedeki değer dikkate alınır diğer seviyelerdeki değerler dikkate alınmaz.

Kullanıcı Adı - Email

Git, ayar olarak tanımladığınız değerleri commit vb işlemlerde otomatik olarak kullanır.

Bu ayarların değerini belirlemek ve ayarları girdikten sonra kontrol etmek için komutlar:

git config --global user.name "Cagri Esen"
git config --global user.email "esencgr@gmail.com"
git config --list

NOT :

Git’in komutları ve bu komutların seçenek ve parametreleri ile ilgili yardım almak için :

git [komut adı] — help (örneğin: git init — help)

git help [komut adı] (örneğin: git help init)

Basit Anlamda Versiyon Kontrolü İş Akışı

Repository

  • Versiyon kontrolünün en temel bileşeni repository denilen yapıdır.
  • Repository, dosyalarınızdaki tüm değişiklikleri ve bu değişiklikler ile ilgili ilave bilgileri (değişikliği kim, ne zaman yaptı ve değişiklik ile ilgili girilen açıklamalar) ayrı birer versiyon olarak kayıt altında tutan bir veri tabanıdır.
  • Git tüm bu bilgileri genellikle dosya sisteminde gizli bir klasör olarak oluşturulan .git isimli klasör içinde bir dizi dosya olarak tutar.

Repository Oluşturmak

  • Henüz versiyon kontrolünde olmayan bir projeniz varsa git init komutu ile projenizi tüm klasör ve dosyaları ile birlikte versiyon kontrolüne alabilirsiniz
  • Projeniz uzaktaki veya şirket ağınızdaki bir Git sunucusunda versiyon kontrolü altında tutuluyorsa projeyi kendi bilgisayarınıza git clone komutu ile indirebilirsiniz.

Versiyon Kontrol İş Akışı

  1. Proje oluşturulur ve istenilen değişiklikler istenilen uygulama ve program ile yapılabilir.
  2. Yapılacak değişiklikler tamamlandığında, istenilen özellik eklendiğinde veya sorun giderildiğinde vs. değişiklikleri commit adı verilen işlemi betimleyici bir bütün olarak tarif edilir ve tanımlanir.
  3. Commit işlemi öncesi yapılan değişikliklerin özetini göremek için git status komutu ile hangi dosyalar değişti, silindi veya hangi dosyaları eklendi kolayca görülebilir.
  4. Bir sonraki aşama değişen dosyalarınızdan hangilerinin commit’e dahil olduğunu belirlemek. Bu adımda commit’e dahil edilmek istenen dosyalar staging area denilen ara bir alana alınır.
  5. Dosyaların içeriğinin değiştirilmiş olması, silinmesi veya yeni dosya eklenmesi bu dosyaların otomatik olarak staging area’ya eklenmesini sağlamaz. Bu işlem ilgili dosyalar seçilerek git add dosya_adı komutu ile yapılır.
  6. Dosyalar staging area’ya eklendikten sonra şimdi commit işlemine hazır haldedir. Commit işlemi ile dosyalardaki değişiklikler yeni bir versiyon olarak Git’de kayıt altına alınır.
  7. Özellikle de bir takım çalışması söz konusu ise, projedeki değişiklikleri takip etmek önemlidir. Proje için oluşturulan commit tarihçesini incelemek için git log komutunu kullanabilirsiniz.
  8. Yapılan değişikliklerin takımın geri kalanı tarafından da görülmesini ve kullanılmaya başlanmasını sağlamak için değişikliklerinizi uzaktaki repository’de yayınlamanız gerekir. Bunun için git push komutunu kullanılır.

NOT :

Local (Yerel) & Remote (Uzak) Repository

- Local repository kendi bilgisayarınızda proje klasörünüzün altında bulunan .git klasörüdür. Bu repository üzerinde sadece siz çalışabilirsiniz ve değişiklikler yerel diskinize kaydedilir.

- Remote repository ise genellikle uzaktaki bir sunucuda yer alırlar ve bu sunucudaki .git klasöründen ibarettirler. Takım çalışması söz konusu ise takımdaki kişiler değişikliklerini bu uzaktaki repository üzerinden paylaşırlar.

LOCAL(YEREL) PROJE OLUŞTURMA

Repository Oluşturma

Henüz versiyon kontrolü altında olmayan bir projeyi versiyon kontrolü altına almak için :

  • cd proje_klasörü komutu ile proje klasörüne konumlanılır.
  • git init komutu ile boş bir repository oluşturulur.
  • ls -a komutu ile klasor içeriği kontrol edilir

Proje klasörünün altında bulunan dosyalar incelendiğinde klasörün içinde .git isimli gizli bir klasörün olduğu görülür.

UYARI :

git init komutu ile proje içinde boş bir repository oluştu. Ancak proje klasöründe dosyalar ve başka klasörler bulunmasına rağmen bu dosya ve klasörlerin hiç biri henüz Git tarafından versiyon kontrolü altına alınmadı.

Versiyon Kontrolü Dışında Tutulacak Dosyaları Belirtmek

  • Versiyon kontrolü altına almak istemediğiniz dosya ve klasörleri tanımlamak için proje klasörüne eklenen .gitignore dosyası kullanılır.
  • Bu dosyaya göz ardı etmek istenilen dosya ve klasörlerin tespit edilebilmesi için doğrudan isimler veya basit kurallar eklenir.
  • Proje versiyon kontrolü altına aldıktan sonra ilk iş olarak GitHub’ın yayınladığı derlemeyi veya kendi deneyiminiz ve bilginiz ile karar vereceğiniz dosya ve klasörleri .gitignore dosyasına eklemek faydalı olacaktır.( Projenizin ilerleyen aşamalarında bu işlemi yapmanız biraz daha zahmetli olacaktır.)

.gitignore dosyasında kural tanımlama:

*.[oa]
.~
  • İlk satırda o veya a uzantısı ile biten dosyaların versiyon kontrolü dışında tutulması için bir kural tanımlandı.
  • İkinci satırda ise ~ karakteri ile biten (çoğu metin düzenleme uygulaması geçici dosyaları ~ ile biten dosyalar olarak otomatik oluşturur) dosyaların versiyon kontrolü haricinde tutması için kural tanımlandı.

.gitignore dosyası tanımlama kuralları:

  • Boş satırlar veya # ile başlayan satırlarda yaptığınız tanımlamalar Git tarafından dikkate alınmaz.
  • *, ?, [ ], { }, [!] ve \ gibi karakterler kullanılarak oluşturulan ve globbing patterns adı verilen tanımlayıcılar kullanabilirsiniz
  • Klasörleri belirtmek için / karakteri kullanılır. Örneğin projemde/versiyon/kontrolü/istemedigim/bir/klasor/ şeklinde bir tanım yaptığımızda ilgili klasör ve altındaki tüm dosyalar Git tarafından göz ardı edilir.
  • Tanımladığınız bir kuralın tersini ! simgesi ile tanımlarız. Örneğin !/projemin/kaynak/kodu/ şeklinde bir tanım yaptığımızda bu klasör dışındaki tüm klasör ve dosyalar Git tarafından göz ardı edilecektir.

Commit İşlemi

Proje versiyon kontrolüne alınıp göz ardı edilmesini istediğimiz klasör ve dosyaları da belirledikten sonra aşağıdaki komutlar ile ilk commit işlemi yapılır.

  • git add . komutu ile proje dosyaları Staging Area’ya eklenir.
  • git commit -m “ilk commit” ile ilk commit tanımlandı.

NOT :

Yukarıdaki iki komutu arka arkaya kullanmak yerine aynı işlemi git commit -a komutu ile de yapabiliriz.

REMOTE(UZAK) PROJE OLUŞTURMA

Diğer ekip üyeleri ile birlikte verimli çalışabilmek onların yaptığı değişiklikleri kendi yerel çalışma alanınıza almak, kendi yaptığınız değişiklikleri onlar ile paylaşabilmek için remote repository’lerinizi doğru ve etkin bir şekilde yönetmelisiniz.

Proje Git Adresi(URL) & Kullanıcı Adı & Email

Git ile versiyon kontrolü yapılan bir projeye dahil olduğunuzda size verilecek ilk bilgiler projenin Git adresi (URL) ve projeye erişim için kullanacağınız kullanıcı adı ve şifrenizdir.

NOT :

Uzaktaki bir repository’nin (URL) adresi aşağıdaki formatlardan birinde olacaktır.

Bu adres formatlarından ilk iki tanesi SSH (Secure Shell) protokolüne karşılık gelir.

http:// ve https:// protokolleri ise normal internet erişimi için de kullanılan protokollerdir. Son format ise git’in kendi protokolüne karşılık gelir.

Klonlama İşlemi

Remote repository adresini ve erişim için gerekli kullanıcı adı ve şifreyi öğrendikten sonra yapılması gereken tek şey bu adresten proje dosyalarını yerel diskinize klonlamak.

Bunun için öncelikle yerel disk üzerine projenin indirileceği bir klasör oluşturulmalı ve Terminal’den bu klasöre gidilmelidir.

Bu adimlar için :

  • cd proje_klasörü komutu ile proje klasörüne konumlanılır.
  • git clone komutu ile klonlanır.
  • ls -a komutu ile klasor içeriği kontrol edilir

PROJE ÜZERİNDE ÇALIŞMAK

Proje ister local bir proje olarak oluşturulsun ister remote bir repository klonlanmış olsun tüm değişiklikler yerel disk üzerinde gerçekleşecek ve commit’ler ile oluşan tüm versiyonlar git tarafından yerel diskteki .git klasöründe takip edilecektir.

git push komutu kullanılmadığı sürece yapılan değişiklikler sadece yerel disk üzerinde kayıt altına alınır.

Dosya Durumları

Git’de dosyalar genel olarak iki durumda olabilir:

  • Untracked (Takip Edilmeyen): Bu dosyalar versiyon kontrolü altında olmayan veya sizin henüz versiyon kontrolü yapmak için git’e eklemediğiniz dosyalardır. Bu dosyalardaki değişiklikler siz dosyaları git’e eklemediğiniz sürece versiyon kontrolüne tabi değildir
  • Tracked (Takip Edilen): Bu dosyalar ise git’in versiyon kontrolü takibi altında olan dosyalardır. Bu dosyalar üzerinde yapacağınız tüm değişiklikler git tarafından takip edilmektedir.

Staging Area

Çoğu versiyon kontrol sisteminde değişiklikler iki yerde kaydedilir:

  • Yerel diskteki çalışma klasörü (working folder) veya
  • Versiyon kontrol sisteminin veri tabanı

NOT :

Ancak git’de değişikliklerin kayıt altına alındığı üçüncü bir alan daha vardır ki buna Staging Area denir ve git’in en temel kavramlarından birisidir.

Staging Area’yı, proje dosyalarımızda bir dizi değişikliği remote repository’ye göndermeden önce kayıt altında tutulan veri tabanı/alan olarak tanımlamak mümkündür.

UYARI :

Versiyon Kontrolünün Altın Kuralları - 1

Sadece Birbiri İle Alakalı Değişiklikleri Commit Etmek

Birbiri ile alakalı olmayan değişiklikleri aynı commit ile versiyon kontrol sisteminde kayıt altına almak aşağıdakilere benzer sorunlar yaşama ihtimalini artacaktır:

  • Committeki değişiklikleri inceleyen takım üyelerinin yapılan değişikliklerden hangisinin hangi konu ile ilgili olduğunu anlamakta güçlük çekecektir.
  • Alakalı alakasız değişiklikler tek bir commit içinde yer aldığı için herhangi bir nedenle belirli ve tek bir değişikliği geri almak güç hale gelecektir.
  • Alakalı alakasız değişiklikleri tek bir commit ile ele almak yerine örneğin iki ayrı sorunu gidermek için yapılan değişiklikler iki ayrı commit ile kayıt altına alınmalı veya daha büyük bir özellik üzerinde çalışırken bu özelliği oluşturan ve anlamsal bir bütün olarak ifade edilen daha küçük özellikleri de ayrı commit’ler ile kayıt altına almak faydalı olacaktır.

Proje üzerinde çalışılırken belirli bir zaman aralığında yapılan değişikliklerin tamamının aynı konu veya özellikle ilgili olması mümkün olmayacaktır.

Tam da bu noktada Staging Area mekanizmasının güzelliği ortaya çıkar, çünkü git hangi değişikliğin Staging Area’ya ekleneceğine karar vermek için kullanıcının devreye girmesine izin verir.

Yapılan değişiklikler git tarafından otomatik takip edilmez, bunun yerine git tüm değişiklikleri sizin gözden geçirerek kontrollü bir şekilde Staging Area’ya almanızı ister.

Değişiklikleri Listelemek

Proje dosyalarında yapılan değişiklikleri listelemek için:

  • git status komutu sayesinde değişikliklerin listelenmesi mümkündür.

Yukarıdaki terminal ekran görüntüsünde de görüldüğü gibi git oldukça ayrıntılı durum bilgisi sunmaktadır.

git status komutu ile git aşağıdaki 3 ana grupta yer alan dosyaları size listeler:

  • Changes to be committed (Commit edilmeye hazır dosyalar): Bu gruptaki dosyalar git add veya git rm komutu ile Staging Area’ya eklediğimiz dosyalardır. Bu dosyalar bir sonraki commit’imizin içinde yer alacaktır
  • Changes not staged for commit (Commit için henüz hazır olmayan dosyalar): Bu gruptaki dosyalar değişiklik yaptığımız fakat henüz Staging Area’ya eklemediğimiz dosyalardır. Bu dosyalar bir önceki grubun içine eklemediğimiz sürece bir sonraki commit’e dahil olmayacaklarıdır
  • Untracked files (Versiyon takibinde olmayan dosyalar): Bu gruptaki dosyalar ise henüz versiyon kontrolü altına almadığımız dosyalardır.

“git add” &“git rm” Komutları (Ekle — Çıkar)

git status komutu sonrasında 3 gruptan son ikisinde yer alan dosyaların ilk gruba dahil edilmesi için git add ve git rm komutları kullanılır.

  • git add . & git add <dosya> → add komutu ile staging area’ya dosya ekleme.
  • git rm <dosya> → rm komutu ile belirtilen dosyanın bir sonraki commitin dışında tutulması sağlanabilir.

“git commit” Komutu (Commit)

Değişiklikler git add ve git rm ile Staging Area’ya alındıktan sonra:

  • git commit → komutu ile yapılan değişiklikler yeni bir versiyon olarak kayıt altına alınabilir.
  • git commit -m “commit_ile_ilgili_açıklayıcı_mesaj” → bir mesaj eklemek mümkündür.

UYARI :

Versiyon Kontrolünün Altın Kuralları - 2

Anlamlı Commit Mesajları

  • Commit için bilgilendirici bir mesaj hem takımın hem de daha sonra değişikliği yapan kişinin yapılan değişikliği daha rahat ve hızlı anlamasını sağlayacaktır.

UYARI :

Versiyon Kontrolünün Altın Kuralları — 2

İyi Bir Commit Nasıl Olmalı?

  • Tamamlanmamış değişiklikler kesinlikle commit edilmemelidir. (Eğer zaman zaman değişikliklerinizi kayıt altına almak istiyorsanız commit işlemi yerine git stash özelliğini/komutunu kullanabilirsiniz.)
  • Commit kısa ve açıklayıcı mesajlar içermeli.

“git log” Komutu (Commit Tarihçesi)

  • Bu komut ile tüm commit’ler ile ilgili bilgileri, en son commit en üstte olacak şekilde, tarihsel olarak sıralar.
  • Eğer Terminal penceresine sığmayacak kadar çok tarihsel kayıt var ise son satırda : simgesi yer alacaktır, SPACE/BOŞLUK tuşuna basarak bir sonraki sayfanın listelenmesini q tuşuna basarak da listelemenin sonlandırılmasını sağlayabilirsiniz.

Terminal’de listelenen her commit tarihçesi kaydı, diğer bilgilerin yanı sıra, aşağıdaki temel bilgileri içerir.

  • Commit’in Hash değeri
  • Commit’i gerçekleştiren kişinin adı ve email’i
  • Commit tarihi
  • Commit mesajı

NOT :

Commit Hash : Her bir commit’in benzersiz ve tek bir tanımlayıcı değeri vardır. Bu değer git tarafından commit’e dahil olan tüm değişiklikleriniz ve commit’in kendisi ile ilgili bilgiler de kullanılarak otomatik hesaplanır. Genel olarak git’in listelemelerinde ve bazı komutların parametresi olarak bu değerin ilk 7 karakterinin kullanılması yeterlidir. Çünkü bu ilk 7 karakterin de nerdeyse benzersiz ve tekil olduğu söylenebilir.

  • git log -p → komutu ile birlikte commit işlemi ile ilgili bilgilendirici çoğu bilgiyi görmek dosyalarda yapılan değişiklikler de ayrıntılı olarak listelemek mümkündür.
  • git log — oneline → komutu ile birlikte commitler tekli satırda gösterilebilir.

SONUÇ

Git kullanımına temelden bir giriş yapmış bulunuyoruz. Serinin devamında takım olarak çalışılan işlerde oldukça avantaj sağlayan Branching (Dallanma) ve Merging(Birleştirme) vb ileri seviye işlemleri anlatmayı planlıyorum.

--

--