Ofisim sonsuz şube birliği politika olarak istiyor; Başka seçeneklerimiz var mı?


119

Ofisim, dal bölmelerini ve birleşmelerini nasıl ele aldığımızı bulmaya çalışıyor ve büyük bir sorunla karşılaştık.

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.

Şimdi, IMHO, bunun üstesinden gelmenin doğal yolu, yan dalın tek bir parça halinde ezilmesidir. masterilerlemeye devam ediyor; olması gerektiği gibi - geriye dönük olarak aylarca süren paralel gelişmeyi mastertarihin içine atmıyoruz. Ve eğer birisinin, yan dal tarihi için daha iyi bir çözüme ihtiyacı varsa, elbette, hepsi hala oradadır - sadece yok master, yan tarafta.

Sorun şu: Sadece komut satırı ile çalışıyorum, ancak ekibimin geri kalanı GUIS kullanıyor. Ve GUIS'in geçmişi diğer şubelerden görüntülemek için makul bir seçeneğinin olmadığını keşfettim . Yani bir kabak "Bu gelişme şubesinden ezilmiş diyerek taahhüt ulaşırsanız XYZ", şey kocaman içinde ne gidip görmek acı XYZ.

SourceTree'de bulabildiğim kadarıyla çok büyük bir baş ağrısı var: Açıksanız masterve geçmişi görmek istiyorsanız master+devFeature, ya kontrol etmelisiniz master+devFeature(farklı olan her bir dosyaya dokunarak) Doğru yeri bulana kadar TÜM havuzunuzun dallarını paralel olarak görüntüleyen bir günlük kaydırın . Ve nerede olduğunu bulmakta iyi şanslar.

Takım arkadaşlarım, haklı olarak, gelişim tarihinin bu kadar erişilemez olmasını istemiyorlar. 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. Ana şubeden hemen erişilebilecek bir tarih istemiyorlar.

Ben nefret fikrini; Bu, paralel gelişim tarihinin sonsuz, elverişsiz bir arapsaçı anlamına gelir. Ama hangi alternatifimiz olduğunu göremiyorum. Ve ben oldukça şaşkınım; bu, iyi şube yönetimi hakkında bildiğim her şeyi engelliyor gibi görünüyor ve bir çözüm bulamazsam bu benim için sürekli bir hayal kırıklığı olacak.

Burada sürekli olarak yan dalları birleştirme komisyonlarıyla ustalıkla 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ı?


84
Bir birleştirme olarak bir birleştirme kayıt gerçekten bu kadar kötü mü? Doğrusal bir tarihe karışmanın avantajları olduğunu görebiliyorum, ancak bunu yapmamanın "iyi şube yönetimi hakkında bildiğiniz her şeye" karşı gelmesine şaşırdım. Tam olarak korktuğun problemler neler?
IMSoP

65
Nerede Tamam, ama aklımda uzun süren bir dal tam da yapmak bazı görüş istiyorum suçluyor ve ikiye ayırır sadece "değişim 2016 Büyük yeniden yazımı bir parçası olarak tanıtıldı" arazi kalmaz. Bir cevap olarak gönderecek kadar kendime güvenmiyorum, ancak içgüdüm, özellik dalında ezilmesi gereken görevler olduğu için, ana tarihten erişilebilecek, projenin kısa bir geçmişine sahip olmak zorundasınız. artık bir şubeye bak.
IMSoP

5
Olduğu söyleniyor, bu oldukça olası bir soru, “Git'i takım arkadaşlarımdan daha yüksek bir seviyede kullanmaya çalışıyorum; onları benim için mahvetmelerini nasıl önlerim? Yeterince adil olan, dürüst olmak gerekirse git log master+bugfixDec10th, kırılma noktası olmayı beklemiyordum : - /
Stand

26
"uzun vadeli yan dallar - birkaç insanın ustadan ayrılan bir yan dalda çalıştığı tür, birkaç ay boyunca gelişiriz ve bir dönüm noktasına ulaştığımızda ikisini senkronize ederiz." Master'den periyodik olarak yan dallara doğru çekmiyor musunuz? Bunu yapmak (her azınlık) ustalık taahhüdünde bulunur ve birçok durumda hayatı kolaylaştırır.
TafT

4
merge --no-ffistediğini? Açık masterkendisi tek o dalda değişti açıklar işlemek var, ama kaydedilmesini tüm hala var ve HEAD için üst öğe.
CAD97'de

Yanıtlar:


243

Git'i komut satırında kullanmama rağmen - iş arkadaşlarınla ​​aynı fikirdeyim. Büyük değişiklikleri tek bir taahhütte ezmek mantıklı değildir. Bu şekilde tarihini kaybediyorsun, sadece daha az görünür kılmak değil.

Kaynak kontrolünün amacı, tüm değişikliklerin geçmişini izlemektir. Neyi ne zaman değiştirdi? Bu amaçla, her bir taahhüt ana taahhütlere yönelik işaretçiler, bir fark ve bir taahhüt mesajı gibi meta veriler içerir. Her bir taahhüt kaynak kodun durumunu ve bu duruma yol açan tüm değişikliklerin tarihçesini açıklar. Çöp toplayıcı, erişilemeyen taahhütleri silebilir.

Yeniden düzenleme, kiraz toplama veya ezme gibi eylemler geçmişi siler veya yeniden yazar. Özellikle, sonuçta ortaya çıkan taahhütler artık orijinal taahhütlere referans vermiyor. Bunu düşün:

  • Bazı taahhütleri eziyorsunuz ve taahhütlü mesajda, sıkıştırılmış geçmişin abcd123 orijinal çalışmasında mevcut olduğunu not ediyorsunuz.
  • Silmek [1] onlar birleştirilir beri abcd123 içerir tüm şubeleri veya etiketleri.
  • Çöp toplayıcının çalışmasına izin verdin.

[1]: Bazı Git sunucuları şubelerin yanlışlıkla silinmesine karşı korunmalarına izin veriyor, ancak tüm özellik şubelerinizi sonsuza dek saklamak istediğinizden şüpheliyim.

Şimdi artık bu taahhüde bakamazsınız - sadece mevcut değil.

Şube adlarının bir repo'da yerel olması nedeniyle, bir taahhüt mesajında ​​bir şubeye referans verilmesi daha da kötüdür. Ne master+devFeatureyerel kasada kalmış olabilir doodlediduhmadeninde. Dallar, yalnızca bazı önemli nesnelere işaret eden etiketler taşıyor.

Tüm tarih yeniden yazma teknikleri arasında, yeniden yapılanma en iyi huyludur, çünkü tüm taahhütleri tüm geçmişleriyle çoğaltır ve yalnızca bir üst taahhüdün yerine geçer.

Bu mastergerçeği temsil ettiği tarih, bu iyi bir şeydir birleştirilecek olan tüm dallarının tam geçmişini içerir. [2] Paralel bir gelişme olsaydı, kütükte görünür olması gerekirdi.

[2]: Bu sebepten ötürü, yeniden birleştirme sonucu ortaya çıkan doğrusallaştırılmış fakat nihayetinde sahte tarihçede kesin birleşme taahhüdünü de tercih ediyorum.

Komut satırında, git loggörüntülenen geçmişi basitleştirmek ve görüntülenen tüm taahhütleri ilgili tutmak için çok çalışır . İhtiyaçlarınıza uyacak şekilde tarih sadeleştirmesini düzenleyebilirsiniz. Taahhüt grafiğine giren kendi git log aracınızı yazmak için cazip gelebilirsiniz, ancak genellikle “Bu taahhüdün bu dalda mı yoksa o dalda mı yapıldığı?” Cevabını vermek imkansızdır. Bir birleştirme taahhüdünün ilk ebeveyni önceki HEAD, yani birleştiğiniz daldaki taahhüt. Ancak bu, ustadan özellik dalına ters bir birleştirme yapmadığınızı ve ardından hızlı bir şekilde usta birleştirme işlemine geçmediğinizi varsayar.

Karşılaştığım uzun vadeli şubelere en iyi çözüm, birkaç ay sonra birleştirilen şubeleri önlemektir. Değişiklikler son ve küçük olduğunda birleştirme en kolaydır. İdeal olarak, haftada en az bir kez birleşeceksiniz. Sürekli entegrasyon (Extreme Programlama'da olduğu gibi, “bir Jenkins sunucusu kuralım” gibi), günde birden fazla birleşme önerebilir, yani ayrı özellik branşlarını sürdürmemek, ancak bir geliştirme şubesini ekip olarak paylaşmak. Bir özelliğin QA olması öncesinde birleştirilmesi, özelliğin bir özellik bayrağının arkasına gizlenmesini gerektirir.

Buna karşılık, sık entegrasyon potansiyel problemleri daha erken tespit etmeyi mümkün kılar ve tutarlı bir mimariyi korumaya yardımcı olur: bu değişikliklerin tüm şubelere hızlı bir şekilde dahil edilmesi nedeniyle geniş kapsamlı değişiklikler mümkündür. Bir değişiklik bazı kodları ihlal ederse, birkaç ay değil, yalnızca birkaç gün çalışmayı kesecektir.

Tarihin yeniden yazılması, milyonlarca kod satırı ve yüzlerce veya binlerce aktif geliştirici olduğunda gerçekten büyük projeler için anlamlı olabilir. Bu kadar büyük bir projenin neden ayrı kütüphanelere bölünmek yerine tek bir git repo olması gerektiğine şüphe var, ancak bu noktada, eğer merkezi repo sadece tek tek bileşenlerin “sürümlerini” içeriyorsa, bu ölçek daha uygundur. Örneğin, Linux çekirdeği, ana tarihi yönetilebilir tutmak için ezme kullanır. Bazı açık kaynaklı projeler, yamalar-git-birleştirme yerine e-posta yoluyla gönderilmesini gerektiriyor.


43
@Standback Bir geliştiricinin yerel olarak ne yaptığı umurumda değil… “wip” taahhütlerini kullan, her sabit yazım hatası için ekstra taahhüt ver,…. Sorun değil, çok sık taahhüt etmek daha iyi. İdeal olarak, geliştirici, yalnızca bazı yazım hatalarını gideren tüm taahhütleri birleştirmek gibi itilmeden önce bu taahhütleri temizler. Farklı şeyler yaparlarsa, işleri ayrı tutmaları hala iyi bir fikirdir, örneğin biri gerçek işlevsellik ve ilgili testler, diğeri ilgisiz yazım hataları için. Ancak, bir kez taahhütler bastırıldığında, en azından benim deneyimimde, tarihi yeniden yazmak veya silmek, değerinden daha fazla sorun oluşturuyor.
amon

11
“genellikle cevap vermek imkânsız” “aslında bu işte o da bu işte bağlı mıydı?” “Ben” işte “işte” onların sadece gerçek bir tarihi olmayan, gitmiş en büyük tasarım kusurlarından biri olduğunu taahhüt eden bir işaretçi olduğu gerçeğini görüyorum. Versiyon kontrol sistemime "y tarihinde x'inci x dalında ne olduğunu" sorabilirim.
Peter Green

80
Hiçbir şey, git bisectbir yan daldan sadece 10.000 satıra ulaşması için koddaki bir hatanın nedenini belirlemeye çalışmaktan daha rahatsız edici olamaz.
tpg2114

2
@Standback IMHO ne kadar küçükse, o kadar az okunabilir ve arkadaşça olur. İlk bakışta birkaç noktadan daha fazlasına değen bir taahhüdün anlaşılması imkansızdır, bu yüzden açıklamayı sadece değeriyle alırsınız. Bu açıklamanın okunabilirliği (ör. "Uygulamalı X özelliği"), taahhüdün (kodun) kendisi değil. "Http: https değiştirildi" gibi 1000 tane tek mektup
komisyonu almayı tercih ederim:)

2
cherry-pick, geçmişi yeniden yazmaz veya silmez. sadece mevcut komisyonlardan gelen değişiklikleri çoğaltan yeni taahhütler yaratır
Sarge Borsch

110

Amon'un cevabını seviyorum , ancak küçük bir parçanın çok daha fazla vurgulanması gerektiğini hissettim: İhtiyaçlarınızı karşılamak için günlükleri görüntülerken geçmişi kolayca basitleştirebilirsiniz, ancak diğerleri ihtiyaçlarını karşılamak için günlükleri görüntülerken tarih ekleyemez. Bu nedenle tarihi olduğu gibi tutmak tercih edilir.

İşte depolarımızdan birinden bir örnek. Çekme isteği modeli kullanıyoruz, bu nedenle her özellik tarihte uzun süredir devam eden şubelerinize benziyor, genellikle yalnızca bir hafta veya daha az çalıştırılıyor olsalar da. Bireysel geliştiriciler bazen birleşmeden önce tarihlerini ezmeyi seçiyorlar, ancak çoğu zaman özelliklerle eşleşiyoruz, bu nispeten alışılmadık bir durum. İşte ilk birkaç taahhüt gitk, go ile birlikte gelen GUI:

standart gitk görünümü

Evet, bir dolaşma biraz, ama biz de onu seviyoruz çünkü ne zaman kimin neyin değiştiğini tam olarak görebiliyoruz. Gelişim geçmişimizi doğru bir şekilde yansıtıyor. Daha yüksek düzeyde bir görünüm görmek istiyorsak, bir seferde bir çekme isteği bir araya gelirse, git log --first-parentkomuta eşdeğer olan aşağıdaki görünüme bakabiliriz :

--kirst-parent ile gitk görünümü

git logSize tam istediğiniz görünümü vermek için tasarlanmış daha birçok seçeneğe sahiptir. grafiksel bir görünüm oluşturmak gitkiçin herhangi bir keyfi git logargüman alabilir . Diğer GUI'lerin de benzer yeteneklere sahip olduğundan eminim. Tercih ettiğiniz git loggörüşünüzü birleştirme zamanında herkese uygulamak yerine, belgeleri okuyun ve düzgün kullanmayı öğrenin .


24
Bu seçeneğe aşina değildim! Bu benim için çok büyük bir yardım ve daha fazla günlük seçeneği öğrenmek gibi görünüyor bu konuda daha kolay yaşamama izin verecek.
Stand

25
+1 "İhtiyaçlarınızı karşılamak için günlükleri görüntülerken geçmişi kolayca basitleştirebilirsiniz, ancak diğerleri ihtiyaçlarını karşılamak için günlükleri görüntülerken tarih ekleyemez." Tarihi yeniden yazmak her zaman sorgulanabilir. Taahhüt sırasında kaydetmenin önemli olduğunu düşünüyorsanız, o zaman önemliydi. Yanlış olduğunu bulsan veya daha sonra tekrar yaptıysan, bu tarihin bir parçası. Bazı hatalar, bu satırın daha sonra tekrar yazılmadan kaldığını suçlayarak görebildiğiniz zaman anlam kazanır. Hatalar, destanın geri kalanıyla birlikte ortaya çıktığında, olayların neden bittiğini gözden geçiremezsiniz.
TafT

@Standback İlgili, benim için bu yapıyı korumaya yardımcı olan bir şey kullanıyor merge --no-ff- hızlı ileri birleştirme kullanmayın, bunun yerine her zaman bir birleştirme taahhüdü oluşturun, böylece --first-parentçalışacak bir şeyler olsun
Izkata

34

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.

İlk düşüncem, kesinlikle gerekmedikçe bile yapma. Birleşmeleriniz bazen zorlayıcı olabilir. Dalları bağımsız ve mümkün olduğunca kısa ömürlü tutun. Hikayelerinizi daha küçük uygulama parçalarına bölmeniz gerektiğinin bir işareti.

Bunu yapmak zorunda olmanız durumunda, git - no-ff seçeneğiyle gitde birleştirmek mümkündür, böylece tarihler kendi branşlarında ayrı tutulur. Taahhütler birleşmiş tarihte görünmeye devam edecek, ancak özellik dalında ayrı ayrı görülebilecektir, böylece en azından hangi gelişim hattına dahil olduklarını belirlemek mümkün olabilecektir.

Git kullanmaya başladığımda itiraf etmeliyim ki, şubenin birleşme sonrası ana şubeyle aynı tarihte ortaya çıkması biraz garip bulundu. Bu biraz endişe verici bir durumdu çünkü o tarihe ait olan taahhütler gibi görünmüyordu. Ancak uygulamada, eğer entegrasyon dalının tam da böyle olduğunu düşünürse, bu gerçekten acı verici bir şey değildir - tüm amacı , özellik dallarını birleştirmek demektir. Ekibimizde ezilmez ve sık sık birleştirme işlemlerini yaparız. Araştırmak istiyorsak, herhangi bir özelliğin kesin tarihini kolayca görmesini sağlamak için --no-ff komutunu her zaman kullanırız.


3
Tam olarak anlaştım; herkes çok ustaya yakın durmayı tercih ediyor. Ama bu benim alçakgönüllü etkim altında çok daha büyük ve çok daha az farklı bir konu :-P
Standback

2
+1 içingit merge --no-ff
0xcaff

1
Ayrıca + 1 git merge --no-ff. Gitflow kullanıyorsanız, bu varsayılan olur.
David Hammen,

10

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ı; masterbasitlik 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 rebaseAyrı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 - masterbirleşme sırasında baş ve şube başı.

--no-ffElbette , seçeneği belirttiğinizden emin olun ; Mecburi --no-ffolmanız gerekmeden mecburen birleşme kesinlikle yasaktır. Ne yazık ki, --no-ffvarsayılan değil; ama bunu ayarlayabilecek bir seçenek olduğuna inanıyorum. git help mergeNeler --no-ffolduğ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 guibir 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. gitmerkezden "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-ffbirleş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 Btam olarak git checkout B ; git merge Aetrafa 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 gityaklaşı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 gither 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.


10

Uzun süreli bir yandan yayın ezmek, çok fazla bilgi kaybetmenize neden olur.

Yapacağım şey , yan dalın ana ile birleştirilmesinden önce master'ı uzun vadeli kenar dalına yeniden oturtmaya çalışmak . Bu şekilde, taahhüt tarihini doğrusal ve anlaşılması daha kolay hale getirirken, her taahhüdü ustada tutarsınız.

Bunu her bir taahhütte kolayca yapamazsam , geliştirme bağlamını açık tutmak için doğrusal olmamasına izin verirdim. Benim düşünceme göre, eğer ustanın yan dalda yeniden yapılandırılması sırasında sorunlu bir birleşime sahipsem, bu doğrusal olmayanlığın gerçek dünyadaki önemi olduğu anlamına gelir. Bu, tarihe girmem gerektiğinde ne olduğunu anlamak daha kolay olacağı anlamına geliyor. Ayrıca bir yeniden yapılanma yapmak zorunda kalmadan derhal faydalanıyorum.


: + bahsettiğin için rebase. Buradaki en iyi yaklaşım olsa da olmasa da (kişisel olarak çok fazla deneyimim olmamasına rağmen, kendisiyle harika bir deneyim yaşamamıştım), kesinlikle OP'nin gerçekte istediği şeye en yakın şey olduğu görülüyor - özellikle sıra dışı bir tarih dökümü arasında bir uzlaşma ve bu tarihi tamamen gizleme.
Kyle Strand

1

Şahsen gelişimimi bir çatalla yapmayı tercih ederim, sonra birincil depoya birleştirme istekleri çekin.

Bu, değişikliklerimi ustanın üstüne yeniden uygulamak veya bazı WIP taahhütlerini ezmek istersem, bunu tamamen yapabilirim anlamına gelir. Veya tüm tarihimin de birleştirilmesini talep edebilirim.

Yapmaktan hoşlandığım şey, gelişimimi bir dalda yapmak ama çoğunlukla efendi / deve karşı yeniden yapmak. Bu şekilde, ustadan en son değişiklikleri, bir demet birleştirme işlemi yapmadan, şubeme teslim etmeden ya da usta birleştirme zamanı geldiğinde tüm bir birleştirme çatışması yükü ile uğraşmak zorunda kalıyorum .

Sorunuza açıkça cevap vermek için:

Burada sürekli olarak yan dalları ustalıkla birleştirme komisyonlarıyla birleştirmenin dışında bir seçeneğimiz var mı?

Evet - bunları dal başına bir kez birleştirebilirsiniz (özellik veya düzeltme "tamamlandıysa") veya tarihinizde birleştirme işleminin yapılmasını istemiyorsanız, son bir yeniden ödeme yaptıktan sonra master üzerinde hızlı ileri birleştirme yapabilirsiniz.


3
Üzgünüm - Ben de aynı şeyi yapıyorum, ancak bunun soruyu nasıl cevapladığını
anlamıyorum

2
Belirtilen soruya açık bir cevap eklendi.
Wayne Werner,

Bu yüzden, kendi kararlarım için sorun değil, ama ben (ve ekibim) herkesin çalışmasıyla ilgileneceğim . Kendi tarihimi temiz tutmak kolaydır; Dağınık bir dev tarihte çalışmak burada mesele.
Bekleme

Başka şeylere ihtiyacın olmasını mı istiyorsun? Rebase ve sadece birleştirme squash değil mi? Yoksa bu soruyu iş arkadaşlarınızla gitmeden önce disiplinin eksikliğinden şikayet etmek mi istiyorsunuz?
Wayne Werner,

1
Bu özellik dalı üzerinde birkaç geliştirici çalışıyorsa, düzenli olarak yeniden düzenleme kullanılamaz.
Paŭlo Ebermann

-1

Revizyon kontrolü çöp içinde çöp dışarı.

Sorun şu ki, özellik dalında devam etmekte olan çalışma, "bunu deneyelim ... hayır, işe yaramadı, onunla değiştirelim" ve "final" dışındaki tüm komisyonları "sonlandırabilir yararsızca tarihini kirleten.

Sonuçta, geçmiş tutulmalı (bazıları gelecekte kullanımda olabilir), ancak yalnızca "temiz bir kopya" birleştirilmelidir.

Git ile bu, önce özellik dalını dallandırarak (tüm geçmişi saklamak için) sonra da (etkileşimli olarak) özellik dalının dalını anadan yeniden birleştirerek ve ardından yeniden dallandırılmış dalı birleştirerek yapılabilir.


1
Sadece açıklığa kavuşturmak için: söylediğiniz şey, tarihin öznitelik dalının (bir kopyasının) üzerine yeniden yazılmasıdır, bu nedenle kısa ve temiz bir geçmişe sahiptir - başlangıçtaki gelişimin geri kalanını ortadan kaldırır. Ve sonra, yeniden yazılan dalın ana ile birleştirilmesi daha basit ve temizdir. Seni doğru anladım mı
Bekleme

1
Evet. Üstada dahil olduğunuzda, hızlı bir şekilde ilerleyecektir (birleşmeden önce yakın zamanda yeniden doğduğunuzu varsayarak).
DepressedDaniel

Peki bu tarih nasıl devam eder? Orijinal özellik dalının etrafta yatmasına izin veriyor musunuz?
Paŭlo Ebermann

@ PaŭloEbermann Bingo.
DepressedDaniel

Bir başkasının yorumunda söylediği gibi: şubeler sadece tarih grafiğindeki göstergelerdir gitve yereldirler. Ne adlı foobir repo adlandırılabilir barfarklı birinde. Ve geçici olmaları gerekiyor: Geçmişinizi kaybetmemek için repo'nuzu canlı tutulması gereken binlerce özellik dalı ile karıştırmak istemiyorsunuz. Ve tarihin referansı tutmak için bu dalları tutmanız gerekir, çünkü gitartık bir şube tarafından erişilemeyen herhangi bir taahhüdü siler.
cmaster
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.