Kurs
Git’teki dallar bağımsız geliştirme çizgilerini temsil eder ve geliştiricilerin bir projenin birden fazla özelliği veya sürümü üzerinde eşzamanlı çalışmasına olanak tanır.
Git dalları, kod değişikliklerini yönetmek için yapılandırılmış bir yol sunar; böylece yeni özelliklerin, hata düzeltmelerinin ve deneyselliklerin ana kod tabanını bozmadan sorunsuz biçimde entegre edilmesini sağlar.

Geleneksel olarak dallar arasında geçiş yapmak için git checkout komutunu kullanıyorduk. Ancak checkout komutu yalnızca dal değiştirmekten çok daha fazlasını yapabildiği için bazı karışıklıklara ve hatalara yol açabiliyordu.
Ağustos 2019’da Git 2.23 ile tanıtılan git switch komutu, dallar arasında geçiş yapmak ve yeni dallar oluşturmak için daha sezgisel bir yol sağlar.
Git Switch ile Dallarda Geçiş ve Dal Oluşturma
Karmaşık projelerde öncelikler sürekli değişir ve iş akışı çoğu zaman doğrusal değildir. Genellikle her dal belirli değişikliklere odaklanır; böylece her biri kendi dalında olmak üzere birden fazla yeni özellik veya hata düzeltmesi üzerinde eşzamanlı çalışabiliriz.
Bir özelliği askıya alıp başka bir dala geçmemizi gerektirebilecek birkaç neden vardır. Örneğin:
- Kod incelemesini beklemek.
- Bir engelle karşılaşıp bir çalışma arkadaşından yardım alma ihtiyacı.
- Acil müdahale gerektiren bir hotfix’i ele alma.
Dallar arasında verimli geçiş yapmak, geliştirmeyi sorunsuz sürdürmenin ve değişikliklerin olması gereken yere ulaşmasını sağlamanın anahtarıdır. Birden fazla görev ve ekip çalışması söz konusu olduğunda dallar arasında basit ve güvenilir bir şekilde geçiş yapabilmek önemlidir.
Var olan bir dala switch komutuyla geçmek için şunu yaparız:
git switch <branch-name>
Yukarıdaki komutta <branch_name>, geçmek istediğimiz dalın adıyla değiştirilmelidir. Diyelim ki mevcut bir dal olan feature-x’te yer alan yeni bir özellik üzerinde çalışmak istiyoruz; o zaman şu komutu kullanırız:
git switch feature-xMevcut Dalların İsimlerini Bulma
Kullanılabilir dalları listelemek istersek git branch komutunu kullanırız. Mevcut dalın yanında bir yıldız işareti görünür. Örneğin yerelde main, feature-x ve bug-z adlı üç dalımız varsa ve şu anda main dalındaysak, çıktı şöyle olur:
* main
feature-x
bug-z
Uzak Bir Dala Geçiş
Önceki komut, yerel makinemizde halihazırda bulunan bir dala geçmemizi sağlar. Uzak depodaki bir dala geçmek için önce aşağıdaki komutla onun yerel bir kopyasını oluşturmamız gerekir:
git switch -c <local-branch-name> origin/<remote-branch-name>
Burada <local-branch-name>, dalın yerelde sahip olmasını istediğimiz ad; <remote-branch-name> ise uzak dalın adıdır. Genellikle karışıklığı önlemek için aynı adı kullanmak isteriz. Diyelim ki feature-x dalı yerelde yok. O hâlde yerel bir sürüm oluşturup ona şöyle geçebiliriz:
git switch -c feature-x origin/feature-x
Aynı adı kullanırken Git, --track seçeneğiyle bir kısayol sunar. Dolayısıyla yukarıdaki komut şuna eşdeğerdir:
git switch --track origin/feature-x
Uzak dalları listelemek için git branch -r komutunu kullanabiliriz.
Yerel depo, uzak dalları otomatik olarak takip etmez. Bu nedenle uzak bir dalı listelemeden veya ona geçmeden önce git fetch ile yerel depoyu güncellemek önemlidir.
Yeni Bir Dal Oluşturup Ona Geçmek
Yeni bir özellikle çalışmaya başlamak için tamamen yeni bir dal oluşturmak istiyoruz. Bu durumda -c bayrağını kullanabiliriz:
git switch -c <new-branch-name>
Burada <new-branch-name dalın adıyla değiştirilir. Örneğin feature-y adlı bir dal oluşturmak için şunu yaparız:
git switch -c feature-y
Önceki Dala Geri Dönmek
Çoğu zaman, bir miktar iş yapmak için dala geçiş yaptıktan sonra, önce üzerinde çalıştığımız dala geri dönmek isteriz. Git bunun için şu komutla bir kısayol sağlar:
git switch -
Git Switch ve Git Checkout
git checkout komutu Git’in en başından beri mevcuttur. 2019’da git switch tanıtılmadan önce, dallar arasında geçiş yapmak için kullanılan komut git checkout idi. Ancak git checkout komutunun kapsamı, yalnızca dallar arasında gezinmenin ötesine geçer. İşte farkların dökümü:
git switch: Dallar arasında geçiş yapmak ve yeni dallar oluşturmak için daha sezgisel bir yol sunmayı amaçlar. Komut setini basitleştirir ve kafa karışıklığını azaltır.git checkout: Dallar arasında geçiş için kullanılabileceği gibi dosyaları checkout etmek ve farklı commit’lerden veya dallardan içerik geri yüklemek için de kullanılabilen daha çok yönlü bir komuttur.
git switch’in tasarımı, yanlışlıkla değişikliklerin üzerine yazmayı zorlaştırır. Dallar arasında geçiş ve yeni dal oluşturma için daha açık bir sözdizimine sahiptir.
git checkout birden çok iş yaptığından (dal değiştirme, dosya geri yükleme vb.) kullanırken hata yapma olasılığı daha yüksektir.
Git Switch: Yaygın Hatalar
Dalları yönetirken birkaç yaygın sorunla karşılaşabilirsiniz. Bunlardan biri, yerelde zaten var olan bir dala yeniden oluşturma girişimidir. Bir diğer yaygın sorun, commit edilmemiş değişikliklerle dal değiştirmeye çalışırken ortaya çıkar. Önce ilkini açıklayarak başlayalım.
Dal zaten yerelde mevcut
Her yerel dalın benzersiz bir ada sahip olması gerekir. Yerel dalları git switch ile iki şekilde oluşturabilirsiniz:
1. Uzak bir dalı izlemek için:
git switch --track origin/<branch-name>
2. Yeni bir yerel dal oluşturmak için:
git switch -c <branch-name>
Her iki durumda da, yerelde <branch-name> adında bir dal zaten varsa Git şu hatayı verir:
fatal: a branch named '<branch-name>' already exists

Bu durumda git switch <branch-name> kullanarak dalı oluşturmadan ona geçebiliriz.
Geçerli dalda commit edilmemiş değişiklikler var
Geçerli dalda, geçişle üzerine yazılacak commit edilmemiş değişiklikler varsa Git dal değiştirmemize izin vermez. Bu durumda Git şu hatayı verir:
Please commit your changes or stash them before you switch branches.

Mesajın belirttiği gibi, bu durumu aşmak için değişikliklerimizi ya önce commit etmemiz ya da stash’e almamız gerekir. Değişiklikler depoya commit edilmeye hazırsa şu komutla commit etmeliyiz:
git commit -m "Commit message"
Değişiklikleri saklamak istiyor ancak henüz commit etmeye hazır değilsek, onları geçici olarak git stash komutuyla kaydedebiliriz:
git stash
Dalları değiştirmeden önce değişiklikleri stash’e alırsak ve orijinal dala döndüğümüzde bunları yeniden uygulamak istersek git stash pop komutunu kullanabiliriz.
Alternatif olarak, --discard-changes bayrağını kullanarak değişiklikleri gözden çıkarmaya da karar verebiliriz:
git switch --discard-changes <branch-name>
Bu son seçeneği kullanmadan önce dikkatli olun; çünkü değişiklikler kalıcı olarak silinir.
Git Switch Gelişmiş Kullanım
Projenizin geçmişindeki belirli noktalardan dal oluşturmanız veya özel senaryoları yönetmeniz gerektiğinde, git switch bu ihtiyaçlara yanıt veren gelişmiş işlevler sunar.
Belirli bir noktadan dal oluşturma
Varsayılan olarak, git switch ile bir dal oluştururken yeni dalın başlangıç durumu, bulunduğumuz dalın HEAD’idir.

Diyelim ki yeni bir dalı geçmişteki belirli bir commit’ten başlatmak istiyoruz. Her commit benzersiz bir <hash> ile tanımlanır; bu git switch komutuyla o commit’ten yeni bir dal oluşturmak için kullanılabilir. Şöyle yapılır:
switch -c feature-y <hash>
<hash>’i gerçek commit hash’iyle değiştirin.

Detached HEAD’e geçiş
Mevcut dalı etkilemeden veya yeni bir dal oluşturmadan belirli bir commit’i keşfetmek ya da denemeler yapmak istersek, şu komutla detached head kullanabiliriz:
git switch --detach <hash>

HEAD’i ayırarak, depoyu belirli bir commit’teki durumuyla güvenle inceleyebilir, testler çalıştırabilir veya mevcut çalışma dalına yanlışlıkla commit edilme riski olmadan geçici değişiklikler yapabilirsiniz. En yaygın kullanım durumları şunlardır:
- Eski bir durumu görüntüleme: Mevcut dalda değişiklik yapmadan daha eski bir commit’i incelemek veya test etmek istiyorsak, detached durumda o commit’e geçebiliriz.
- Geçici değişiklikler: Herhangi bir dalı etkilemeden denemeler yapmak istersek, bu değişiklikleri detached head durumunda yapabiliriz. Bu durumda yapılan yeni commit’lerin herhangi bir dala ait olmayacağını ve bu commit’leri saklamak istiyorsak yeni bir dal oluşturmamız gerekebileceğini unutmayın.
- Derleme/test amaçları: Bazen yazılımı belirli bir commit’te derlemek veya test etmek gerekir. O commit’te detached HEAD durumuna geçmek, deponun dal yapısını etkilemeden bunu yapmamıza olanak tanır.
Zorla geçiş
Öğrendiğimize göre, hedef dalla çakışabilecek commit edilmemiş değişiklikler varken Git dal değiştirmemize izin vermez. Bu değişiklikleri gözden çıkarmak ve geçişe devam etmek istediğimizden eminseK, -f seçeneğini kullanarak zorlayabiliriz. Şöyle:
git switch -f <branch-name>
Dikkate alınması gereken önemli çekinceler vardır.
- Herhangi bir uyarı olmaksızın tüm commit edilmemiş değişiklikler kaybolur; bu değişiklikler başka yerde kaydedilmediyse emek kaybına neden olabilir.
-fseçeneğini ölçüsüz kullanmak, geliştiricileri WIP (devam eden çalışma) değişikliklerini stash’lemek veya commit etmek gibi doğru sürüm kontrolü uygulamalarını atlamaya teşvik ederek disiplin eksikliğine yol açabilir. Bu da dağınık bir depo geçmişine ve işbirliğinin zorlaşmasına neden olabilir. Bu nedenle,git switch -fhız ve kolaylık sunsa da, potansiyel sakıncaları azaltmak için dikkatli ve risklerin bilincinde olarak kullanılmalıdır.
Sonuç
git switch komutu, eski git checkout komutuna kıyasla dallar arasında geçiş yapmayı ve yeni dallar oluşturmayı kolaylaştırır.
Süreci basitleştirir ve hataları azaltmaya yardımcı olur; böylece geliştiricilerin kod tabanını yönetmesini kolaylaştırır.
Bu komut, değişikliklerin yanlışlıkla üzerine yazılması veya git checkout’un farklı işlevlerinin karıştırılması gibi yaygın sorunların önüne geçmeye yardımcı olur.
Bu komutu benimsemek, Git dallarında gezinmeyi daha sezgisel hâle getirebilir ve geliştirme ekipleri içinde işbirliğini güçlendirebilir.

