Git rebase: Bilmeniz Gereken Her Şey
Yayınlanan: 2022-12-15
Git rebase komutu, iki kaynak kodu dalını bir dalda birleştirir. Git merge komutu da bunu yapar. rebase ne işe yaradığını, nasıl kullanıldığını ve bunun yerine merge ne zaman kullanılacağını açıklıyoruz.
Git Patlaması
Git birleştirme nedir?
Git rebase nedir?
Başka Bir Dala Nasıl Yeniden Başlanır
Git Rebase ve Birleştirme: Hangisini Kullanmalısınız?
Yeniden Temellendirmek mi, Yeniden Temellendirmemek mi?
Git Patlaması
Diğer sürüm kontrol sistemlerinden ve onların yavaş güncellemelerinden ve taahhütlerinden bıkan Linux çekirdeği şöhreti olan Linus Torvalds, 2005'te kendi sürümünü yazmak için bir ay ayırdı. Adını Git koydu.
GitHub, GitLab ve BitBucket gibi siteler simbiyotik olarak Git'i destekledi ve ondan yararlandı. Bugün Git, sürüm kontrol sistemi olarak Git'i kullanan 2022 anketinde 71 bin katılımcının yüzde 98'i ile küresel olarak kullanılıyor.
Git'in ana tasarım kararlarından biri hızdı. Özellikle şubelerle çalışmanın olabildiğince hızlı olması gerekiyordu. Şubeler, sürüm kontrol sistemlerinin temel bir parçasıdır. Bir proje deposunun bir ana veya ana dalı olacaktır. Burası, projenin kod tabanının oturduğu yerdir. Yeni özellikler gibi geliştirmeler, ayrılmış yan dallarda gerçekleşir. Bu, şubelerde yapılan işlerin ana şubeyi karıştırmasını engeller ve kod tabanının farklı bölümlerinde eş zamanlı geliştirme yapılmasına izin verir.
Yan dallardaki geliştirmeler tamamlandıktan sonra geliştirme dalının ana dal ile birleştirilmesi ile değişiklikler ana dalda aktarılır. Diğer sürüm kontrol sistemlerinde şubelerle çalışmak zordu ve hesaplama açısından pahalıydı. Git'te şubelerle çalışmak çok hızlı ve çok hafiftir. Bir zamanlar diğer sistemlerde sıkıcı ve sıklıkla kaçınılan bir egzersiz, Git'te önemsiz hale geldi.
Git rebase komutu, değişiklikleri bir şubeden başka bir şubeye aktarmanın başka bir yoludur. merge ve yeniden rebase komutlarının benzer amaçları vardır, ancak amaçlarına farklı şekillerde ulaşırlar ve biraz farklı sonuçlar verirler.
Git birleştirme nedir?
Peki Git merge komutu ne için? Diyelim ki yeni bir özellik üzerinde çalışmak için dev-branch adlı bir dal oluşturdunuz.

Birkaç işlem yaparsınız ve yeni özelliğinizi test edersiniz. Hepsi iyi çalışıyor. Şimdi yeni özelliğinizi master şubeye göndermek istiyorsunuz. Bir başkasını onunla birleştirmek için master dalda olmalısınız.
Birleştirmeden önce açıkça kontrol ederek master dalda olduğumuzdan emin olabiliriz.
git ödeme ustası
Artık Git'e dev-branch master dal olan geçerli dalla birleştirmesini söyleyebiliriz.
git dev şubesini birleştirme

Bizim için merge tamamlandı. master dalı kontrol edip derlerseniz, içinde yeni geliştirilen özelliğe sahip olacaktır. Git'in gerçekte gerçekleştirdiği şey, üç yollu birleştirmedir. master ve dev-branch şubelerindeki en son commit'leri ve dev- dev-branch oluşturulmadan hemen önce master dalındaki commit'leri karşılaştırır. Daha sonra master dalda bir taahhüt gerçekleştirir.
Birleştirmeler, hiçbir şeyi silmedikleri ve Git geçmişini değiştirmedikleri için tahribatsız kabul edilir. Geliştirme dev-branch hala var ve önceki taahhütlerin hiçbiri değiştirilmedi. Üç yollu birleştirmenin sonuçlarını yakalayan yeni bir taahhüt oluşturulur.
Birleştirmeden sonra Git depomuz, alternatif bir hattın dallanarak ana zaman çizelgesine geri döndüğü bir zaman çizelgesi gibi görünür.

dev-branch şubesi, master şubeye dahil edildi.
Bir projede çok sayıda şubeniz varsa, projenin geçmişi kafa karıştırıcı olabilir. Bir projenin çok sayıda katılımcısı varsa, bu genellikle geçerlidir. Geliştirme çabası birçok farklı yola ayrıldığından, geliştirme geçmişi doğrusal değildir. Şubelerin kendi şubeleri varsa, taahhüt geçmişini çözmek daha da zor hale gelir.
master dalda kaydedilmemiş değişiklikleriniz varsa, herhangi bir şeyi birleştirmeden önce bu değişikliklerle bir şeyler yapmanız gerekeceğini unutmayın. Yeni bir şube oluşturabilir ve değişiklikleri orada yapabilir ve ardından birleştirmeyi yapabilirsiniz. Daha sonra geçici şubenizi tekrar ana şubede birleştirmeniz gerekir.
Bu işe yarar, ancak Git'in yeni dallar oluşturmak zorunda kalmadan aynı şeyi başaran bir komutu vardır. stash komutu, kaydedilmemiş değişikliklerinizi sizin için depolar ve bunları stash pop ile geri çağırmanıza izin verir.
Onları şu şekilde kullanırsın:
saklamak git dev şubesini birleştirme zula pop
Sonuç, kaydedilmemiş değişikliklerinizin geri yüklendiği birleştirilmiş bir daldır.
Git rebase nedir?
Git rebase komutu, amaçlarına tamamen farklı bir şekilde ulaşır. Yeniden temellendireceğiniz daldaki tüm taahhütleri alır ve bunları yeniden temellendireceğiniz dalın sonuna kadar yeniden yürütür.
Önceki örneğimizi ele alırsak, herhangi bir işlem gerçekleştirmeden önce Git depomuz bu şekilde görünür. dev-branch branch adında bir şubemiz var ve bu değişiklikleri master şubeye taşımak istiyoruz.


Yeniden rebase sonra, tek, tamamen doğrusal bir değişiklik zaman çizelgesi gibi görünür.

dev-branch kaldırıldı ve dev-branch içindeki commit'ler ana şubeye eklendi. Nihai sonuç, dev-branch taahhütler aslında ilk etapta doğrudan master şubeye taahhüt edilmiş gibi aynıdır. Taahhütler sadece master şubeye iliştirilmez, "tekrar oynatılır" ve taze eklenir.
Bu nedenle rebase komutunun yıkıcı olduğu kabul edilir. Yeniden temellendirilen dal artık ayrı bir dal olarak mevcut değildir ve projenizin Git geçmişi yeniden yazılmıştır. Daha sonraki bir noktada, dev-branch başlangıçta hangi taahhütlerin verildiğini belirleyemezsiniz.
Ancak, size basitleştirilmiş, doğrusal bir tarih bırakıyor. Düzinelerce hatta yüzlerce dal ve birleştirme içeren bir havuzla karşılaştırıldığında, Git günlüğünü okumak veya deponun grafiğine bakmak için grafiksel bir git GUI kullanmak, yeniden temellendirilmiş bir havuzu anlamak çok kolaydır.
Başka Bir Dala Nasıl Yeniden Başlanır
Bir git rebase örneği deneyelim. new-feature adında bir dalı olan bir projemiz var. Bu dalı bu şekilde master dala yeniden rebase .
İlk olarak, master dalda göze çarpan değişiklik olup olmadığını kontrol ediyoruz.
git durumu
new-feature şubesini kontrol ediyoruz.
git checkout yeni özelliği
Git'e mevcut dalı ana dala yeniden rebase söylüyoruz.
git rebase ustası
Hala iki şubemiz olduğunu görebiliyoruz.
git şubesi
master şubeye geri dönüyoruz
git ödeme ustası
Yeni özellik dalını, bizim durumumuzda master dal olan mevcut dalla birleştiriyoruz.
git birleştirme yeni özelliği

İlginç bir şekilde, son birleşmeden sonra hala iki şubemiz var.

Fark şu ki, artık new-feature dalının başı ve master dalın başı aynı taahhüdü işaret edecek şekilde ayarlanmış ve Git geçmişi, eskiden ayrı bir new-feature dalı olduğunu göstermiyor. şube etiketi.

Git Rebase ve Birleştirme: Hangisini Kullanmalısınız?
Bu bir rebase vs merge durumu değil. İkisi de güçlü komutlardır ve muhtemelen ikisini de kullanacaksınız. Bununla birlikte, rebase gerçekten o kadar iyi çalışmadığı kullanım durumları var. merge kullanılarak yapılan hatalardan kaynaklanan hataların ayıklanması hoş değildir, ancak yeniden yapılanmanın neden olduğu hataların rebase cehennem gibidir.
Depo kullanan tek geliştirici sizseniz, rebase ile feci bir şey yapma şansınız daha düşüktür. Örneğin, yine de yanlış yönde yeniden temel alabilir ve ana rebase new-feature rebase yeniden temellendirebilirsiniz. master şubenizi geri almak için, bu sefer new-feature rebase master şubenize yeniden temel atmanız gerekir. Bu, tuhaf görünen bir geçmişe sahip olsa da, master dalınızı geri yükler.
rebase , başkalarının çalışabileceği paylaşılan şubelerde kullanmayın. Deponuzdaki değişiklikleriniz, yeniden oluşturulmuş kodunuzu uzak deponuza gönderdiğinizde birçok insan için sorun yaratacaktır.
Projenizde birden çok katkıda bulunan varsa, yapılacak en güvenli şey rebase genel şubelerde değil, yalnızca yerel deponuzda kullanmaktır. Aynı şekilde, çekme istekleri kod incelemelerinizin bir parçasını oluşturuyorsa, rebase kullanmayın. Ya da en azından, çekme talebini oluşturduktan sonra rebase kullanmayın. Diğer geliştiriciler büyük olasılıkla taahhütlerinize bakıyor olacaklar, bu da bu değişikliklerin master dalda olmasalar bile genel bir dalda olduğu anlamına gelir.
Tehlike şu ki, zaten uzak bir rebase aktarılmış olan taahhütleri yeniden temellendireceksiniz ve diğer geliştiriciler zaten bu taahhütlere dayalı çalışmalar yapmış olabilir. Yerel rebase , mevcut taahhütleri ortadan kaldıracaktır. Bu değişiklikleri depoya aktarırsanız, popüler olmayacaksınız.
Diğer katkıda bulunanlar, çalışmalarını depoya geri göndermek için karmaşık bir merge işleminden geçmek zorunda kalacaklar. Daha sonra değişikliklerini yerel deponuza geri çekerseniz, yinelenen değişiklikler karmaşasını çözmekle karşı karşıya kalırsınız.
Yeniden Temellendirmek mi, Yeniden Temellendirmemek mi?
Rebase , projenizde yasaklanmış olabilir. Yerel, kültürel itirazlar olabilir. Bazı projeler veya kuruluşlar, yeniden yapılanmayı bir tür sapkınlık ve bir saygısızlık rebase olarak görüyor. Bazı insanlar Git geçmişinin, olanların dokunulmaz, kalıcı bir kaydı olması gerektiğine inanıyor. Yani, rebase masanın dışında olabilir.
Ancak yerel olarak, özel şubelerde kullanıldığında, rebase yararlı bir araçtır.
Yeniden temellendirdikten sonra itin ve tek geliştirici olduğunuz şubelerle sınırlandırın. Veya en azından, tüm geliştirmenin durduğu ve başka hiç kimsenin şubenizin taahhütlerinden başka bir işe dayanmadığı yer.
Bunu yapın ve herhangi bir sorundan kaçınacaksınız.
İLGİLİ: Git Sürümünüzü Kontrol Etme ve Güncelleme



