Git rebase: Bilmeniz Gereken Her Şey

Yayınlanan: 2022-12-15
Mavi bir arka planda bir Linux komut istemini gösteren dizüstü bilgisayar.
fatmawati achmad zaenuri/Shutterstock.com
Git rebase komutu, bir dalı başka bir dalın başındaki yeni bir konuma taşır. Git birleştirme komutunun aksine, rebase, proje geçmişinizi yeniden yazmayı içerir. Bu harika bir araçtır, ancak diğer geliştiricilerin üzerinde çalıştıkları taahhütleri yeniden temellendirmeyin.

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.

İçindekiler

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.

Ekibiniz İçin Doğru Git İş Akışı ve Dallanma Modelini Nasıl Seçersiniz?
İLGİLİ Ekibiniz İçin Doğru Git İş Akışı ve Dallanma Modelini Nasıl Seçersiniz?

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.

Bir ana dalın ve dev-branch adlı birleştirilmemiş bir dalın diyagramı
Dave McKay/Nasıl Yapılır Geek

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 

dev-branch dalını ana dalla 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, ana şube ile birleştirildi
Dave McKay/Nasıl Yapılır Geek

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.

Git Dalları Nasıl Çalışır?
İLGİLİ Git Dalları Nasıl Çalışır?

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.

Bir ana dalın ve dev-branch adlı birleştirilmemiş bir dalın diyagramı
Dave McKay/Nasıl Yapılır Geek

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

dev-branch ile master şubesi ona göre yeniden oluşturuldu
Dave McKay/Nasıl Yapılır Geek

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 
Yeni özelliğe sahip ana dal, ona göre yeniden oluşturuldu
Dave McKay/Nasıl Yapılır Geek

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

Git deposundaki dalları listelemek için Git şubesi komutunu kullanma
Dave McKay/Nasıl Yapılır Geek

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.

dev-branch ile master şubesi ona göre yeniden oluşturuldu
Dave McKay/Nasıl Yapılır Geek

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.

Git İşlemlerini Düzeltme, Düzenleme veya Geri Alma (Git Geçmişini Değiştirme)
İLİŞKİLİ Git İşlemlerini Düzeltme, Düzenleme veya Geri Alma (Git Geçmişini Değiştirme)

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