Özellik dallarında uzmanlaşmak için birleştirme öncesi kod inceleme stratejisi


22

Ben ve ekibim özellik dallarını kullanıyoruz (git ile). Usta birleştirme önce kod inceleme için en iyi strateji hangisi olduğunu merak ediyorum.

  1. Master'dan yeni bir şube satın alıyorum, ha fb_ # 1 diyelim
  2. Birkaç kez taahhüt ediyorum ve efendiye geri getirmek istiyorum.
  3. Birleştirmeden önce birisinin kod incelemesi yapması gerekiyor

Şimdi 2 olasılık var:

1 inci

  1. Ben birleştirme 1. fb_ için usta ( değil yukarı güncel mümkün olduğunca bunu yapmak için usta fb_ # 1)
  2. Bir takım arkadaşı ana kafa ile fb_ # 1 kafa arasındaki değişiklikleri gözden geçirir
  3. Fb_ # 1 tamamsa, fb_ # 1 ile master'ı birleştiririz
  4. Artıları: incelemede eski kod yok
  5. Eksileri: Birisi "1" arasında bir şey birleştirirse ve 2." Değişiklikleri incelemede görünüyor, ancak bunlar başka bir incelemeye ait.

2

  1. Bir takım arkadaşı, ödeme noktası (git birleştirme-temel ana fb_ # 1) ve fb_ # 1 kafa arasındaki değişiklikleri gözden geçirir
  2. Artıları: özellik dalı üzerinde çalışırken tam olarak nelerin değiştiğini görüyoruz
  3. Eksileri: Bazı eski kod incelemede görünebilir.

Sizce hangi yol daha iyi ve neden ? Belki daha uygun bir yaklaşım daha vardır?

Yanıtlar:


9

1. seçeneğinizin bir varyasyonu var:

  1. master'ı fb_ # 1'e (fb_ # 1'den master'a değil) mümkün olduğu kadar güncel hale getirmek için birleştirme
  2. Bir takım arkadaşı , birleştirdiğiniz noktada ana ve fb_ # 1 kafa arasındaki değişiklikleri gözden geçirir
  3. Fb_ # 1 tamamsa, fb_ # 1 ile master'ı birleştiririz
  4. birleştirme tamam olup olmadığını hızlı bir şekilde kontrol edin

Örneğin.

... ma -- ... -- mm -- ... -- mf  <- master
      \            \         /
       f1 ... fn -- fm -----      <-- fb_#1

nerede:

  • ma , ustanın atası ve fb_ # 1.
  • fn şubenizdeki son değişiklik
  • mm , şubenize birleştirdiğiniz sırada usta / HEAD olan taahhüttür ( fm ).

Bu nedenle, ilk incelemenizdeki mm ve fm değerlerini karşılaştırırsınız ve ardından 1-3 adımlarında master üzerinde önemli bir değişiklik olmadığından emin olmak için mf'yi birleştirdikten sonra hızlıca kontrol edin . Bu ilk inceleme için tüm artıları ve eksilerini hiçbiri var gibi görünüyor.

Bu, gözden geçirmenin master'a basılan normal değişiklik sıklığına kıyasla hızlı olduğunu varsayar, bu nedenle fm -> mf genellikle hızlı ileri gider.

Eğer böyle değilse , ne sebeple olursa olsun, eksiler sadece ilk gözden geçirmeden birleştirme sonrası gözden geçirmeye geçecek ve doğrudan usta üzerine birleştirmek ve orada tek bir inceleme yapmak daha kolay olabilir.


"Birleştirdiğiniz noktayı" nasıl edinebilirim? "Git Birleştirme-Baz Master Başkanı" tamam mı, yoksa ilk dallanma noktasını gösterecek mi?
Andrzej Gis

Birleştirmeden sonra kasıtlı olarak master güncellemediğiniz sürece, sadece master olacaktır.
Yararsız

Evet, fakat eğer bir başkası güncellerse bu noktaya nasıl ulaşılır?
Andrzej Gis,

Fb şubesindeyken kullanın git show HEAD. Bu fm birleştirme taahhüdü olacağından, her iki ebeveyni de listeler . Öyleyse, mm bir hash var . Alternatif olarak, trivially yapabilirsiniz bakınız de ebeveyni gitkveya başka herhangi git tarayıcısını
Yararsız

13

3 üncü

  • Sen rebase hem marka o kadar güncel master üzerinde şube ve değişikliklerin ayrı tutmak.

    Bu da şubenin yeni bir tarihini yaratır. Aynı kimliğe sahip olacak, ancak en yeni master'dan türetilecek ve eski revizyonlarla bağlantı kurmayacak yeni kimlikleri olan yeni revizyonlar olacaktır. Eski revizyonlara "reflog" da erişilebilir, örneğin bunlara başvurmanız gerekiyorsa, örneğin uyuşmazlık çözümünde hata yaptığınızı tespit edersiniz. Bunun yanında değersizdirler. Git, varsayılan olarak 3 ay sonra reflog'u hazırlar ve eski düzeltmeleri atar.

  • Sen kullanmak interaktif rebase ( git rebase -ive git commit --amendsipariş düzenleyebilir) ve her bir mantıksal kapalı değişiklik yapar, böylece değişiklikleri temizlemek.

    Bu da yine yeni tarih yaratır, bu sefer ek avantajlarla yaptığınız değişiklikleri gözden geçirirken en anlamlı şekilde yeniden yapılandırabilirsiniz.

  • Artıları:

    • incelemede eski kod yok
    • özellik dalında çalışırken tam olarak nelerin değiştiğini görüyoruz
  • Eksileri:
    • biraz daha iş
    • zaten birleştirilmiş ya da paylaştığınız ve alıcının geri sarılmasını beklemeyen herhangi bir şeyi yeniden açmamaya dikkat etmeniz gerekir.

Genellikle, ek iş, önce kodu kendiniz iyice incelemeniz ve bu da birçok sorunu yakalamanız anlamına gelir.

Linux ve Git'in yaptığı budur. Ve bu projelerde defalarca gözden geçirilmek üzere 20 ila 25 yama gönderildiğini ve tekrar yazıldığını görmek sıra dışı değildir.

Aslında Linux, projenin başından itibaren, sürüm seçiminin tarballs ve yamalar olduğu zamanlarını yaptı. Yıllar sonra Linus git'i oluşturmak için yola çıktığında, rebasekomutu uygulamak için en önemli neden buydu ve etkileşimli varyantıydı. Ayrıca yüzünden git ayrı kavramını sahiptir yazar ve committer . Yazar, revizyonu ilk yapan kişi oldu ve yorumcu en son ona dokundu. Hem Linux hem de Git'te yamalar hala e-postayla gönderildiğinden, ikisi neredeyse asla aynı kişi değildir.


1
+1 ayrıca OP sonraki adımları da sormadı, ancak özelliğinizin ustalaşmasını sağlamak için, merge --no-ff
komisyonun

@ stijn: --no-ffyukarı ve aşağı yönleri vardır. Şahsen ben her şeyden daha fazla gürültü buluyorum. YMMV.
Jan Hudec

evet bu bir tercih meselesidir. Eğer usta normalde temiz ve düz ise, ayrı bir 'kabarcığa' sahip büyük özellikleri umursamıyorum. Eğer usta zaten bir karmaşa ise, no-ff sadece daha da kötüleştirir
stijn

Keşke modu bir cevaptan daha fazla kabul edebilseydim. Hibrit bir çözüm ideal olacaktır. Rebase kullanarak ve dallanma noktasıyla karşılaştırmak, gidilecek en iyi yol gibi görünmektedir.
Andrzej Gis 17:13

Second Con - Şubenizi daha önce herhangi biriyle paylaştıysanız, bunu yapabileceğinizi sanmıyorum. Tarihi yeniden yazdığınızda tutarsızlıklar olacaktır.
altmış ayak sesi 19:13

4

Aslında üçüncü bir elverişlilik vardır - ve büyük olasılıkla bol miktarda, çünkü GIT bir SCM çerçevesinin bir uygulamasıdır, bir SCM metodolojisinin bir uygulamasından daha fazladır. Bu üçüncü olasılık dayanmaktadır rebase.

rebaseGYTE alt komutu (genellikle konu dalın ucunda için dallanma noktasından işlemek bir dizi alır topic) ve (genellikle entegrasyon dalın ucunda, örneğin en başka bir yerde tekrar onlara master). Alt rebasekomut, komisyonların gözden geçirilmesi daha kolay bir biçimde yeniden düzenlenmesi olanağı sağlayan yeni komisyonlar üretir. Bu topic, entegrasyon dalının en üstünde köklü görünmekle aynı olana benzer yeni bir taahhüt dizisi oluşturur . Bu yeni şubeye hala topicGIT adı verilir , böylece eski referans atılır. Şubenizin topic-0orijinal halini topic-1ve çeşitli refactoring işlemlerini gayrı resmi olarak etiketlerim .

İşte topicşubenize önerim :

  1. (İsteğe bağlı adım) Sen etkileşimli konu şube rebase topiconun dallanma noktasında (bkz --fixupseçeneğini commitve -ive --autosquashseçenekleri rebasesize inceleme daha kolay bir şekilde sizin kaydedilmesini yeniden yazmak için fırsat veren). Bu bir dalla sonuçlanır topic-1.

  2. Konu şubenizi entegrasyon şubenizin en üstünde yeniden birleştirirsiniz, bir birleştirme işlemine benzer, ancak yalnızca bir yazılım mühendisliği eseri olan bir birleştirme ile tarihi “kirletmez”. Bu bir dalla sonuçlanır topic-2.

  3. topic-2Tahminine göre inceleyen bir takım arkadaşına gönder master.

  4. Eğer topic-2sorun yoksa , usta ile birleştir.

Not - Şube kesin ağacına atıfta bulunur - şubelerin tümü GIT tarafından aynı olarak adlandırılır, bu nedenle işlemin sonunda GIT'de yalnızca şubenin topic-2adı vardır.

Artıları:

  • İncelemede eski kod yok.
  • Sahte “yabancı birleşmeler” incelemeleri yok (1'de tanımladığınız fenomen).
  • Temiz bir şekilde yeniden yazma fırsatı.

Eksileri:

  • Bunun yerine tek bir şubesi topic-0, orada üç şube eserler olduğunu topic-0, topic-1ve topic-2ağaç işlemek o oluşturulur. (Her ne kadar herhangi bir zamanda GIT’de sadece birisinin ismi vardır.

1. senaryonuzda «biri" 1 "arasında bir şey birleştirdiyse ve "2." »dallanma noktasının oluşturulması ile birleştirmeye karar verdiğiniz zaman arasında geçen süreyi ifade eder. Bu senaryoda «biri" 1 "arasında bir şey birleştirdiyse ve "2." »rebase ve birleştirme arasında geçen ve genellikle çok kısa olan süreyi ifade eder. Böylece, verdiğim senaryoda master, birleştirme sırasında şubeyi önemli ölçüde iş akışınızı rahatsız etmeden birleştirme süresi boyunca “kilitleyebilirsiniz” , ancak birinci senaryoda pratik değildir.

Sistematik kod incelemeleri yapıyorsanız, taahhütleri uygun bir şekilde yeniden düzenlemek iyi bir fikir olabilir (isteğe bağlı adım).

Ara dal yapılarını yönetmek, yalnızca havuzlar arasında paylaşmanız durumunda bir zorluk yaratır.


Hiçbir olmalı topic-0, topic-1ve topic-2dalları. Rebase tamamlandıktan sonra, önceki sürüm ilgisizdir. Olacağını hepsi Yani topic@{1}, topic@{2}, topic@{yesterday}, topic@{3.days.ago}vb size rebase çatışma çözünürlüğü vidalı bulmak durumunda kıçının kaydedin.
Jan Hudec

Üç dal var, fakat adı yok (ref). Belki de bunu vurgulamalıyım.
Michael Le Barbier Grünewald

Revizyonlar var ve reflog girişleri ile belirtiliyor. Fakat dallar olarak sadece bir tane var topic. Çünkü git'teki dal sadece addır.
Jan Hudec

Beni "yabancı birleşmelerden" nasıl kurtarıyor? Konu 2'yi bir takım arkadaşına gönderdikten sonra bir takım ustayla bir araya gelirse ve takım arkadaşı bunu ustanın ipucuna karşı incelerse?
Andrzej Gis

Herhangi bir zamanda @JanHudec denilen tek bir dal var topicGIT'de hep dallarından biri ben etiketli (değil GYTE referans olduğu gibi ağaç işlemek gibi bir dalı), topic-0, topic-1, topic-2.
Michael Le Barbier Grünewald
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.