Git “Yeniden Yapılanmanın Altın Kuralı” çok mu gerekli?


22

Geçtiğimiz günlerde GIT'deki özellik branşlarının yeniden yaratılması stratejisine kesinlikle karşı çıkan insanlarla bir tartışma yaptım. Rebase'ı yalnızca yerel, özel dallar için kullanmak kabul edilmiş bir kalıp gibi gözüküyor, ancak aynı özellik ve dalda çalışan birkaç kişi varken, "Sözde Yeniden Yapılanmanın Altın Kuralı" (buradaki gibi: https) : //www.atlassian.com/git/tutorials/merging-vs-rebasing/conceptual-overview )

Bu konuda bir fikir birliği olmasına şaşırdım. 3 yıl boyunca tam bir yeniden doğuş stratejisiyle çalıştım, yaklaşık 20 geliştirici birlikte çalıştı ve ne olduğunu tahmin etti, işe yaradı.

İşlem temelde:

  • Özellik dalınızı oluşturursunuz, hadi buna "özellik" diyelim ve kökene / etki alanıma itelim
  • Diğer insanlar kontrol edebilir ve üzerinde çalışabilir
  • Bazen onu ustadan yeniden değerlendirebilirsiniz: "myfeature" den, git rebase origin / master ; ve sonra, evet, onu zorlaman gerekiyor.
  • Diğer insanlar taahhütlerini zorlamak istediğinde ne olur? Onlar sadece yeniden rebase: git rebase kökenli / myfeature . Böylece şimdi hızlı ileri sarılıyorlar ve zorlamadan zorlayabilirler.

Saygı duyulan ilk prensip , özellik branşının birine ait olmasıdır . İcra edebilen tek kişi sahibidir.

Bu yüzden itiraf ediyorum: bir itme kuvveti olduğu anda hata yapma riski vardır. Bu doğru. Ancak hatalardan kurtulmanın birçok yolu var ve gerçekten, 3 yıllık gelişimde, çok fazla zorlayıcı hata görmedim ve bu gerçekleştiğinde, her zaman gerektiği gibi düzeltmenin bir yolunu bulduk.

Peki, neden bu "Rebase'ın Altın Kuralı" bu kadar yaygın kabul görüyor? Kaçırdığım başka bir şey var mı? Minimum organizasyon gerektiriyor (her strateji bazı organizasyonlar gerektiriyor) ama işe yarıyor.


Söylemeyi unuttuğum bir şey var, ama önemi var: Önceki deneyimimde bir kod inceleme aracı olarak gerrit kullanıyorduk. Bu, eğer şube sahibi bir rebase yaparken birileri bir taahhütte bulunursa, bu taahhüdün kaybolma riski yoktur, çünkü doğrudan orijin deposuna değil, bir miktar hataya zorlanır. Ve şube sahibi, hak sahibinden taahhütte bulunma hakkına sahip olan tek kişi olduğu için, hata yapma riski çok düşüktü.
Joel

ya başkasının özellik dalını kendi şirketime dahil edersem?
Winston Ewert

Özelliğiniz bir başkasına bağlıysa, sanırım sizinkini diğerinden yeniden başlatabilirsin: git yeniden başlama kaynağı / diğerSeçenek (hedef tarihi doğrusal tutmak olduğundan, birleştirme yerine yeniden yapıyorum derim). Dallar arasında gittikçe daha fazla bağımlılık ortaya koyduğunuzda, bunların karmaşıklığının çok arttığını kabul ediyorum.
Joel

Yanıtlar:


10

Zorla zorlama ile ilgili sorun, özellik dalınız ve yöneticinizle ilgili değildir, ancak ustanızı başkasının ustasına zorlamakla ilgili - bu senkronizasyon, değişikliklerinizle ilgili ustalarının üzerine yazacak ve ipuçlarında ne olduğunu görmezden gelecek.

Bu tehlikeyi göz önünde bulundurarak, işler batırılmadıkça ve tamamen, tamiratı etkilemek için kesinlikle kullanmanız gerekmedikçe, hiç kullanmamanız için bir neden vardır. Bir SCM sisteminin böyle bir zorla yapılması gerekmemelidir, eğer bir şey çok yanlış gittiği için yaparsa (ve bu gibi durumlarda ilk yaklaşımım yedekleri geri yüklemek ve geçmişi sağlam tutmak için işlemleri tekrarlamak olacaktır).

Öyleyse belki de soru şu ki, neden hiç isyan ediyorsun? Özellikleri ustalığa geri getirirken 'temiz' geçmiş için? Öyleyse, tamamen stilsel nedenlerden dolayı dallanma ile ilgili tüm güzel geçmişi atıyorsunuz. IMHO hızlı ileri birleştirme de en iyi uygulama değil, tüm geçmişi saklamak zorundasınız, böylece gerçekte ne yaptığını görebilecek, daha sonra sterilize edilmiş bir versiyonunu görmeyeceksiniz.


Tabii ki, ustaları çekebilir, yeniden kurabilir ve sonra zorlamaya zorlayabilirsiniz, ama bu atomik değildir.
Kevin

@gbjbaanb kesinlikle haklısın, yeniden yapılanma stratejisi tamamen stil sebepleriyle / daha okunabilir tarihle ilgili. Daha iyi ya da değil olduğunu tartışmaya çalışmıyorum. Ama bunu yapmak mümkün, ve yükseltmek istediğim nokta bu. Tabii ki, efendiye zorla baskı yapmaktan bahsetmiyordum, sadece sadece özellik dallarında.
Joel

4
IMHO hem rebase hem de hızlı ileri sarma birimlerinin tasarım özelliği yanlıştı. SCM, geçmişi korumakla ilgilidir, böylece ihtiyacınız olduğunda ne olduğunu görebilirsiniz ve zamanla ilgili noktalar için anlık görüntüler çekebilirsiniz. En azından çoğu insanın istediği şey bu, sanırım Linus tarihin mümkün olduğunca okuması için basit olmasını istedi ve bu yüzden onların yararına olmasını istedi. IMHO o (yani daha basit olmasını görülmesine imkan verecek değil altta yatan tarih) daha yönetilebilir yerine 2 değişiklik arasındaki yapım fark dosyaları içine daha çok çaba harcaması gerektiğini
gbjbaanb

2
Bir makale yayınladığınızda, ilk taslağı yayınlar mısınız? İlk taslağı yazmak için kullandığınız araçları yayınlamak için kullanamayacağınızı söyleyen bir yasa var mı? Git bir geliştirme aracıdır. Bir diziyi güvenilir ve doğrulanabilir bir şekilde korumak istiyorsanız, onu koruyun. Bunun yerine yayın için düzenlemek istiyorsanız, düzenleyin. Git'in her iki görevinde de yıldız.
jthill

5

Rebase çoğunlukla kozmetik olduğunu söylediğiniz gibi, zorunlu değil. Bazen bir birleşmeden sonra çok daha basittir. Bu yüzden bazı "gerçek" bir değere sahip olabilir, ancak sadece "bazen"

Rebase'in yanlış kullanımı pahalı olabilir. Kurtarma prosedürlerini paniklemeyip aramamaya yetecek kadar bilginiz varsa, verileri kaybetme ihtimaliniz yoktur, ancak "hey, bir süre düzeltmem gereken kimse ..." deme harika değildir. Ayrıca, özellikler eklerken ya da böcekleri ezerken (ya da ailesiyle birlikte evde) araştırma kurtarma ve test etme konusunda da zaman harcamıyor.

Bu takas ile "çok az insan bir yeniden fiyatlandırma ve zorla itme" nin sonuçları çok şaşırtıcı değil.

Bazı iş akışları riski azaltabilir, örneğin “hangi dalları zorladığınızı ve hangilerini yapamayacağınızı hatırladığınız sürece” sıfıra düşürür. Gerçekte riski haklı çıkaracak kadar güvenli olabilirler, ancak millet daha büyük folklorlara dayanan seçimler yapar. Sonra tekrar gerçekte faydalar oldukça küçüktür, peki riskin ne kadar küçük olması gerekir?


3
"hey kimse benim bir süredir düzeltmek zorunda kalmam ..." .. Visual Source Safe kullanmanın eski günleri gibi. Git'in bundan daha iyi olduğunu sanıyordum.
gbjbaanb

Evet, böylece insanlar “keskin aletlerle oynamayın! (Zorla itin)” gibi kurallar koyarlar. Böylece önlenebilir yaraları tedavi etmekten kaçınabilirler!
Stripes

2
@gbjbaanb Evet, Git bundan daha iyidir - doğru kullandığınızda. Git'in sürekli olarak yeniden doğarken ve her şeydeki bağlılık değerlerini değiştirirken zarif şekilde eşzamanlı gelişme ile başa çıkamadığından şikayet etmek, atların çekmesi için çok daha ağır oldukları için arabaların taşıyıcılarının altında kalmasından şikayet ediyor. İnsanların yanlış kullanmakta ısrar etmeleri aracın suçu değil ...
Idan Arye

4
Bu bir nevi aletin hatası. Git, LOT keskin kenarlar ortaya çıkarır ve bazen keskin olduklarını belirtirken sık sık yapmazlar. Eğer tüm keskin bitlerin bir SINGLE alt komutunda ("cvs admin"? Olduğu bir süredir yararı var ...) CVS ile karşılaştırırsanız, "sizi kötü kesebilir" demekten kurtulun bir zorunluluk gerekmedikçe kullanın ". Ya da zarar verebilecek yetenekleri ihmal eden diğer sürüm kontrol sistemleri.
Stripes

4
Git'in geçerli tasarım seçimleri yapmadığı söylenemez (alt komuta göre grupla ilgili işlevsellik ve git'in daha karmaşık şeyleri doğru ellerde çözmesine izin vermeyi tercih et) ... ama bunlar SEÇENEKTİR Keskin kenarlara sahip olmak için bir seçim, tıpkı birine benzeyen diğer VCS'lerin seçiminde kritik öneme sahip olabilir, "sadece birileri incinebileceği için".
Stripes

2

Farklı bir ses eklemek için:

Evet, tanımladığınız gibi çalışıyorsanız, kullanma rebaseve zorlama ile ilgili hiçbir sorun yoktur . Kritik nokta: Takımınızda bir anlaşmanız var.

rebaseÖzel anlaşmanın olmadığı durumlar için arkadaşlar ve arkadaşlar hakkında uyarılar var. Normalde, git, örneğin hızlı ileri almayan bir itmeye izin vermeyerek sizi otomatik olarak korur. Kullanmak rebaseve zorlamak bu güvenliği geçersiz kılar. Yerinde başka bir şey varsa sorun değil.

Ekibimde, bazen tarih dağınık hale gelmişse özellik dallarını yeniden oluştururuz. Eski şubeyi sileriz ve yeni bir isimle yeni bir tane yaparız ya da sadece gayrı resmi olarak koordine ederiz (bu mümkün çünkü küçük bir ekibiz ve havuzumuzda hiç kimse çalışmıyor).


Git projesinin kendisinin de benzer bir şey yaptığını unutmayın: Düzenli olarak yeniden oluşturulan, "pu" ("önerilen güncellemeler") adlı bir entegrasyon dalına sahiptir. Bu şubenin düzenli olarak yeniden yaratıldığı ve bunun üzerine yeni çalışmalar yapmamanız gerektiği belgelenmiştir.


1

Bu yüzden itiraf ediyorum: bir itme kuvveti olduğu anda hata yapma riski vardır. Bu doğru. Ancak hatalardan kurtulmanın birçok yolu var ve gerçekten, 3 yıllık gelişimde, çok fazla zorlayıcı hata görmedim ve bu gerçekleştiğinde, her zaman gerektiği gibi düzeltmenin bir yolunu bulduk.

Git kullanıcılarının paylaşılabilir değişken geçmişinden kaçınmasının nedeni, bu sorunların otomatik olarak önlenmemesi veya onarılmamasıdır. Ne yaptığınızı bilmek zorundasınız ve uyuşmazsanız her şeyi elle düzeltmek zorundasınız. Tam olarak bir kişinin zorla itme yapmasına izin vermek sezgisel değildir ve Git'in dağıtık tasarımına aykırıdır. O kişi tatile çıkarsa ne olur? Şubeden geçici olarak başka biri var mı? Asıl sahibinin yaptığı her şeyi yapamayacaklarını nereden biliyorsun? Açık kaynak dünyasında, şube sahibi resmen ayrılmadan kademeli olarak topluluktan uzaklaşırsa ne olur? Şube sahipliğini bir başkasına devretmeyi bekleyen çok zaman kaybedebilirsiniz.

Ancak asıl mesele şudur: Eğer karışırsanız ve hemen farketmezseniz, eski görevliler yeterli zaman geçtikten sonra kaybolacaktır . Bu noktada, sorun çözülemez olabilir (veya yedekleme hikayenizin neye benzediğine bağlı olarak, en azından potansiyel olarak kurtarılması çok zor olabilir - Git deponuzun eski kopyalarını yedekler misiniz, yani yalnızca klonları değil mi?).

Bu, Mercurial'ın Changeset evrim çalışmasına zıt (ki şunu da belirtmeliyim ki, henüz bitmedi veya sabit değil). Değişiklikler genel olarak işaretlenmemişse, herkes istediği tarihte istediği değişiklikleri yapabilir. Bu değişiklik ve yeniden indirim işlemleri bir şube sahibine ihtiyaç duyulmaksızın tamamen cezasızlıkla itilip çekilebilir. Hiçbir veri silinmez; tüm yerel veri havuzu sadece ekleme amaçlıdır. Artık ihtiyaç duyulmayan değişiklik kümeleri eski olarak işaretlendi, ancak süresiz tutuldu. Son olarak, tarihinizi mahvettiğinizde (günlük iş akışınızın normal bir parçası olarak kabul edilir), sizin için otomatik olarak temizlemek için şık bir komut vardır. Bu , UX çalışanlarının paylaşılan tarihi değiştirmeden önce bekledikleri tür.


Bu "git felsefesi" ile aynı fikirdeyim ve ayrıca felsefelerin bazen saldırıya uğrayabileceğini düşünüyorum :). Daha ciddi bir şekilde, yorumlarda da belirtildiği gibi, bu şimdi 3 yıl önce, bu tür potansiyel dramatik zararı önleyen fiili bir yedekleme aracı olarak hareket eden bir kod inceleme aracı olarak özel bir durumdaydım. Şimdi bir şubeyi "kontrol etmek" istediğinizden emin olduğunuzda rebase'nin tamam olduğunu düşünüyorum. Açık kaynak kodlu bir projede bile, bir özellik geliştirip çekme isteği açarsam, bu PR'a "sahip olurum", şubesini yeniden açma hakkına sahip olduğumu düşünüyorum, yeniden yapılanma sırasında kendi çalışmamı mahvetmemek bana kalıyor ... (1/2)
Joel

... ve bazı insanlar bu PR'a değişiklik getirmek istiyorsa, önce bana söylemeleri gerektiğini düşünüyorum ve bu bir iletişim meselesi. (2/2)
Joel

PS: Changeset evrimi bağlantısı için teşekkürler, bu ilginç
Joel

Aslında, rebase şöyle diyor: "tüm çalışmamı sıfırdan yazalım (en son ustadan), önceki çalışmamı silerek.". Bunu yapmakta sorun yoksa, yeniden yapmak için sorun olmaz.
Joel,
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.