GitHub ve Basit Komutlar

 

Merhaba,

Bu hafta Git ve Github serisine başlıyorum. İlk yazımda basit komutları ve terminolojiyi tanımlayacağım. İlerleyen yazılarımda ileri seviye git komutları ve GitHub Desktop üzerinden yapılan işlemlere de değineceğim.

Git & GitHub & GitHub Desktop

Git, bir versiyon kontrol sistemidir.

GitHub, kodumuzu depoladığımız ve başkalarıyla işbirliği yaptığımız yerdir. Açık kaynak kod depolamaya yarar. Bir projeye ait iki farklı kodun birleştirilmesini sağlar.

GitHub Desktop, GitHub ile lokal olarak çalışmamıza yardımcı olur.

Neden GitHub kullanmalıyız?

  • Dünyada en çok kullanılan versiyon kontrol sistemi.
  • Bireysel kullanıcılar için ücretsiz, takımlar ve firmalar için ise ucuz.
  • Platformda yazılımcıları takip edebilir, açık kaynak geliştirilen kodlar üzerinde yorumlar, hata bildirimleri yapabiliriz.
  • Forking sayesinde yine açık kaynak kodların geliştirilmesine katkıda bulunabiliriz.

GitHub Terminolojisi

  • Repository: Klasör veya depoya benzetebiliriz. Projenin tüm dosyaları ve her dosyanın revizyon geçmişi yer alır.
  • Branch: Projenin ana çalışmadan ayrılan sürümü. Ana projeyi ağaç gövdesine benzetirsek yan sürümü olan branch’ı ağacın dalına veya dallarına benzetebiliriz. Bir projede birden fazla branch olabilir.
  • Fork: Bir repository’nin github hesabında olan kopyası. Orjinal projeyi etkilemeden değişiklikleri özgürce denememizi sağlar. Public olarak açılmış her repository’yi bilgisayarımıza fork edebiliriz.
  • Clone: GitHub’da bulunan bir repository’yi lokal bilgisayara kopyalama işlemi.
  • Main/Master: Bir repository’nin ana branch’ı. Eski GitHub versiyonlarında master, yeni versiyonlarda main olarak geçer.
  • Pull: Bir repository’nin hepsi veya belirli bir kısmının bir bilgisayara (lokale) çekilme işlemi.
  • Push: Proje dosyalarında yapılan değişikliklerin github server’larına gönderilmesi.
  • Merge: Bir repository üzerinde bulunan branch’in başka bir branch ile birleştirilmesi. İşlem sonunda conflict oluşabilir.
  • Conflict: İki branch birleştirilirken oluşan çakışma. Aynı satırlara yazılan farklı kodlar gibi. Bazılarını GitHub otomatik olarak çözer, bazılarının manuel olarak çözülmesi gerekir.
  • Pull Request: Çekme isteği. GitHub’ın yaptığınız değişiklikleri ilgili dala dahil etme isteğiniz hakkında ilgili tarafları bilgilendirme yöntemi.
  • Stash: İki branch arasında gezinirken yapılan değişikliklerin commit’lemeden tutulması, saklanması, gerektiğinde geri çağrılması.
  • Discard: İki branch arasında gezinirken yapılan değişikliklerin silinmesi.
  • Remote: GitHub server’ları üzerinde bulunan varlıklar, dosyalar vs.
  • Local: Lokal bilgisayarımız içindeki varlıklar.

Basit Komutlar

git clone repository linki bir repository’yi remote’dan lokale kopyalamak için yazarız.

git remote add origin repository linki : remote’da bulunan bir repository’yi lokaldeki repo ile eşitleme.

git push -u origin main : değişiklik sonrası bunu remote’a yeniden gönderebilmek için yazarız.

Remote’da değiştirilmiş bir repo var ise (başka bir bilgisayarda veya GitHub sayfasında değiştirilmiş olabilir) bunu lokale çekebilmek için fetch ve pullkomutlarını kullanırız.

git fetch : değişiklikleri remote’dan çeker ancak bunu lokaldeki dosyalarda göstermez, sadece gizli git dosyası içine yazar.

git pull : lokaldeki dosyalara da yansıması için bu komutu çalıştırırız.

git branch -a : hem remote’da hem de lokal’deki tüm branch’ları listeler.

git branch : sadece lokalde bulunan branch’ları listeler.

git checkout -b branchismi : tek komutla hem yeni bir branch oluşturup hem de bu branch’a geçişi sağlar.

git checkout branchismi : var olan ve komutta ismi yazılan branch’a geçişi sağlar.

git add . / git add -A : tüm dosyaları dizine eklemeyi sağlar.

git add dosyaismi : sadece adı geçen dosyayı dizine ekler.

git commit -m “mesaj : dizine eklenen dosyaları veya değişiklik yapılmış olanları loakl depoya yüklemek için kullanılır. Eklenen mesaj commitlerin listelendiği ekranda görüneceğinden bu alana ne türden bir değişiklik yapıldığı bilgisinin yazılması sonradan proje incelemesi yapıldığında doğru anlaşılmasını sağlar, bu bakımdan önemlidir.

git push -u origin branchismi : ismi geçen ve lokal’de açılan branch’ı remote’a eklemeyi sağlar. Artık remote’da main ve adı geçen branch ayrı ayrı görünür. Bu aşamadan sonra istenirse bu branch ve main merge’lenebilir yani birleştirilebilir.

Açılan yeni branch’ta yapılan değişiklikleri main/master’a taşıma mergekomutu ile yapılır. Branch’ı main’e taşıyabilmek için:

  • git checkout main : main’e geçiş yapılır.
  • git merge origin/değişikliği barındıran branch ismi : branch’a eklenmiş commit’leri main’e taşır.
  • git push : GitHub’a en güncel hali gönderilerek işlem tamamlanır.

Merge işlemi alternatif olarak GitHub arayüzünde de yapılabilir. Branch’ta bir değişiklik yaptığımızı ve bu değişikliği GitHub’a commit ettiğimizi varsayalım. GitHub sayfasında ilgili branch seçildiğinde aşağıdaki ekran karşımıza çıkar.

Üstteki uyarı branch’ın main’in 1 commit önünde olduğu anlamına gelir. Burada “Open pull request” butonuna tıkladığımızda çıkan ekranda dikkat edeceğimiz ilk şey base ve compare alanlarıdır.

Burada branch’ta yapılmış değişiklikleri main’e eklemek istediğimiz için base: main ve compare: branch olmalı.

Açıklama ekleyerek “Create pull request” butonuna tıkladığımızda, branch ve main arasında bir conflict yoksa “Merge pull request” butonu aktif olur. Yeni açıklama eklenerek “Confirm merge” tıklanır. Bununla birlikte her iki bölüm birbirine eşitlenmiş olur. Bu aşamadan sonra istenirse branch silinebilir. Bunu da aynı sayfadaki “Delete branch” butonu ile yapabiliriz.

!!! GitHub arayüzü kullanılarak yapılan bu merge işlemi remote’da yapıldığından lokal’deki dosyalarda değişiklik görüntülenmez. Bunu da yapabilmek için projenin en güncel hali olan son durumunu git pull komutu ile bilgisayarımıza çekmemiz gerekir.

Conflict oluşmasının sebeplerinden biri, aynı dosyanın aynı satır numarasına farklı branch’larda farklı kodların yazılmış olmasıdır.

Değişiklikler her iki branch’ta da ayrı ayrı commit ve push edilir. Sonrasında main’e geçerek yukarıda anlattığım gibi merge etmek istediğimizde conflict oluştuğunu, otomatik düzeltme yapılamadığını, conflict’ler düzeltildikten sonra commit edilmesi gerektiğini anlatan bir hata alırız. Kullandığımız IDE’ye döndüğümüzde (Visual Studio Code, Atom vs), hangi satırlarda conflict oluştuğu ve bununla ilgili yapılabilecekler ile ilgili seçenekler görünür.

Visual Studio Code’da Conflict Görünümü
  • Mevcut Değişikliği Seç (Current)
  • Branch’tan Gelen Değişikliği Seç (Incoming)
  • İki Değişikliği de Uygula
  • Farklılıkları Kıyasla

Hangisini uygulamak istediğimizi seçtikten sonra (ilk 3 seçenekten biri) commit & push işlemini gerçekleştirebiliriz. Main’de ilgili değişiklik yapılmış olur. Diğer branch’ta herhangi bir şey değişmez. Branch’a gelip aynı merge işlemini burada da yaparsak (ters merge), main dosyasının güncel hali ile conflict oluşmayacağı için iki branch başarılı şekilde birleşmiş olur.

git stash : yapılan bir değişikliğin commit’lemeden saklanması, lokal hafızada tutulması. Ne zaman kullanılır? Dosyamızda çalışmayan kod kısımları var diyelim. Aynı zamanda başka bir branch’tan çalışan değişiklikler gelecek. Bu değişiklikleri dosyamızla birleştirmeden önce çalışmayan kısımları stash ile gizleriz. Diğer branch’tan gelecek değişiklikleri merge ile alırız ve sonrasında git stash pop ile lokal hafızada geçici tuttuğumuz kodlarımızı geri getiririz. git stash apply ile de hem kodlarımızı lokal hafızaya atarız hem de görünmeye devam etmesini sağlarız.

git restore . : commitlenmemiş veya stash edilmemiş tüm değişiklikleri siler.

git reset --hard : Son commit’e geri döner, diğer tüm değişiklikleri siler ancak stash ile depolanmış değişiklikler hafızada tutulmaya devam eder. Yani git stash apply komutunu çalıştırdığımızda tutulan değişiklikler geri gelir. Bu komut commit’lenmeden önce yapılan değişiklikler için geçerlidir. Push edilmese bile commit edilen değişiklikler kayıt altında tutulur.

git revert commit id : yaptığımız her commit işleminde oldukça uzun bir commit id oluşturulur. Bunu git log komutuyla veya GitHub arayüzündeki commitlerin listelendiği ekrandan görebiliriz. Bu id ile revert komutunu çalıştırdığımızda projemiz o commitin yapıldığı ana geri döner. Ama bunu yaparken arada yapılmış değişiklikleri silmez bunun yerine yeni bir commitile ters değişiklik oluşturarak ilgili commit’e geri döndürür. Ve yeniden log ekranını açtığımızda en son commit’in mesajının REVERT anahtar kelimesi ile başladığını görürüz.

Git serimizden bilgiler bu kadar. Daha fazlası için yazılarımı okuyarak destek verirseniz çok memnun olurum. Umarım faydalı olur.

Teşekkürler.

Selin.

Hiç yorum yok: