Git Notları

Git hakkında kısa ve öz online Türkçe kaynak oluşturmak amacıyla aldığım notlar.


  • Oluşturma: 13 Mart 2023

Herhangi bir sorunuz veya bu dökümantasyonu geliştirme öneriniz olursa lütfen aşağıdaki link aracılığıyla bana iletin 🙃
Git Notları


Versiyon Kontrol Sistemi (VCS) Nedir?

Belirli versiyonların daha sonra çağrılabilmesi için zaman içerisinde bir dosya veya dosya grubundaki değişiklikleri kaydeden bir sistemdir.


Neden VCS?

  • Birden fazla yazılımcının birbirlerinin değişikliklerinden etkilenmeden bir proje üzerinde çalışabilmesini sağlar.

  • Daha önce oluşturulmuş bir versiyona geri dönüş sağlar.

    why_vcs_1
  • Versiyonlar arasında karşılaştırma yapabilmemizi sağlar.

    why_vcs_2

En Yaygın Kullanılan Versiyon Kontrol Sistemleri

  • Git

  • CVS (Concurrent Version Sytems)

  • SVN (Apache Subversion)

  • Mercurial

  • Monotone

  • Bazaar

  • TFS (Team Foundation Server)

  • VSTS (Visual Studio Team Services)

  • Perforce Helix Core

  • IBM Rational ClearCase


Git, alışılmadık derecede zengin bir komut setine sahip, hızlı, ölçeklenebilir, dağıtılmış bir versiyon kontrol sistemidir.

Orijinal Dokümantasyona Ulaşmak İçin
Git-SCM


Kısa Tarihi

Linux çekirdek bakımının ilk yıllarında (1991 - 2002) yazılımdaki değişiklikler yamalar ve arşivlenmiş dosyalarla sağlanıyordu. 2002’de BitKeeper adında tescilli bir dağıtık versiyon kontrol sistemi kullanılmaya başlandı. 2005 yılında BitKeeper’ı geliştiren ticari şirket ile Linux çekirdeğini geliştiren topluluk arasındaki ilişki bozuldu.

Bu gelişme özellikle Linus Torvalds olmak üzere Linux geliştirme topluluğunu kendi versiyon kontrol sistemi araçlarını geliştirmeye sevk etti. Geliştirmiş oldukları sistemin hedeflerinden bazıları şunlardı:

  • Hız

  • Basit tasarım

  • Doğrusal olmayan geliştirme için güçlü destek (binlerce paralel şube)

  • Tamamen dağıtılmış

  • Linux çekirdeği gibi büyük projeleri verim bir şekilde yönetebilme (hız ve veri boyutu)


Neden Git?

  • İnanılmaz derecede hızlıdır

  • Büyük projelerde çok verimlidir

  • Doğrusal olmayan geliştirme için inanılmaz bir dallanma sistemine sahiptir

  • Çevrimdışı olarak kullanılabilmektedir

  • En çok kullanılan versiyon kontrol sistemlerinden birisidir (G2)


Kurulum

Aşağıdaki bağlantılar aracılığıyla işletim sistemine uygun git yükleme dosyası indirildikten sonra kurulum adımları tamamlanarak git kurulumu yapılır.

Not: Bu dokümantasyonda yalnızca Windows işletim sistemi için kurulum adımları anlatılacaktır.


Konfigürasyon

Git'i kurduğunuzda yapmanız gereken ilk şey, kullanıcı adınızı ve e-posta adresinizi ayarlamaktır. Her Git taahhüdü (tam olarak oluşturulmuş bir versiyon) bu bilgileri kullandığı için bu önemli bir adımdır.

  • $git config --global user.name "Kullanıcı Adı"

    "Kullanıcı Adı" yerine kendi kullanıcı adınızı yazarak git için kullanıcı adınızı tanımlayabilirsiniz. Oluşturacağımız versiyonlar belirlediğiniz kullanıcı adı ile versiyonlanacaktır.

    Örnek kullanım:
    $git config --global user.name "zumrudu-anka"

  • $git config --global user.email «mail@mail.com"

    "mail@mail.com" yerine kendi e-mail adresinizi yazarak git için e-mail adresinizi tanımlayabilirsiniz. Oluşturacağımız versiyonlar belirlediğiniz e-mail ile versiyonlanacaktır.

    Örnek kullanım:
    $git config --global user.email "osmandurdag@hotmail.com"

  • $git config --list

    Bu komut yapılandırılmış ayarları listeleyecektir.


Yardım Alma

Git’i kullanırken yardıma ihtiyaç duyarsanız, Git komutlarından herhangi biri için kapsamlı bir kılavuz sayfasından yardım almanın üç yolu vardır:

  • $git help «parametre»
  • $git «parametre» --help
  • $git «parametre» -h

Bu komut yapılandırılmış ayarları listeleyecektir.

Örnek kullanım:
$git help add
$git add --help
$git add -h


Başlatma

Git deposu(repository) oluşturmak için mevcut olan 2 farklı yol vardır:

  • $git init

    Komut satırını açtıktan sonra Git'i başlatmak istediğiniz proje dizininize gidip bu komutu çalıştırarak git'i projenize entegre edebilirsiniz.

  • $git clone «url» «dizin adı(opsiyonel)»

    Git entegre edilmiş ve bulut sistemine kayıt edilmiş bir projeyi bu komut ile uzak bağlantı aracılığıyla bilgisayarınıza indirebilirsiniz.

    Örnek Kullanım:

    • $git clone https://github.com/zumrudu-anka/zumrudu-anka.git
    • $git clone https://github.com/zumrudu-anka/zumrudu-anka.git githubProfilim

    Bu ikinci kullanım örneğinde bulunulan dizinde githubProfilim adında bir klasör oluşturulacak ve indirilen dosyalar bu klasörün içine kayıt edilecektir.

Dosya Durumları

Git’in entegre edildiği bir proje dizinindeki bütün dosyalar genel olarak 2 durumda olabilir:

  • Untracked: Çalışma dizininizdeki son anlık görüntünüzde(commit) ve hazırlama alanınızda(staged) olmayan tüm dosyalardır.
    Not: Bir depoyu ilk kez klonladığınızda, tüm dosyalarınız izleniyor(tracked) ve değiştirilmemiş(unmodified) durumdadır.
  • Tracked: Son anlık görüntüdeki dosyalar(commit) ve yeni hazırlanan dosyalardır(staged). Kısacası, izlenen dosyalar Git'in bildiği dosyalardır.

İzlenen(Tracked) dosyalar ise 3 farklı durumda olabilir:

  • Modified: Dosyayı değiştirdiğiniz ancak henüz veritabanınıza kaydetmediğiniz anlamına gelir.
  • Staged: Bir sonraki kesinleştirme anlık görüntünüze(commit) gitmek için geçerli sürümünde değiştirilmiş bir dosyayı işaretlediğiniz anlamına gelir.
  • Committed: Verilerin yerel veritabanınızda güvenli bir şekilde saklandığı anlamına gelir.
file_states_1

Yaygın Komutlar

Git çalışma dizininde yaygın kullanılan komutlar

git status

Çalışma dizininin durumunu kontrol etme

  • $git status
  • $git status -s

    -s parametresi çalışma dizininin durumunu detaysız bir şekilde gösterir (kısa gösterim).

git add

Bu komut zaten izlenen dosyaları ve izlenmeyen dosyaları önce izlenen dosya durumuna getirerek staged bölgeye geçirir.

  • Staged Area:

    Bir versiyon oluşturmak istediğimizde bunu iki adımda gerçekleştiririz. Versiyona dahil etmek istediğimiz dosya veya dizinleri önce Staged Area adındaki ara bölgeye alırız. Bu aşamada çalışma dizininin anlık görüntüsünü almış oluruz.

  • $git add «dosya-dizin adı»

Örnek Kullanım:

  • $git add README.md
  • $git add .

Burada . değeri bulunduğumuz dizindeki tüm dosyalara işaret eder.

git commit

Staged bölgeye alınmış dosya ve dizinlerden gerçek anlamda bir versiyon oluşturma

  • $git commit -m "Commit Mesajı"

    –m parametresi versiyonla ilgili bilgi vermek için versiyon mesajı oluşturur.

  • $git commit -a -m "Commit Mesajı"

    –a parametresi daha önce izlenmiş duruma alınmış dosya veya dizinleri tek satırda versiyona dahil eder. Bu komut dosyaları önce staged bölgeye alır daha sonra versiyonu oluşturur.

Örnek Kullanım:
  • $git commit -m "Dokümantasyona git commit içeriği eklendi"
  • $git commit -a -m "Dokümantasyona git commit içeriği eklendi"

git log

Daha önce oluşturulmuş versiyonları listeleme

  • $git log
  • $git log -p

    –p parametresi daha sade(pretty) bir çıktı gösterir.

  • $git log -«number»

    –«number» parametresi belirlenen sayıda versiyon(son versiyondan geriye) gösterir.

  • $git log --pretty=format:"%h - %an, %ar : %s"

    Komutu ile log komutunun pretty formatını ayarlayabiliriz. Yukarıdaki komut bu şekilde bir çıktı verecektir:
    «hash» - «yazar adı», «ilişkisel yazar tarihi» : «commit mesajı»

    git log --pretty formatı için yararlı belirleyiciler
    • %H: Commit Hash
    • %h: Kısaltılmış Commit Hash
    • %T: Ağaç Hash (Tree Hash)
    • %t: Kısaltılmış Ağaç Hash
    • %P: Üst (Parent) Hash'ler
    • %p: Kısaltılmış Üst (Parent) Hash'ler
    • %an: Yazar Adı (Author Name)
    • %ae: Yazar Email'i (Author Email)
    • %ad: Yazar Tarihi (Author Date)
    • %ar: İlişkisel Yazar Tarihi (Author Relative Date)
    • %cn: Versiyonu Oluşturanın Adı (Committer Name)
    • %ce: Versiyonu Oluşturanın Email'i (Committer Email)
    • %cd: Versiyonu Oluşturanın Tarihi (Committer Date)
    • %cr: Versiyonu Oluşturanın İlişkisel Tarihi (Committer Relative Date)
    • %s: Konu - Özne - Versiyon Mesajı (Subject)
Örnek Kullanım:
  • $git log -p -2

    Son 2 commit'i pretty formatta gösterir

  • $git log -5

    Son 5 commit'i gösterir

git diff

İki versiyon arasındaki değişiklikleri izleme

  • $git diff «hash»

    «hash» parametresinin yerine daha önce alınmış olan bir versiyonun hash değerini(hash değerinin soldan en az 7 karakterini kopyalamak yeterli) girerek o versiyondan itibaren yapılmış olan değişiklikleri izleyebiliriz.

  • $git diff «hash» «hash»

    Komutu ile belirli 2 versiyon arasındaki farkları inceleyebiliriz.

  • $git diff «hash»..«hash»

    Komutu ile belirli 2 versiyon arasındaki farkları inceleyebiliriz. Önceki komut ile aynı işlevi görür.

  • $git diff --staged

    --staged parametresi staged bölgeye alınmış olan değişiklikleri izler.

  • $git diff --cached

    --cached ve --staged eş anlamlıdır.


Değişiklikleri Geri Almak

Erken commit yaptığınızda, bazı dosyaları eklemeyi unuttuğunuzda veya commit mesajınızı değiştirmek istediğinizde bu komut ile son commit'inizi değiştirebilirsiniz. Bu komut ile yapacağınız değişiklikler yeni bir commit oluşturmayacak, son commit'in yerini alacaktır.
Herhangi bir değişiklik yapmadan bu komutu çalıştırırsanız yalnızca son commit mesajınızı değiştirirsiniz.

  • $git commit --amend

    Son commit mesajını değiştirmeniz için git için tanımlı varsayılan metin editörü açılır.

  • $git commit --amend -m "Commit Mesajı"

    Önerilen kullanım. Son commit mesajını metin editörüne ihtiyaç duymadan tek satırda değiştirmenizi sağlar.

Son commit'inizi dosyalarda değişiklik yaparak güncellemek istediğinizde (geri almak istediğinizde) önce $git add, daha sonra $git commit --amend komutlarını kullanırsınız.
Örnek Kullanım:

  • $git add forgotten_file
  • $git commit --amend -m "Unutulan Dosya Eklendi"

Aşamalı Dosyanın Aşamasını Kaldırmak

Projenizde birden fazla dosya değiştirdiğinizi ve bunları staged bölgeye $git add * komutu ile geçirdiğinizi varsayalım. Fakat sonradan farkettiniz ki bu dosyalardaki değişiklikleri ayrı ayrı commitlemek istiyorsunuz yani tüm değişikliklerin tek bir versiyon olarak yansımasını istemiyorsunuz. Bu durumda versiyona eklemek istemediğiniz dosyaları aşağıdaki komutlar aracılığıyla staged bölgeden çıkarabilirsiniz.

  • $git restore --staged «file» Git versiyon 2.23.0'dan itibaren
  • $git reset HEAD «file»

Not: $git status komutu bu işlemin nasıl yapılacağına dair ipucu verir.

Örnek Kullanım:

  • $git restore --staged README.md
    Yalnızca README.md dosyasını staged bölgeden çıkarır.
  • $git reset HEAD README.md
    Yalnızca README.md dosyasını staged bölgeden çıkarır.
  • $git restore --staged . veya $git restore --staged *
    İçinde bulunduğumuz dizin ve alt dizinlerinde staged bölgeye eklenmiş bütün dosyaları staged bölgeden çıkarır.
  • $git reset HEAD . veya $git reset HEAD *
    İçinde bulunduğumuz dizin ve alt dizinlerinde staged bölgeye eklenmiş bütün dosyaları staged bölgeden çıkarır.

Değiştirilmiş Dosyadaki Değişikliklerin Geri Alınması

Değiştirilmiş (modified) bir dosyayı son versiyonladığınız haline veya daha sonra versiyon oluşturmadıysanız ilk klonladığınız haline kolayca geri döndürmek istediğiniz durumlar olabilir. Yani projenizde bir dosyada değişiklikler yaptınız fakat bu değişiklikleri kaldırmak ve dosyanın son versiyondaki haline siz değişikliklerinizi tek tek arayıp geri almadan kolayca geri dönmesini istiyorsunuz. Aşağıdaki komutlarla bu işlemi kolayca yapabilirsiniz.

  • $git restore «file» Git versiyon 2.23.0'dan itibaren
  • $git checkout -- «file»

Not: $git status komutu bu işlemin nasıl yapılacağına dair ipucu verir.

Örnek Kullanım:

  • $git restore README.md
    Yalnızca README.md dosyasındaki değişiklikleri geri alır.
  • $git checkout -- README.md
    Yalnızca README.md dosyasındaki değişiklikleri geri alır.
  • $git restore . veya $git restore *
    İçinde bulunduğumuz dizin ve alt dizinlerinde değiştirmiş olduğumuz bütün dosyaları en son versiyondaki hallerine geri çevirir.
  • $git checkout -- . veya $git checkout -- *
    İçinde bulunduğumuz dizin ve alt dizinlerinde değiştirmiş olduğumuz bütün dosyaları en son versiyondaki hallerine geri çevirir.

Önemli: Bunun tehlikeli bir komut olabileceğini unutmayın. Bu dosyalarda yaptığınız tüm yerel değişiklikler kaybolacaktır. Kaydedilmemiş yerel değişikliklerinizi atmak istediğinizden emin değilseniz bu komutu çalıştırmamanız tavsiye edilir.


Uzak Bağlantılarla Çalışma

Git entegre edilmiş herhangi bir projede iş birliği yapabilmek için uzak depoların(repository) nasıl yönetileceğinin bilinmesi gereklidir. Uzak depolar, ilgili projenin Internet'te veya ağda bulunan sürümleridir. Aynı projede başkalarıyla işbirliği yapmak, bu uzak depoları yönetmeyi ve işi paylaşmak gerektiğinde bu depolara veri gönderip almayı içerir.

Uzak Bağlantıları Listeleme

  • $git remote
    Daha önce oluşturulmuş uzak bağlantıları yalnızca kısa adları ile listeler.
  • $git remote -v
    Daha önce oluşturulmuş uzak bağlantıları okuma ve yazma sırasında kullancılacak URL'leri ile birlikte listeler.

Uzak Bağlantıları Ekleme

  • $git remote add «takma ad» «url»

    Örnek Kullanım:
    $git remote add gitlab https://gitlab.com/cnn4/yolo-object-detection.git

Uzak Bağlantıdan Veri Çekme

Uzak bağlantıdan veri çekmek için $git fetch «remote» komutu kullanılabilir. Burada dikkat edilmesi gereken şey bu komutun $git pull komutundan farklı olduğudur. $git pull komutu uzak bağlantıdan çekilen verileri otomatik olarak ilgili branch ile birleştirirken (merge), $git fetch komutu yalnızca veri çekecek, otomatik olarak birleştirme yapmayacaktır.

Örnek Kullanım:

  • $git fetch origin

Uzak Bağlantıya Veri Gönderme

Proje paylaşılmak istenen bir noktaya geldiğinde $git push «remote» «branch» komutu kullanılabilir.

Örnek Kullanım:

  • $git push origin main

Uzak Bağlantıyı İnceleme

Bir uzak bağlantı hakkında daha fazla bilgi elde etmek için $git remote show «remote» komutu kullanılabilir.

Örnek Kullanım:

  • $git remote show origin

Uzak Bağlantıyı Yeniden Adlandırma

Bir uzak bağlantının adını değiştirmek için $git remote rename «adı değiştirilecek branch» «yeni ad» komutu kullanılabilir.

Örnek Kullanım:

  • $git remote rename origin root
    Bu komut adı origin olan remote bağlantının adını root olarak değiştirir

Uzak Bağlantıyı Silme

Bir uzak bağlantıyı silmek için $git remote remove «remote» veya $git remote rm «remote» komutları kullanılabilir.

Örnek Kullanım:

  • $git remote rm root
    Bu komut adı root olan remote bağlantıyı siler

Etiketler

Bir çalışma alanının geçmişindeki bazı noktaları (versiyonları - commitleri)önemli olarak etiketlemek isteyebilirsiniz. Genel olarak v1.0, v1.1.9 gibi projenin versiyonunu güncelleme durumlarında tercih edilen bir kullanımdır.

Etiketleri Listeleme

Bu komut etiketleri alfabetik sırada listeleyecektir.

  • $git tag veya
  • $git tag -l veya
  • $git tag --list

Belirli bir kalıpla eşleşen etiketleri de arayabilirsiniz:

  • $git tag -l "v1.0*"
    v1.0 ile başlayan etiketleri listeleyecektir. Örneğin:
    v1.0.1
    v1.0.2

Etiket Oluşturma

Git lightweight (hafif) ve annotated (açıklamalı) olmak üzere iki tür etiketi destekler.

Lightweight (Hafif) Etiketler

Yalnızca belirli bir commit'in işaretçileridir. $git tag «tag name» komutu ile hafif etiket oluşturulabilir.
Not: Oluşturulan etiket son commit'i işaret edecektir.

Örnek Kullanım:

  • $git tag v1.0

Annotated (Açıklamalı) Etiketler

Git veritabanında tam nesneler olarak saklanırlar ve etiketleyicinin adını, e-mailini, tarihini ve bir etiketleme mesajını içerirler. Ayrıca GNU Privacy Guard (GPG) tarafından imzalanıp doğrulanabilirler. Tüm bu bilgilere sahip olmak için genel olarak annotated etiketlerin kullanımı önerilir. $git tag -a «tag name» -m «tag message» komutu ile açıklamalı etiket oluşturulabilir.
Not: Oluşturulan etiket son commit'i işaret edecektir.

Örnek Kullanım:

  • $git tag -a v1.0 -m "X özelliğinin eklendiği versiyon"

Önceki Versiyonlar İçin Etiket Oluşturma

Daha önce oluşturmuş olduğumuz commit'ler için de etiket oluşturabiliriz. Bunun için açıklamalı veya hafif etiket oluştururken kullandığımız komutların yanına hangi versiyon için etiketleme yapmak istiyorsak o versiyonun hash kodunu parametre olarak verebiliriz.

Örnek Kullanım:

  • Açıklamalı Etiket İçin:
    $git tag -a v1.0 -m "Y özelliğinin eklendiği önceki versiyon" 0220e8dc
  • Hafif Etiket İçin:
    $git tag v1.0 9c27ce6

Etiketleri Uzak Sunucuya Gönderme

$git push komutu varsayılan olarak etiketlerinizi uzak sunucuya aktarmaz. Etiketlerinizi uzak sunucuya göndermek için $git push «remote» «tag name» komutunu kullanabilirsiniz

Örnek Kullanım:

  • $git push origin v1.3
  • $git push origin --tags
    Bütün etiketleri uzak sunucuya gönderir

Etiketleri Silme

Yerel çalışma alanınızdaki bir etiketi silmek için $git tag -d «tag name» komutunu kullanabilirsiniz.

Örnek Kullanım:

  • $git tag -d v1.8

Etiketleri Uzak Sunucudan Silme

Etiketleri uzak sunucudan silmek için yaygın olarak kullanılan 2 varyasyon vardır.

  • git push «remote» :refs/tags/«tag name»
    Örnek Kullanım: $git push origin :refs/tags/v1.7.3
  • $git push origin --delete «tag name»
    Örnek Kullanım: $git push origin --delete v1.7.3

Etiketleri Görüntüleme

Bir etiketin işaret ettiği commiti görüntülemek istiyorsanız $git checkout komutunu kullanabilirsiniz. Fakat bu komutu kullanırken dikkatli olmalısınız. Bu komut checkout ile döndüğünüz versiyonu HEAD durumuna getirir. Önerilen durum ise eski versiyonda bir değişiklik yapmak istediğinizde bunun için yeni bir branch oluşturmanızdır.

Örnek Kullanım:

  • Önerilen kullanım : $git checkout -b «branch name» v2.6
    Örnek: $git checkout -b bugfix_v2.6 v2.6
  • Önerilmeyen kullanım : $git checkout v2.6

Git Takma Adları

Git komutlarını tüm metinlerini yazmadan kendi kısaltmalarınızla kullanmak istiyorsanız $git config aracılığıyla her komut için bir takma ad ayarlayabilirsiniz.

Bazı Örnekler:

  • $git config --global alias.co checkout
    Bu ayarlamadan sonra checkout yerine co komutunu kullanabiliriz
  • $git config --global alias.br branch
  • $git config --global alias.ci commit
  • $git config --global alias.st status
  • $git config --global alias.unstage 'reset HEAD --'
  • $git config --global alias.last 'log -1 HEAD'

.gitignore - Dosyaları Yok Saymak

Git entegre edilmiş proje veya çalışma dizininde izlenmesi istenmeyen dosyaların otomatik olarak izlenmeleri engellenebilir. Bu amaçla çalışma dizininde git tarafından tanınan .gitignore adında özel bir dosya oluşturulur. Dosyanın adı git tarafından tanınması açısından önemlidir. İzlenmesi istenmeyen dosya ve dizinler bu dosyanın içine satır satır eklenerek git tarafından izlenmeleri ve versiyonlara dahil edilmeleri engellenebilir.

.gitignore dosyası için tanımlı operatörler:

  • Yorum Satırları: #
  • Olumsuzluğu Sağlamak: !
  • Yinelemeyi Önlemek: /dosya
  • Dizin Belirtmek: dizin/

Örnek bir .gitignore dosyasının içeriği:

gitignore_example