Yazılım Geliştirme Sürecinde Git Komutları
“In open source, we feel strongly that to really do something well, you have to get a lot of people involved.” — Linus Torvalds
Projelerimizi bireysel veya bir takımın parçası halinde geliştirirken neden versiyon kontrolüne ihtiyaç duyduğumuzu bu serinin ilk yazısında belirtmiştim. Bir “Versiyon Kontrol Aracı” olarak “Git” in en önemli faydalarından birisinin uygulama geliştirme sürecinin takibini ve yönetimini kolaylaştırması olduğunu da açıklamıştım.
Peki biz bu aracı nerede ve nasıl kullanıyoruz? Örneğin bir web uygulaması geliştirdiğimizi düşünelim. Siteye, kullanıcıların satın aldıkları ürünlerin değerlendirmelerini yapabilecekleri bir yorum paneli ekliyoruz. İşte bu aşamada bir yerde yanlış kodları değiştirdik ve projeyi bozduk diyelim. Geri dönmek istiyoruz fakat hangi kodları nasıl değiştirdiğimizi hatırlamıyoruz. Yani bütün projeyi bozmuş olmaktan korkuyoruz. Git, işte bu aşamada bize kolaylık sağlıyor. Kısacası geri gelme, değişiklikleri iptal etme, yeniden oluşturma gibi özellikleri ile daha sağlıklı bir şekilde geliştirme yapabiliyoruz.
Herkese merhaba, yazılım geliştirme süreci ve proje takibi için versiyon kontrolü çok önemli. Bir önceki yazımda SCI, SCM ve VCS kavramlarını açıklayıp neden Git veya genel anlamda versiyon kontrolüne ihtiyaç duyduğumuzdan bahsetmiştim. Bu yazımda ise Git‘in bize sağladığı farklı görevleri yerine getiren komutlardan hangilerini, nerede ve nasıl kullanmamız gerektiğine değineceğim. Keyifli okumalar…
23 Sık Kullandığımız Komut
- Username ve Email Konfigürasyonu
- Git’in Projeye Dahil Edilmesi (Initializing a Repository)
- Dosyaların Working Directory’den Staging Area’ya Gönderilmesi
- Projede Dosyaların Durumu
- Değişikliklerin Commit Edilmesi
- Commit History’si ve O Commit’lerde Yapılan Değişiklikler
- Belirli Bir Commit’i Görüntülemek
- Değişiklikleri Commit Etmeden Önce Nelerin Değiştiğini Görüntülemek
- Amend ile Son Commit İşlemini Güncellemek
- Revert İşlemi İle Son Commit’i Geri Almak
- Revert İşlemi İle Herhangi Bir Commit’i Geri Almak
- Stash ile Değişiklikleri Rafa Kaldırmak
- Stash List İle Saklanan Stash’leri Görebilmek
- Pop Stash ile Rafa Kaldırılan Değişiklikleri Geri Getirmek
- Yeni Branch Oluşturmak ve Ona Geçiş Yapmak
- Mevcut Branch’lerin Listesi
- Mevcut Bir Branch’i Silmek
- Merge İle 2 Branch’ı Birleştirmek
- Local’de Çalıştığımız Projeyi Remote’a Eklemek
- Remote Repository URL Adresini Görüntülemek
- Remote Repository Hakkında Detaylı Bilgi Edinmek
- Local’deki Değişiklikleri Remote Repository’ye Push’lamak
- Pull İle Remote’taki Değişiklikleri Local’e Aktarmak
1.Username ve E-mail Konfigürasyonu
Proje geliştirme sürecinde yaptığımız değişiklikleri adım adım kaydederek ilerleriz. Uygulamaya eklediğimiz dosyaları kalıcı olarak Git veri tabanına işlemeye-kaydetmeye commit denir.
Commit işlemlerinin kimin tarafından yapıldığının belirlenmesi için git config komutunu kullanırız. Özellikle üzerinde bir takım olarak birkaç kişinin çalıştığı projelerde, hangi dosyayı kimin, nasıl değiştirdiğini görebilmek ve proje takibini sağlayabilmek için bu konfigürasyon işlemi oldukça önemlidir.
# Username
git config --global user.name “Berke Sayın"# Email
git config --global user.email "sayinberkesayin@gmail.com"
Bu şekilde kullanıcının kimliği belirlenmiş olur ve yapılan her commit işleminde, o değişikliğin kimin tarafından yapıldığı gösterilir.
2.Git’in Projeye Dahil Edilmesi
Sıradaki özellik ise git init komutu. Bu komut, bulunduğumuz dizinde .git adında bir dizin oluşturur ve projeyi bir Git repository’si haline getirir. Bu şu anlama gelir. Artık biz bu proje içerisinde Git’in bütün özelliklerini ve komutlarını kullanabiliriz.
git init
3.Dosyaların Working Directory’den Staging Area’ya Gönderilmesi
Yazılım geliştirme sürecinde, eklediğimiz, çıkardığımız yani üzerinde çalıştığımız dosyalardaki kodlar aslında “Working Directory “ denilen kısımda tutuluyor. Biz commit işlemi yapmak istediğimizde bunu tek aşamada gerçekleştiremiyoruz. İlk önce yapılan değişikliklerin working directory’den “Staging Area“ ya eklenmesi gerekiyor. Bu şu demek: Staging Area‘ ya alınan kodlar git tarafından izlenmeye alınır. Yani “Tracked” konumuna geçer. Biz bunu git add komutu ile gerçekleştiririz.
Üzerinde değişiklik yaptığımız bir dosyayı Staging Area’ya ekleyelim:
# Only one file
git add somefile.js
Eğer üzerinde çalıştığımız birden çok dosya varsa ve hepsini tek seferde Staging Area’ya eklemek istiyorsak şöyle yaparız:
# All files
git add .
Bu şekilde üzerinde değişiklik yaptığımız bütün dosyalar staging area’ya eklenir ve böylece commit edilmeye hazır hale gelir.
4.Projede Dosyaların Durumu
Biz şu anda hangi dal üzerinde çalışıyoruz, en son commit işleminden sonra hangi dosyalarda değişiklik yaptık(modified), değiştirilen dosyalardan hangilerini Staging Area’ya ekledik(Staged), hangileri hala Unstaged durumunda gibi soruların cevabını öğrenmek için git status komutunu kullanırız.
git status
5.Değişikliklerin Commit Edilmesi
Commit, kelime anlamı olarak “işlemek, kaydetmek” demektir. Git’e eklediğimiz dosyaları kalıcı olarak Git veri tabanına işlemeye commit denir. Projede belirli işlemleri yaptıktan sonra dosyaları anlamlı mesajlar ile commit etmek gerekir.
Örneğin bir uygulama için kullanıcı kayıt ekranı oluşturduk, o işlemi anlamlı şekilde mesajını yazarak commit etmemiz gerekir. Bunun gibi, proje sürecinde, geliştirdiğimiz her birbiriyle alakalı kod bloğu için ayrı ayrı commit’ler almamız projenin takip edilebilir olması açısından önemlidir.
Commit işlemini 2 aşamada gerçekleştirdiğimizden bahsetmiştim. Değişiklik yapılan dosyalar ilk olarak git add komutuyla Staging Area’ya taşınır. Orada Git dosyaları takibe, izlemeye alır. Daha sonrasında ise Staging Area’da bulunan dosyalar commit edilebilir. Bunun için de git commit komutunu kullanırız.
git commit -m “Commit message here.”
Commit için mesaj yazarken o mesajın yapılan işlem hakkında bilgi verici olması, geriye dönük olarak proje history’sini izleme konusunda bize yardımcı olur. Bu sebeple birbiriyle bağlantılı değişiklikleri adım adım mantıklı mesajlarla commit ederek ilerlemek gerekir.
6.Commit History’si ve O Commit’lerde Yapılan Değişiklikler
Yazılım geliştirme sürecinde değişiklikleri anlamlı şekilde commit ederek ilerlememiz gerektiğinden bahsetmiştim. Peki biz projemizde şimdiye kadar hangi commit işlemlerini gerçekleştirdik, o commit işlemlerinde hangi dosyalar nasıl değiştirildi gibi soruları nasıl öğreniriz? Bunun için de git log komutunu kullanırız.
git log
Bu komutla birlikte yapılan bütün commitler sırayala isimleri ve commit id’leri ile birlikte listelenir. Ayrıca hangi commit işlemi, kim tarafından, ne zaman gerçekleştirilmiş, bu da gösterilir.
git log -p
Bu komut ise ayrıca commit işlemi ile ilgili ayrıntıları da gösterir. Yani hangi dosyaya neler eklendi veya çıkarıldı, yani yapılan commit ile neler değiştirildi gibi bilgileri öğrenmek için git log -p komutunu kullanırız.
7.Belirli Bir Commit’i Görüntüleme
Eğer geçmişe dönük olarak belirli bir commitle ilgili değişiklikleri görüntülemek, listelemek istersek bu durumda show parametresiyle birlikte seçmek istediğimiz commit’in ID/Hash değerini yazarız.
# Örnek olarak bir commit'in ID'si
git show 5af5ad7f5b8aeb7de8701e3bdd44180dbd08c476
Bu durumda bu ID değerine sahip commit işleminin ayrıntıları görüntülenir.
8.Değişiklikleri Commit Etmeden Önce Nelerin Değiştiğini Görüntüleme
Son commit işleminden sonra bazı dosyalarda değişiklik yaptık. Bir şeyler ekledik veya çıkardık. Fakat yeni commit işlemini gerçekleştirmeden önce bu değişiklikleri görüntülemek istiyoruz diyelim. Bu durumda da git diff komutunu kullanırız. Yani bu komut ile son commit işleminden sonra yapılan değişiklikleri, farklılıkları görebiliriz.
# Son commit işleminden sonra hangi dosyalar nasıl değişti?
git diff
Son commit işleminden sonra yine bir şeyler değiştirdik. Yapılan değişikliklerden bazılarını Staging Area’ya aldık ve sadece Staged durumundaki dosyalarda yapılan değişiklikleri görmek istiyoruz. Bu durumda da şu komutu kullanırız.
# Staging Area'ya alınan dosyalardaki değişiklikler
git diff --staged
Yine son commit işleminden sonra birden çok dosyada değişiklik yaptık, ama sadece belirli bir dosyada yapılan değişiklikleri görmek istiyoruz. Bu durumda da git diff komutunu şu şekilde kullanırız.
# Belirli bir dosyada yapılan değişiklikler
git diff somefile.js
9.Amend ile Son Commit İşlemini Güncelleme
Commit Amend işlemi yapılan son commit üzerinde değişiklik yapmamıza izin verirken ayrıca commit mesajını da update edebilmemize olanak sağlıyor. Yani diyelim ki şöyle bir durum oldu. Biz değişiklikleri yaptık ve commit ile kaydettik. Fakat daha sonra o commit ile bağlantılı olduğunu düşündüğümüz bir işlem aklımıza geldi, keşke şu kod bloğunu da ekleyip öyle commit operasyonunu gerçekleştirseydik dedik. İşte bu durumda commit amend kullanabiliriz. Yani commit amand; son commit işleminden sonra yapılan değişiklikleri o son commit üzerine yazar, ona ekler.
# Commit Amend
git commit — amend -m “Son commit için güncellenmiş mesaj”
10.Revert İşlemi İle Son Commit’i Geri Alma
Şimdi ise Revert işlemi nedir, ne yapıyor bundan bahsedelim. Revert ile belli bir commit’i geri alabiliyoruz. Burada dikkat etmemiz gereken nokta şu: Bu işlem ile o commite geri dönmüyoruz, bu olay; yapılmış olan o commit’i geri almayı ve yok saymayı sağlıyor.
Bu durumda o commit olduğu yerde duruyor. Fakat revert işlemi yapılan ayrı bir commit projeye ekleniyor. Eğer çakışmamız yoksa ve hata almıyorsak, yeni commit ile beraber, o commit içerisindeki işlemler projeden kaldırılıyor.
Örneğin index.html isimli bir dosyamız var. O dosya içerisine p elementi ile paragraf ekledik ve “Add paragraph” mesajıyla commit işlemini gerçekleştirdik. Daha sonra bu değişikliğin projemizde bulunmasından vazgeçtik ve kaldırmaya karar verdik. Bunun için de revert komutunu kullandık. Bu durumda otomatik olarak Revert “Add paragraph” isimli yeni bir commit oluşturulur. Ve bu yeni Revert commit’i ile “Add paragraph” commit işleminde yapılan değişiklikler kaldırılır.
# Yapılan son commit için revert işlemi
git revert HEAD
11.Revert İşlemi İle Herhangi Bir Commit’i Geri Alma
Revert komutunu kullanırken dikkat etmemiz gereken bir diğer nokta da şu: Revert işlemlerini çakışma olmaması için(best-practice kapsamında) son committen başlayarak yapmakta fayda var. Çakışma olursa eğer o çakışmaların kaldırılması, çözülmesi(resolve) gerekir.
Eğer Revert komutu ile herhangi bir commit işlemini iptal etmek istiyorsak bu durumda revert komutu ile birlikte iptal etmek istediğimiz commit’in ID’sini kullanırız.
# İptal edilmek istenilen commit'in ID'si ile revert
git revert ae4746b5e0a1a1e10bf9743112b99ec9eb9e1499
12.Stash ile Değişiklikleri Rafa Kaldırmak
Stash aslında yine git üzerinde oldukça kullanışlı bir komut ve özellik. Yaptığımız ya da o an üzerinde çalıştığımız değişiklikleri geçici olarak bir rafa kaldırmak gibi düşünülebilir.
Bu işlemi bir örnekle açıklamak istiyorum. Bir web uygulaması için alışveriş sepeti geliştiriyoruz ve o sırada bize yeni bir görev geliyor. O yeni görevde de bizden kullanıcı profili sayfasına ekleme yapmamız isteniyor. Bu 2 görev birbiriyle tamamen bağlantısız işlemler. Bu durumda biz üzerinde çalışmakta olduğumuz alışveriş sepeti sayfası için son commit’ten itibaren yaptığımız değişiklikleri geçici olarak rafa kaldırmak, daha sonra çalışmaya devam etmek istiyoruz. Burada dikkat etmemiz gereken nokta şu: O değişiklikleri Staging Area’ya almıyoruz veya commit etmiyoruz. Daha sonra kaldığımız yerden devam etmek üzere rafa kaldırıyoruz. İşte bu noktada git stash komutunu kullanıyoruz.
git stash save “Stash mesajı”
Bu durumda son commit işleminden sonra yapılan bütün değişiklikler girilen stash mesajı ile saklanır, rafa kaldırılır. Böylece biz diğer görevimiz üzerinde çalışabiliriz.
13.Stash List İle Saklanan Stash’leri Görebilmek
Biz ayrıca birden fazla stash işlemi de gerçekleştirip birbirinden bağımsız değişiklikleri ayrı ayrı rafa kaldırabiliriz. Bunun için yine git stash save komutunu kullanırız ve her bir işlemi onları tanıyabileceğimiz kendi isimleriyle kaydederiz. Daha sonrasında da eğer bizim rafımızda kaç ayrı stash var, bunlar hangileri şeklinde onları görüntülemek istersek stash list komutunu kullanırız.
git stash list
14.Pop Stash ile Rafa Kaldırılan Değişiklikleri Geri Getirmek
Git stash komutunu kullanarak birden fazla kez stash işlemini gerçekleştirdik ve böylece listemizde birden çok stash bulunuyor. Fakat biz şu anda sadece birisini geri getirip üzerinde çalışmaya devam etmek istiyoruz. Bu durumda git stash pop komutunu kullanırız.
Biz git stash list ile bütün stashleri sırası ve ismiyle birlikte görüntüleyebiliyoruz. Eğer listeden özellikle geri getirmek istediğimiz bir stash varsa bu durumda onu sahip olduğu sıra ile çağırırız.
# Index'i 2 olan stash'ı getir.
git stash pop stash@{2}# Index'i 1 olan stash'ı getir.
git stash pop stash@{1}# Index'i 0 olan stash'ı getir.
git stash pop stash@{0}
15.Yeni Branch Oluşturmak ve Ona Geçiş Yapmak
Brach; üzerinde çalıştığımız projenin herhangi bir commit noktasından, örneğin commit 4 olabilir veya commit 1, commit 2 olabilir, son versiyon veya ilk versiyon olabilir, yani projenin herhangi bir commit noktasından o anki commitin kopyasının alınarak üzerinde korkusuzca geliştirme yapabileceğimiz bir kopyasının oluşturulmasıdır.
Biz bu branch’ e isim veririz ve bunun üzerinde istediğimiz kadar commitler, farklı işlemler yapıp, bildiğimiz o stash’leri kullanabliriz, farklı denemeler yapabilirz, yani ayrı bir kopya üzerinde çalışırız, ilerleriz.
Sonra da istersek bu kopyanın üzerindeki değişiklikleri bu ayrı dal üzerinde ayrı bir versiyon olarak devam ettiririz, yani projeye bu noktadan devam ederiz, istersek de bu branch’teki değişiklikleri ana projeye yani ana kısma tekrar dahil edebiliriz ki bu dahil etme işlemine de merge deriz. Merge yapıp sonrasında istersek (keyfimize kalmış) branch’i de silebiliriz.
Bu işleme branching ve merging deniyor. Bu çok kullanışlı bir özellik. Korkusuzca bir şeyleri değiştirebilmemizi, projenin üzerine oynamamızı sağlıyor. Bu sayede projeyi bozmaktan korkmadan ilerleyebiliriz.
Yeni bir branch oluşturmak için branch parametresini kullanırız.
# Üzerinde çalıştığımız master branch'ten new-feature-1 isminde yeni branch oluşturma
git branch new-feature-1
Bu komutla beraber new-feature-1 isminde yeni branch’imiz oluştu. Fakat biz şu anda hala master branch üzerinde çalışmaya devam ediyoruz çünkü bu komut sadece yeni branch oluşturur, ona geçiş yapmaz.
Eğer mevcut branch’lerden herhangi birisine geçiş yapıp onun üzerinde değşiklik yapmak, ilerlemek istiyorsak checkout parametresini kullanırız. Örneğin şu anda master branch’teyiz ve new-feature-1 isimli branch’e geçiş yapmak istiyoruz:
git checkout new-feature-1
Bu komutla beraber artık new-feature-1 isimli branch’e geçmiş oluruz.
16.Mevcut Branch’lerin Listesi
Projenin farklı noktalarından farklı şekilde dallanma yapısına gidebildiğimizden daha önce de bahsetmiştim. Yeni branch oluşturma konusunda herhangi bir sayı sınırı yoktur. Hangi noktada nasıl bir şekilde ilerleme düşünüyorsak yeni branch oluşturabiliriz.
Projemizde birden fazla branch yapısının bulunması durumunda mevcut bütün branch’lerimizi listeleyebilmek, görebilmek isteriz. Bu durumda branch komutuyla birlikte list flag’ını kullanırız.
# Mevcut branch'lerin listesi
git branch --list
17.Mevcut Bir Branch’i Silmek
Yeni bir özellik denemek için yeni bir branch oluşturduğumuzu varsayalım. Bu durumda o branch üzerinde geliştirme yaparken istediğimiz sonucu elde edemedik veya çalışmadı, işe yaramadı. Bu durumda tekrar master branch’e dönüp o branch’i silmek isteyebiliriz.
Veya yeni branch üzerinde yaptığımız değişiklikleri çok beğendik, işe yaradı ve o değişiklikleri ana klasöre(master branch’e) taşımak, onun üzerinde devam etmek istiyoruz. Bu durumda yine o branch’i silmek isteyebiliriz.
Herhangi bir sebepten dolayı bir branch’ı silmek istiyorsak şu komutu kullanırız.
# new-feature-1 isimli branch'ı silmek istiyoruz.
git branch -d new-feature-1
18.Merge İle 2 Branch’ı Birleştirmek
Örneğin yeni bir özellik denemek istiyoruz. Bu durumda master branch’ten new-feature-1 isimli yeni bir branch oluşturduk ve onun üzerinde geliştirmeler yaptık. Yaptığımız değişiklikleri, denediğimiz yeni özelliği de beğendik ve o değişiklikleri ana klasöre(master branch’e) taşıyıp onun üzerinde ilerlemek istiyoruz. Bu durumda merge komutunu kullanırız.
İlk önce merge işlemini yapmak istediğimiz branch’e(değişiklikleri taşımak istediğimiz dal) geçiş yaparız. Bizim durumumuzda bu master branch oluyor. Çünkü biz new-feature-1 isimli branch’teki değişiklikleri master’a taşımak istiyoruz.
# master branch'e geçelim
git checkout master
Şimdi artık master branch üzerindeyiz ve new feature-1 isimli dalda yaptığımız değişiklikleri buraya taşımak(kopyalamak) istiyoruz. Artık merge komutunu kullanabiliriz.
git merge new-feature-1
Böylelikle new-feature-1 isimli dalda yaptığımız değişiklikleri ana klasöre(master branch’e) taşımış olduk. Artık istersek(keyfimize göre) new-feature-1 dalını silebiliriz.
19.Local’de Çalıştığımız Projeyi Remote’a Eklemek
Bu konu başlığı altında öncelikle “local” ve “remote repository” kavramlarını açıklamak istiyorum.
- Local Repository: Bilgisayarımızda bir proje klasörü oluştururuz. Daha sonra git init ile git’i projemizde dahil ederiz. Bu komut klasörümüzün içerisine .git isimli, git’in bütün özelliklerini projemizde kullanabilmemizi sağlayan bir klasör ekler. Bu şekilde kendi cihazımızda bulundurduğumuz git repository’si local olarak adlandırılır.
- Remote Repository: Bir git remote repository’si ise server’da kod hosting platformlarda tutulur. Bu duruma örnek olarak GitHub’ı verebiliriz.
Proje klasörümüze git init ile git’i dahil ettiğimizden bahsetmiştim. Bu şekilde projemizi git komutları ile yönetebiliriz. Fakat bu durumda hala local repository konumunda bulunuyor. Eğer biz bu repo’yu aynı zamanda remote’a taşımak istersek, GitHub’da bir repository oluşturup onun URL’sini remote add komutu ile birlikte kullanabiliriz.
git remote add my-app https://github.com/someurl..
20.Remote Repository URL Adresini Görüntülemek
Remote repository’nin URL adresini görüntülemek için şu komutu kullanırız.
git remote -v
21.Remote Repository Hakkında Detaylı Bilgi Edinmek
Remote repository’miz hakkında daha detaylı bilgi edinmek için şu komutu kullanırız.
git remote show origin
“origin” burada remote adresimizi temsil ediyor, onun yerine URL’de kullanabiliriz.
22.Local’deki Değişiklikleri Remote Repository’ye Push’lamak
Local’de projemizi geliştiririz, değişiklikler yaparız. Fakat bu durumda bu değişiklikler direkt olarak remote’a yansımaz. Local’deki değişiklikleri remote’a da eklemek için git push komutunu kullanırız.
git push origin master
Burada “origin” repository adresimiz, “master” ise değişiklikleri kaydetmek istediğimiz branch adımız oluyor.
23.Pull İle Remote’taki Değişiklikleri Local’e Aktarmak
Aynı şekilde remote repository üzerinde değişiklikler yaparız. Bu durumda da o değişiklikler direkt olarak local’de gözükmez. Remote’taki değişikliklerin local’e dahil edilmesi için de git pull komutunu kullanırız.
git pullgit pull origin master
Git ve GitHub ile Versiyon Kontrolü serimin 2.yazısında proje geliştirme sürecinde en sık kullandığımız Git komutlarını ve kullanılma yöntemlerini açıklamaya çalıştım. Serinin gelecek yazılarında görüşmek üzere :)