Puanlarınıza doğrudan ve net bir şekilde cevap vereyim:
Bizim meselemiz uzun vadeli yan dallar - bir kaç kişiyi efendiden ayrılan bir yan dalda çalışan kişilerin olduğu, birkaç ay boyunca geliştirdiğimiz ve bir dönüm noktasına ulaştığımızda ikisini senkronize ediyoruz.
Genelde şubelerinizin aylarca eşitlenmesini istemiyorsunuz.
Özellik dalınız iş akışınıza bağlı olarak bir şeyden ayrıldı; master
basitlik uğruna onu arayalım . Şimdi, ne zaman usta olmaya karar verirseniz, yapabilir ve yapmalısınız git checkout long_running_feature ; git rebase master
. Bu, dallarınızın tasarım açısından daima senkronize olduğu anlamına gelir.
git rebase
Ayrıca burada yapılacak doğru şey. Bir kesmek ya da garip ya da tehlikeli bir şey değil, tamamen doğal. Özellik dalının "doğum günü" olan bir bit bilgi kaybettiniz, ancak bu kadar. Biri bunu önemli buluyorsa, başka bir yere kaydederek sağlanabilir (bilet sisteminizde veya ihtiyaç büyükse git tag
... olarak).
Şimdi, IMHO, bunun üstesinden gelmenin doğal yolu, yan dalın tek bir parça halinde ezilmesidir.
Hayır, kesinlikle istemiyorsun, bir birleşme taahhüdü istiyorsun. Bir birleştirme taahhüdü de "tek bir taahhüttür". Her nasılsa, her bir dalın taahhüdünü “master” içine yerleştirmez. İki veli ile tek bir taahhüt - master
birleşme sırasında baş ve şube başı.
--no-ff
Elbette , seçeneği belirttiğinizden emin olun ; Mecburi --no-ff
olmanız gerekmeden mecburen birleşme kesinlikle yasaktır. Ne yazık ki, --no-ff
varsayılan değil; ama bunu ayarlayabilecek bir seçenek olduğuna inanıyorum. git help merge
Neler --no-ff
olduğunu görün (kısaca: önceki paragrafta anlattığım davranışı etkinleştirir), çok önemlidir.
geriye dönük olarak aylarca süren paralel gelişmeyi usta tarihine dökmüyoruz.
Kesinlikle hayır - hiçbir zaman bir dalın "tarihine" bir şey bırakmazsınız, özellikle de bir birleşme taahhüdüyle değil.
Ve eğer yan dal tarihçesi için daha iyi bir çözüme ihtiyaç duyan biri varsa, elbette hepsi hala oradadır - sadece usta değil, yan dalda.
Bir birleştirme taahhüdü ile hala orada. Ustada değil, fakat yan dalda, birleşmenin ebeveynlerinden biri olarak açıkça görülebilen ve olması gerektiği gibi sonsuzluğa saklanan.
Bak ne yaptım? Kabak taahhüdünüz için tanımladığınız her şey birleştirme taahhüdüyle birlikte orada--no-ff
.
Sorun şu: Sadece komut satırı ile çalışıyorum, ancak ekibimin geri kalanı GUIS kullanıyor.
(Yan açıklama: Neredeyse sadece komut satırında da çalışıyorum (peki, bu bir yalan, genellikle emacs magit kullanıyorum, ancak bu başka bir hikaye - eğer bireysel emacs kurulumumla uygun bir yerde olmazsam komutu tercih ederim. çizgi de). Ama kendinize bir iyilik yapın ve en az deneyin git gui
bir kez. Öyle böylece çok daha verimli eklemek için vb hatları, hunks toplama için / geri alma ekler.)
Ve GUIS'in geçmişi diğer şubelerden görüntülemek için makul bir seçeneğinin olmadığını keşfettim.
Çünkü yapmaya çalıştığın şey tamamen ruhuna aykırı git
. git
merkezden "yönlendirilmiş bir asiklik grafik" üzerine kuruludur, yani, çok fazla bilgi, taahhütlerin ebeveyn-çocuk ilişkisi içindedir. Ve birleşimler için bu, iki ebeveyn ve bir çocukla gerçek birleşme taahhüdü anlamına gelir. Meslektaşlarınızın GUI'leri, no-ff
birleştirme görevlerini kullandığınız anda tamam olacaktır .
Bu yüzden, "bu gelişme XYZ şubesinden ezilmiş" diyerek bir squash işine ulaşırsanız, XYZ'de neler olduğunu görmek çok büyük bir acıdır.
Evet, ama bu GUI'nin bir problemi değil, squashın taahhüdü. Bir squash kullanmak, özellik dalı başını sarkan ve yepyeni bir taahhüt yaratan bırakırsınız master
. Bu, yapıyı iki seviyede kırarak büyük bir karışıklık yaratır.
Bu yüzden, bu büyük, uzun gelişme yan dallarının her zaman bir birleşme taahhüdü ile birleştirilmesini istiyorlar.
Ve kesinlikle haklılar. Ama "birleştirilmez içinde ", onlar sadece birleştirilir. Bir birleşme gerçekten dengelenmiş bir şeydir, ötekine "birleştirilen" hiçbir tarafı yoktur ( git checkout A ; git merge B
tam olarak git checkout B ; git merge A
etrafa kaydırılan dallar gibi küçük görsel farklar hariç olduğu gibi aynıdır git log
).
Ana şubeden hemen erişilebilecek bir tarih istemiyorlar.
Bu tamamen doğru. Ayrılmamış özelliklerin olmadığı bir zamanda, master
şimdiye kadarki tüm özellik çizgilerini kapsayan zengin bir geçmişe sahip tek bir şubeniz olacaktı git init
, zamanın başlangıcından itibaren tekrar tesadüflere geri dönecektim (özellikle terim kullanmaktan kaçındığımı unutmayın). "Bu paragrafın ikinci bölümünde" dallar, çünkü o zamanlar tarih artık "dallar" değildir;
Bu fikirden nefret ediyorum;
O zaman kullandığınız araca karşı çalıştığınız için biraz acı çekiyorsunuz. Bu git
yaklaşım, özellikle dallanma / birleşme alanında, çok zarif ve güçlüdür; eğer doğru yaparsanız (yukarıda belirtildiği gibi, özellikle ile --no-ff
), başka yaklaşımlara (örn., dallar için paralel dizin yapılarına sahip olan yıkım karmaşası) atlar ve sınırlar.
Bu, paralel gelişim tarihinin sonsuz, elverişsiz bir arapsaçı anlamına gelir.
Sonsuz, paralel - evet.
Kaçınılmaz, dolaşma - hayır.
Ama hangi alternatifimiz olduğunu göremiyorum.
Neden git
her gün çalışanların mucidi , meslektaşlarının ve dünyanın geri kalanının yaptığı gibi çalışmıyor?
Burada sürekli olarak yan dalları ustalıkla birleştirme komisyonlarıyla birleştirmenin dışında bir seçeneğimiz var mı? Yoksa, birleştirme-komisyonlarını sürekli kullanmanın korktuğum kadar kötü olmamasının bir nedeni var mı?
Başka seçenek yok; o kadar da kötü değil.