Uzak sunucularla calismak

Git Remote 2: Birlikte Çalışmak ve Protokoller

Merhabalar. Git derslerimize Git Remote 2 dersimiz ile kaldığımız yerden devam ediyoruz. Git Remote 1 dersimizde ücretsiz git servislerine hesap ve depo açıp bu depoya commit yapmıştık. Bu dersimizde artık başka birini projeye dahil edip iki yerel depo ile çalışacağız.

Başka Bir Hesap Gerekli mi?

Başka bir hesap açmanıza gerek yok. Daha önce açtığımız hesabımız ile iki kişi ve daha fazlası çalışıyor gibi çalışabiliriz. Fakat bize yeni bir yerel depo gerekiyor.

Git clone

Diyelim bir kişiyi daha projenize dahil etmek ona da commit gibi yetkiler vermek istiyorsunuz. O kişi hesabını açtıktan sonra kullanıcı adı üzerinden depolara yetki verebilirsiniz. Bunun için ilgili servisin ‘Members’ ayarlarından bunu gerçekleştirebilirsiniz. Bu işi size bırakıyorum. Fakat yukarda dediğim gibi deneme yapmak için buna ihtiyacımız yok.

Diyelimki yetkileri ayarladık ve bu kişi kendi bilgisayarında sizin projenizi indirip (download) katkı sağlamak istiyor. Bunun için git clone komutunu kullanabiliriz.

Şimdi komut satırından yerelimizdeki half-life-2 dizini dışında başka bir yere gidiniz. Ben bir üst dizini tercih ediyorum siz de öyle yapabilirsiniz. Hatırlarsanız her git deposunun bir URL’i vardı. URL’i bulup aşağıdaki komutu çalıştırınız.

git clone <url> <dizin-adi>

Dizin adı olarak istediğinizi verebilirsiniz ben half-life-2-cloned adını tercih ettim.Sondaki dizin adı yani son parametre opsiyoneldir. Eğer vermezseniz uzak depodaki adı kullanır.

Şimdi yeni dizinimize gidelim ve git status komutu ile bakalım.

Gördüğünüz üzere artık yeni bir yerel depomuz var. Daha önce yarattığımız yerel depo bundan tamamen farklıdır. Fakat aynı uzak sunucuya bağlıdır. Bunu farklı bir bilgisayarda farklı bir kullanıcı olarak düşünebilirsiniz. Neticede başka bir kişi de olsa aynı işlemleri gerçekleştirecekti.

Şimdi yeni bir chapter daha ekleyelim. Aşağıdaki satırları ekleyip commit yapalım.

 

Şimdi geçen dersimizden hatırladığımız gibi bunu uzak sunucuya gönderelim. Daha önceki işlemden tek farkı yeni branch yerine var olan bir branch’e yeni bir commit göndereceğiz. Bunun için yine git push komutunu kullanacağız.

git push origin master

Şimdi git servisine gidip yeni gönderdiğimiz commit’i görebilirsiniz. Böylece farklı bir yerel depodan aynı uzak depoya katkıda bulunmuş olduk.

Git fetch

Şimdi daha önce kullandığımız depoya geri dönelim.

cd ../half-life-2

Bu yerel depodaki commit’lere ve story.txt dosyasına göz atalım.

Anlayacağınız üzere bu depoda son yaptığımız commit yok. Bunu da bir önceki geliştiricinin durumu olarak düşünebiliriz. Bir depoya commit göndermeyi öğrendik fakat henüz bir depodan commit almayı öğrenmemiştik. Bunun için öncelikle ‘git fetch’ komutunu çalıştıralım.

git fetch

Bu komuttan sonra da incelerseniz yine yerel depomuzda yeni commit’i göremeyeceğiz. Fakat bunun yerine yerel depodaki branch listesine bakalım. Bu sefer ‘-a’ parametresi ile yapacağız.

git branch -a

chapter1
chapter2
chapter3
chapter4
chapter5
* master
remotes/origin/master

Listeye bakarsanız ‘remotes/origin/master’ diye bir branch daha görürüz. Hatırladığınız gibi böyle bir branch yaratmamıştık.

Yerel depodaki uzak branch’ler

Git’in dağıtık olduğunu tekrar hatırlatalım. Bu yüzden aslında uzak depodaki branch ile yerel depomuzdaki master branchleri isimleri aynı olsa da aslında farklı branchlerdir. Git bu yüzden uzak depoların birebir kopyasını farklı bir isimde ve sadece okumaya açık şekilde (readonly) tutar. Bu branch’lerin adları da ‘/’ formatındadır. Yani bizim durumumuzda branch adı origin/master olur. Eğer yerelinizde o branch yoksa git checkout <branch-adi> yeni bir yerel branch yaratır. Bunu da dipnot olarak verelim.

origin/master bir branch değil mi? O zaman checkout ile bakabiliriz.

Gördüğünüz gibi diğer geliştiricinin yaptığı değişiklikler burda. Peki neden bu şekilde çalışmalıyız? Sizin yereldeki deponuz henüz yeni commitlere hazır olmayabilir. O yüzden bu zamana kendiniz karar vermelisiniz.

Kısaca özetlersek git fetch komutu uzakdaki depoyu yerel depo ile bu şekilde senkronize eder. Dilerseniz ‘git fetch ‘ şeklinde de verebilirsiniz. Bu sayede sadece tek bir branch’i senkronize edecektir.

Git pull

Peki bu değişiklikleri nasıl alacağız? Normalde master‘a geri dönüp git merge origin/master komutu ile bu işlemi yapabiliriz. Fakat bunun yerine başka bir komut göreceğiz. ‘master”a geri dönerek git pull komutunu çalıştıralım.

git pull origin master

Şimdi tekrar kontrol ettiğimizde son değişikliğin geldiğini görebiliriz.

Git pull komutunun detayına inersek. Aslında bizim yukarda bahsettiğimiz merge işlemini yapmış oldu. Fakat git pull bundan önce git fetch komutunu da çalıştırdı. Özetlersek:

git pull = git fetch + git merge diyebiliriz

Protokoller

Bugüne kadar HTTPS ile çalıştık. Fakat git birden fazla protokol ile de çalışabilir.

Yerel Depoyu Klonlamak

Uzak depoyu klonladığınız gibi yerel depoyu da klonlayabilirsiniz. Üstelik remote ayarlarınız da aynı kalır.

git clone half-life-2 half-life-2-backup

HTTPS

Daha önce de kullandığımız gibi git HTTPS ile çalışabilir. HTTP ile de çalışabilir ama HTTPS olmayan bir servisten uzak durun. HTTPS ile çalışırken kimliklendirme (authentication) ve yetkilendirme (authorization) için kullanıcı adı ve parola kullanır.

SSH

Git, doğal olarak SSH ile de çalışabilir. SSH protokolünü kullananlar bilirler. Genellikle private ve public anahtar kullanılır. SSH protokolü üzerinden işlem yaparken kullanıcı adı olarak da ‘git’ kullanıcısını kullanır. Bu arada ben de bugüne kadar hep bu yöntemi kullandım.

Private ve Public anahtar üretme

Bu anahtarları üretmek çok basit. Öncelikle aşağıdaki komutu çalıştırınız.

ssh-keygen -t rsa -b 4096 -C "[email protected]"

Anahtar boyutunun 4096 olması çok önemli olduğunu da hatırlatalım. Bu komut ile beraber size hangi dosyaya kaydedeceğini sorar. Eğer daha önce oluşturmadıysanız varsayılanı kullanabilirisiniz.

Sonraki aşamada size parola soracaktır. Burdaki seçenek size kalmış eğer çok özel bir repo da çalışıyorsanız mutlaka parola koymanızı tavsiye ederim. Eğer disk bölümünüz şifreli değilse yine mutlaka parola koymanızı tavsiye ederim.

Böylece yeni bir public ve private anahtar üretmiş olduk. Linux kullanıcıları için genellikle ‘/home/kullanici.adi/.ssh’, OS X için ‘/Users/kullanici.adi/.ssh’ dizininin altında ilgili anahtarları bulabilirsiniz. Windows için ise nasıl bulacağınızı size bırakıyorum. (YN: Windows test). Private anahtarınız verdiğiniz dosya adı ile birebir aynıdır. Public ise sonunda ‘.pub’ uzantısı ile bulacaksınız. Örneğin benim ürettiğim public anahtar:

Şeklindedir. Dikkat ettiyseniz public anahtar adı üstünde herkesle paylaşabilirsiniz. Ben de bu yüzden bu anahtarı burda paylaşabiliyorum. Private anahtar ise

ile başlar. Bu şekilde ayırt edebilirsiniz. Bu arada private anahtarı da lütfen herhangi bir yerde paylaşmayın demeyi de atlamayayım.

Git ile kullanmak

Git ile ssh protokolünü ürettiğimiz anahtarlarla kullanmak için profil ayarlarından SSH public anahtarınızı ekleyebilirsiniz. Yine hatırlatayım public anahtarı ekleyeceksiniz. Private anahtarı git istemcisi yetkilendirme için kullanacak. Şu ana kadar half-life-2 deposunda HTTPS kullandık. SSH’a geçmek için ‘[email protected]’ ile başlayan URL’e ihtiyacınız var. Uzak deponuzdan bu URL’i bulabilirsiniz. ‘half-life-2’ nin bulunduğu dizine giderek aşağıdaki komutu çalıştırabilirsiniz.

git remote set-url origin <URL>

Daha sonra ‘fetch’ yaparak test edebilirsiniz.

Bu arada private anahtarın parolasını sürekli sormasın istiyorsanız her oturumda

ssh-add -K ~/.ssh/id_rsa komutunu çalıştırabilirsiniz.

Git Remote 2: Birlikte Çalışmak ve Protokoller dersimizde başka biri projeye nasıl dahil olur, bir depo nasıl klonlanır, ‘remote branch’ten nasıl commit alınır ve son olarak da protokolleri gördük. Bu dersi bitirdiyseniz artık projelerinizde git kullanabilirsiniz.

Konu hakkında görüş ve sorularınızı yorum kısmından veya Soru & Cevap sitemizden sorabilirsiniz.

Bir sonraki derste görüşmek üzere…

Git derslerinin tamamı için tıklayınız.

Ömer Özkan

Genelde Java teknolojileri ile geliştirme yapar. Özgür ve açık kaynak yazılımlara meraklıdır. Boş zamanlarında gönüllü eğitimler verir. Onun için Clean Code, Test Driven Development gibi konular oldukça önemlidir.

Yorum Yaz

Haftalık Bülten

Mobilhanem'de yayınlanan dersleri haftalık mail almak ister misiniz?