git dersleri

Git Stash ile Değişiklikleri Saklayın

Merhaba, bu dersimizde git’in geliştirme yaparken kullanılan özelliklerinden biri olan git stash’i göreceğiz. Git stash, değişiklikleri commit’lemeden yerel depoya kaydetmeyi sağlayan bir araçtır.

Kendinize bir iş seçtiniz, bir branch oluşturdunuz ve o işe odaklandınız. O arada takımdan bir arkadaşınız geldi ve sizden başka branch’teki bir koda bakmanızı istedi. Ya da acil gitmesi gereken bir işi bitirip sizin de o kodu gözden geçirmenizi ve onay vermenizi istedi. Diğer bir senaryo siz odaklanmış branch’te çalışırken çok kritik bir hata aldınız ve hemen master’a dönüp o hatayı düzeltmeniz gerekiyor.

Bu durumda hemen o branch’te artık ne yaptıysanız onu commit’leyip gitmeniz gereken branch’e geçebilirsiniz. Fakat git’in bize sunuduğu stash’i de kullanabiliriz.

Chapter 9

Bildiğiniz gibi ‘half-life-2’ projemizde sıradaki bölümümüz 9’un hikayesini yazmaya başlayalım. chapter-9 adlı bir branch oluşturup aşağıdaki satırları ekleyelim ve commit’leyelim.

Chapter 9
=============

Gordon gains access to Nova Prospekt, a Combine base, and a former prison, breaching its defenses with the help of an army of Antlions, with the goal of finding and rescuing the captured Resistance leader, Eli Vance. This is also the last chapter where Antlions are encountered, because the player soon leaves Antlion Territory. The player is introduced to Combine Turrets here as well.

Siz ekip arkadaşlarınıza ve patronunuza ‘chapter 9’ u eklediğinizi ve branch adını belirttiniz. Bir sonraki işiniz 10. bölümü yazmaya başladınız. Ama henüz bitirmediniz yani commit’e henüz hazır değil.

Chapter 10
=============

Upon arriving in Kleiner's Lab after teleporting away from the Depot, Gordon Freeman and Alyx Vance discover they have been stuck in a teleport "loop" for approximately one week. They find that the teleport caused the destruction of Nova Prospekt, and the blow they struck there was taken as a sign to begin The Uprising. The two factions have been locked in combat for a week and all of City 17 is a warzone. Freeman goes on to aid in the battle, while Alyx remains in Kleiner's Lab to help him escape the city.

Tam da o anda patronunuz veya ekip arkadaşınız geldi ve ‘9. bölüm ile ilgili sorular var. Ekip şu an üzerinde çalışıyor, ona dönüp tekrar bakar mısın? Durum biraz acil.’ dedi.

Burada chapter-9 branch’ine dönemeyiz. story.txt dosyasını değiştirdik. Yapabileceğimiz birden fazla seçenek var. Örneğin son yaptığımız işi commit’leyip mesajına birşeyler yazıp daha sonra 9. bölüm ile işimiz bittiğinde geri dönüp bu commit’i geri alıp üzerinde devam edebiliriz. (İlerleyen derslerimizde bunu göreceğiz.) Diğer bir yöntem git stash kullanabiliriz.

Git Stash

En hızlı çözüm olarak git stash komutunu parametresiz olarak kullanabiliriz.

Yaptığımız değişiklikler bir anda gitti. Git stash yaptığımız değişiklikleri farklı bir şekilde kaydederek projedeki değişiklikleri de geri aldı. Bu sayede chapter-9‘a geri dönebildik. Şimdi bu branch’te istenilen değişiklikleri de yapıp chapter-10‘a yani uğraştığımız asıl işe geri dönelim. Aşağıdaki paragrafı chapter-9 da story.txt dosyasına ekliyoruz.

Gordon meets up with Alyx Vance in the Nova Prospekt train depot. They discover that Dr. Mossman was actually a Combine spy working on Breen's side. Together, they search the prison for Eli Vance and Judith Mossman, all the while fighting off security forces. They split up several times, but finally they reunite to track down Mossman. She teleports herself and Eli out of the facility, getting to the Citadel, forcing Alyx and Gordon to take the risk in using the same teleporter to get back to Kleiner's lab.

Not: git stash komutunu git stash push olarak da kullanabilirsiniz.

Git Stash Pop

‘chapter-9’ ile işimiz bittiğine göre ‘chapter-10’ daki işimize devam edelim. chapter-10branch’ine geçtiğimizde ve git stash pop komutunu kullanalım.

Gördüğünüz gibi yaptığımız değişiklikler geri geldi ve artık üzerinde çalışabiliriz.

Git Stash Çalışma Prensibi

Anlayacağınız gibi git stash aslında stack yapısına sahiptir. Kaydederken git stash push ve geri alırken git stash pop komutunu kullandık. Push işleminde yaptığımız değişikliği en üstte koyarken, pop işleminde en üstteki değişikliği alıp uygular ve stash deki ilgili kayıt silinir. Yani pop işleminden sonra aynı işlemi tekrar yapamazsınız.

Mesaj Girmek

git stash push yaparken mesaj da verebilirsiniz. Bu sayede geri döndüğünüzde kendinize bir not eklemiş olursunuz. Şimdi dosyayı biraz daha düzenleyip tekrar stash’e kaydedelim. Yapacağımız değişiklikten sonra 10. bölüm aşağıdaki şekilde olacaktır.

Chapter 10
=============

Upon arriving in Kleiner's Lab after teleporting away from the Depot, Gordon Freeman and Alyx Vance discover they have been stuck in a teleport "loop" for approximately one week. They find that the teleport caused the destruction of Nova Prospekt, and the blow they struck there was taken as a sign to begin The Uprising. The two factions have been locked in combat for a week and all of City 17 is a warzone. Freeman goes on to aid in the battle, while Alyx remains in Kleiner's Lab to help him escape the city. The player is able to form small squads of citizens to help fight their way through the city towards Barney's location. Near the end of the chapter, Alyx finds that the bridge to Barney's location is destroyed. She climbs up a building and tries to return to help Gordon but is captured by Combine soldiers and taken to the Citadel.

Değişiklikleri görme

Burda bir komut daha görüyoruz. git stash list bize stash’e kaydedilmiş değişiklikleri listeliyor. Şimdi git stash show <stash-id> komutu ile ne kaydedildiğini görelim.

git stash apply

Aynı şekilde git stash pop yerine git stash apply <stash-id> komutunu da kullanabilirsiniz. Aradaki tek fark pop stash’deki değişikliği silerken apply sadece değişikliği uygular ama stash’deki kayıt kalmaya devam eder.

git stash branch

Stash, branch’ten bağımsız bir şekilde çalışır. Örneğin chapter-10 branch’ini yanlışlıkla silseniz dahi farklı bir branch’e uygulayabilir ya da yeni bir branch oluşturup bu branch üzerinden devam edebilirsiniz. Şimdi ‘yanlışlıkla’ chapter-10 branchini silip git stash branch <stash-id> ile yeni bir branch’e geçelim. Bu arada stash id tanımlamazsanız en sondaki stash kullanılır.

Bu şekilde istediğimiz değişikliği istediğimiz bir branch’e geçerek devam edebiliriz.

Drop ve Clear

Stash listesini temiz tutmak oldukça önemlidir. Eğer sizin için önemsiz değişiklik varsa bunu git stash drop <stash-id> ile silebilir ya da tamamını silmek isterseniz git stash clear komutunu kullanabilirsiniz.

Şimdi değişikliğimizi commit’leyip stash’i temizleyelim.

Notlar

Stash’i öğrendikten sonra kişisel olarak düşüncelerimi de belirtmek istedim. Ben genellikle stash kullanmaktan kaçınıyorum. Bunun sebebi çok fazla stash kullanıldığında stash listesi bir karmaşa haline geliyor. Genellikle hızlıca branch geçişlerinde veya pull işlemlerinde hemen git stash sonra git pull ve ardından git stash popkomutlarını kullanıyorum. Eğer stash’i sürekli kullanıyorsanız mutlaka mesajla birlikte kaydedin. Sürekli stash listenizi temiz tutmaya çalışın. Eğer stash’i sürekli olarak kullanıyorsanız mutlaka mesajla birlikte kullanın. Bu sayede en azından değişikliğin ne olduğuna dair size ipucu vermiş olur.

Bir diğer durum da eğer yerel deponuzu bir şekilde kaybederseniz stash’lere de depo ile beraber veda etmiş olursunuz. Çok önemli bir projede çok önemli bir özellik geliştiriyorsanız bu değişiklikleri stash’de tutmak ölümcül olabilir. Bir gün sonra bilgisayarınızın diski yanmış halde bulabilirsiniz. O yüzden branch’te yeni bir commit oluşturup bunu da uzak depoya mutlaka gönderiyorum. Sonraki gün o commit’i geri alıp üzerinde çalışmaya devam ediyorum. Şu ana kadar görmedik ama bu konuları da işleyeceğiz. Hatta git ile nasıl verimli çalışacağınıza dair ipuçlarımız da olacak.

Bölüm Sonu

Bu dersimizde git’in özelliklerinden biri olan git stash‘i inceledik. Böylece git derslerimizin ilk bölümünü yani Git 101 derslerini tamamlamış olduk. Bir sonraki bölümde ise daha ileri seviye Git konularına değineceğiz. Eğer derslerimizi buraya kadar takip ettiyseniz her projenizde mutlaka git kullanın. Diğer bir tavsiyem git’e hakim olana kadar da komut satırından kullanmaya devam edin. Günümüzde birçok UI sunan git araçları var. IDE’ler bunların en başında gelir. Conflict çözmek dışında bu tür araçları kullanmanızı tavsiye etmiyoruz. Bu sayede git’e daha kolay hakim olursunuz hem de komut satırından çoğu işlemi yapmanın daha kolay olduğunu anlarsınız.

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

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

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

57

Ö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.

1 Yorum

  • Merhaba Omer Ber,
    Derslerinizi takip ediyorum ve cok faydali bilgiler paylasiyorsunuz, emeginize saglik.
    Benim stash kisminda anlamadigim bir kisim var;
    Chapter 10 uzerinde calisirken Chapter 9 a donmemiz gerekti ve stash yaptigimizda Chapter 7-8 e dondu. Biz zaten Chapter 9 u da commit etmistik, neden Chapter 9 a donmedi de Chapter 7-8 e dondu bu kismi anlayamiyorum. Chapter 7-8 in Chapter 9 dan ne farki var ki Chapter 9 yerine Chapter 7-8 e geri donuldu?
    Selamlar,

Haftalık Bülten

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