İncelenmekte olan başka bir şubeye bağımlı olan bir şube üzerinde çalışmak


65

Git aşağıdaki senaryo ile ilgilenmeye nasıl yardımcı olur:

İki parçaya bölünmüş bir görevim var: arka uç ve ön uç. Arka uç değişikliklerini birleştirmek ve bir araya gelmesini beklemek için bir çekme isteği yapıyorum (ve geri bildirime hitap ediyorum). Beklerken, ön uç değişikliklerinde gerçekten çalışamıyorum, çünkü arka uç değişikliklerine bağlı ve bunlar ana dalda henüz mevcut değil.

Değişiklikleri gözden geçirmek için, arka uç değişiklikleri şubesinden yapılan ön uç değişiklik şubesinde değişiklik yapmanın en iyi yolu nedir?


14
Genelde, arka uç projenin arayüzleri açıkça tanımlanmalıdır. Bu nedenle, ön uç uygulamanıza başlarken, arka uç mantığı hala gözden geçirilirse, bir taklit kullanabileceğiniz gibi sizi rahatsız etmemelidir.
Herr Derb

17
@HerrDerb Oh tatlı yaz çocuğu ...
gardenhead

4
Neden henüz gözden geçirilmemiş arka uç koduna yazmıyorsun?
user253751

Ekibinizin bu durumu ele almak için üzerinde anlaşmaya varılmış bir teknik var mı? Olmazsa, belki de böyle bir konuda hemfikir olmalısınız, çünkü bu oldukça yaygın bir durum.
Radu Murzea

Hiçbiri yok. Bu soruyu sormamın nedeni bu. Çok iyi önerilerim var. Önerileri deneyeceğim ve benim için nasıl çalıştıklarını göreceğim.
sul4bh

Yanıtlar:


42

Benim de bazen bu problemim var. Git çok esnektir. İşte bunu yapmanın bir yolu.

İlk şubeniz featureAincelemeye hazır.

İkinci şubeniz featureBgeliştiriliyor ve featureAşubedeki koda bağlı .

featureAŞubeyi şubeye birleştir featureB.

Eğer değişiklik yaparsanız featureAşube o zaman birleştirmek gerekir featureAiçine şube featureBdeğişiklikleri dahil etmek yine dalı.

Ayrıca featureA, ana gövdeye ilk girdiğinizden emin olmalısınız , aksi takdirde featureBana gövdeye birleşince, yanlışlıkla da birleşeceksiniz featureA. Bir zamanlar featureAana bagaja birleştirildiğinde, şu featureAan featureBsadece ana bagaja bağlı olduğu için daldan kurtulabilirsiniz .

Özellik dallarım birbirine bağlı olmadığında tercih ederim, bazen yaparlar ve bununla birlikte yuvarlanmanız gerekir.


Bu mantıklı. Bu birleşmesini geri almayı için izin veriyor mu featureAüzerine featureBeğer gerekirse?
sul4bh

8
Geri alma işlemi yoktur, ancak @ 9000'den bahsedildiği gibi, yeni bir şube açabilir ve featureAyeniden başlamak zorunda kalırsanız, istediğiniz komisyonları kiraz seçebilir . Git şubelerini tek kullanımlık olarak düşünmek güzel. Onlar ucuz ve kolaydır, her zaman yeni bir şube yapabilirsiniz. featureBEmin olmadığınız bir şeyle oynamak istersen , şubenizden bir test şubesi bile yapabilir ve eğer işe yaramadıysa hurdaya çıkarabilir , ya da çalıştıysa featureBşubenize geri döndürebilirsiniz .
Matt

9
Birleştirme, geri dönüşü zor olacak (imkansız olmayan) bir karmaşa yaratacaktır. Cherry-pick veya rebase'i tekrar okurdum (yani: propertyB'nin altındaki özellik A'daki her şeyi cherry-pick). 9000'in cevabını görün.
Pierre.Sassoulas

1
Bu, birisi özellik A ve özellik B için hangi kodun değiştirildiğini anlamak istediğinde, yıllar boyunca sorun çıkacak karmaşık bir tarih oluşturur
Ian

2
featureA güncellenir eğer featureB rebased edilmelidir değil birleşti
Lyndon Beyaz

39

Bekle, birleştirmeyi atla

Bu yaklaşım için, do not birleştirme istiyorum feature_aiçine feature_btekrar tekrar.

Yeniden cevaplandırma başka cevaplarda da belirtilmiştir, ancak yalnızca işleri yeniden yapmak için kullanılmıştır master. Senin durumunda ne yapmak istiyorsun:

  • Başlat feature_bdan feature_a, yani:

    git checkout feature_a
    git checkout -b feature_b
    
  • Birleşmeyi feature_abeklerken ne zaman değişirse, ona yeniden ödememaster yaparsınız : feature_b

    ... commit something onto feature_a ...
    git checkout feature_b
    git rebase feature_a
    
  • Son olarak, bir feature_aaraya getirildikten sonra master, masteryenisini alırsınız ve feature_ason kez yeniden düzenlersiniz :

    git checkout master
    git pull origin master
    git checkout feature_b
    git rebase --onto master feature_a feature_b
    

    Bu son rebase, feature_ataahhütten sarkan tüm taahhütleri (artık birleştiği için artık alakasızdır master) tam üzerine yerleştirecektir master. Sizin feature_bşimdi basit, standart bir dal sağ gidiyor master.

EDIT: yorumlardan ilham aldı, biraz kafa üstü: her iki özelliği de etkileyen bir değişiklik yapmanız gerekiyorsa, bunu yaptığınızdan emin olun feature_a(ve gösterildiği gibi yeniden başlayın). Do not her iki branşta iki farklı kaydedilmesini bunu yapmak, hatta cazip olabilirler; feature_atarihinin bir parçası olduğu gibi , feature_biki değişik komisyonda tek bir değişikliğe sahip olmak, anlamsal olarak yanlış olacaktır ve daha sonra istenmeyen kodların çatışmasına veya “yeniden dirilmesine” yol açacaktır.


2
feature_aBirden çok kez yeniden yapılanma ile daha sonra feature_a, bu arada kendiliğinden yeniden doğduğunda sorunlarla karşılaşabilirsiniz . Koşmanın sonucu olarak, git checkout feature_b; git rebase feature_ayeni değişiklikleri geri alan çatışmalar veya bazı komik taahhütler alabilirsiniz feature_a. Bu genellikle --interactivediğer dalın eski versiyonundan alınan komisyonları kullanarak ve atlayarak çözülebilir (Son zamanlarda bunu birkaç kez yapmak zorunda kaldım).
maaartinus

@maaartinus, heads-up için teşekkürler, bu tür sorunları kendim karşılamadım. Gibi rebasebasit çok daha fazla bireysel adımlar yapar merge, bu çatışmaları yaratmak için göze hitap eden daha yüksek şans mutlaka vardır; Öte yandan mergebu durumda sadece anlamsal olarak oldukça yanlış olur.
AnoE

Sanırım, mergebenzer veya daha kötü problemleri olurdu (bir çatışma istenmeyen bir değişime girmek kadar kötü değildir). Bir dalı, ilgisiz birçok değişiklikten önce gelen (öncelikli olarak farklı bir şubeye ait) istenen değişikliklerin sırası olarak görüyorum . Aynı dalda tekrar tekrar yeniden doğarken, yine de (muhtemelen güncellenmiş bir şekilde) geleceklerini bildiğim için ilgisiz değişiklikleri her zaman kaldırırım ve iyi sonuç verir.
maaartinus,

1
@maaartinus, bunun hakkında küçük bir zeyilname ekledim (sürekli olarak iki ayrı komisyonda değil, sadece her iki dalda da yapılması gereken değişiklikleri yapmak için).
AnoE

Güzel teknik. Her zaman yaptığım gibi. git rebase --ontoFTW: D
Radu Murzea

29

Her özellik dalınızın bağlı olduğu ve sürekli değişen bir şubeniz zaten var. Buna denir master.

Bir özellik dalı için tipik bir yol senkronizasyonu sağlamak için masterkalmaktır üstünde o. Ne zaman masterdeğişiklikler, normalde git fetch origin master:master && git rebase mastersizin branşın çalışma dizininde.

Aynı şeyi başka bir özellik dalında da yapabilirsiniz: üstüne getirmeye devam edin ve üzerine yeniden asın.

Bazı nedenlerden dolayı, farklı bir dalına değişiklikleri taşımak gerekir varsa, kiraz alabilirsiniz sizin diğer şubesinin kaydedilmesini ile karışık asla kaydedilmesini.


Ama bence senaryo b özelliğinin b özelliğine sahip olan koda ihtiyacı olduğunu, ustadan dallanmanın çok yardımcı olmayacağını düşünüyorum. Nereden başlamalıyım? Özellik-a'dan dallanmalı ve özellik-a'nın master ile yeniden bütünleşene kadar senkronize olmasını sağlamalı mıyım ve sonra ustadan özellik-b'ye yeniden kazanmalı mıyım?
Sinaesthetic

@Sinaesthetic: Kurs tabanının can feature-büzerine feature-ave aynı zaman sonra bir Rebase zaman bunu feature-adeğişiyor. Bu, büyük bir değişikliği gözlemlenebilir hale getirmenin tipik bir yoludur: onu part-A(temelli master), part-B(temelli part-A) ve gerekirse daha fazlasına ayırın. Ardından, her parça için bir çekme isteği yapın ve hakemler daha küçük, mantıksal olarak gruplanmış parçalara bakarak daha kolay zaman geçirir.
9000

PR açısından part-a ile part-a'nın part-b'yle master'ını yeniden kazanmamın bir önemi var mı? Sadece değişikliklerin part-b değişikliklerini part-b'deki değişiklik olarak göstermediğinden emin olmak istiyorum. Ayrıca, yeniden birleştirme veya yeniden birleştirme işlemi yaparsam, bu part-b PR'yi nasıl etkiler? Etkileri anladığımı her düşündüğümde, farklı bir sonuç elde ediyorum lol
Sinaesthetic

5

Ön uç görevinin arka uç koduna kritik bir bağımlılığı olduğu ve arka uç sonlandırılmadan ve master'da kabul edilmeden önce ön uçta çalışmaya başlamak istediğinizde, ön uç görevini yalnızca bir özellik dalı olarak gelen bir özellik dalı olarak başlatacağım. arka uç dalı, ön uç ana üzerine dallanmak yerine.

Yeterince uzun süren bir özellik dalı, ustadan zaman zaman meydana gelen değişikliklerde birleştirme ihtiyacı duyar (herhangi bir birleştirme veya semantik çatışmayı, "inceleme, qa, birleştirme -" usta "süreci). Böylece, ön uç şubenizde bunu yaparsınız ve arka uç çalışması master için kabul edildiğinde, arka uçta otomatik olarak gözden geçirme / kabul etme işleminin bir parçası olarak yaptığınız küçük değişiklikleri alırsınız. Master'da başka herhangi bir kod değişikliği olsun.

Arka uç dalı çok daha fazla çalışmaya ihtiyaç duyuyorsa ve master'le birleştirilmeden önce belli bir süre boyunca değişmeye devam ederse (derleme sırasında ana problemler bulunup bulunmadığını söyleyin), o zaman muhtemelen doğrudan periyodik birleştirme yapmak istersiniz arka uç dalından ön uç dalına kadar (böylece tüm ön uç çalışmalarınızı eski arka uç koduna dayandırmaya devam etmiyorsunuz). Bu, her iki özelliği de yapan tek geliştirici iseniz (kolay bir değişiklik yapıp yapamayacağınızı bildiğinizden beri), ancak her iki özellik de farklı aygıtlarla paralel olarak çalışılsa bile, bu kolay olacaktır; sadece birisinin diğerine kritik bir bağımlılığı olan görevler üzerinde çalışıyorsanız, iletişimde kalmak zorundasınız (ki yine de ihtiyacınız olacaktı).

Tüm arka uç dalının terk edilmesinin gerekli olduğu ve hiçbir zaman birleştirilmemesi gerektiği ortaya çıkarsa (bu, nadiren gerçekleşecek oldukça büyük bir anlaşma olur gibi geliyor), o zaman ya kararlarınızı ustalaşan yeni bir şubeye vişnelerinize ayırın. arka uç çalışması olmadan veya tüm arka uç kodunu ön uç dalına silen ters taahhütler uygularsınız. Fakat görebildiğim gibi, ön uç çalışmasını, attığınız arka uç yerine neyin geçeceğini belirleyene ve daha sonra ne yapacağınıza karar verene kadar duraklatmanın daha muhtemel olacağını düşünüyorum.


2

Burada sorunu görmüyorum.

Bu masterözellikler zaten geliştirilip birleştirildikten sonra sürekli değişen şubenizde zaten her zaman var .

Böylece, somut örneğinizde, öncelikle feature_xxx_backenddalı yaratır ve arka uç değişikliklerini geliştirirsiniz. Bu yapıldığında, şube gözden geçirilir masterve inceleme tamamlandıktan sonra birleştirilir .

Yani, başka bir şubeye başla feature_yyy_frontend. Büyük olasılıkla doğrudan branşmandan dalmak isteyeceksiniz feature_xxx_backend, böylece bu branşınızda zaten değişiklik var. daha sonra, dal gibi ön uç özelliğini geliştirin master.

Ne zaman feature_xxx_backendadressed gereken İnceleme sırasında gelip şeyler vardır çünkü şube değişiklikler, sadece bu değişiklikleri yapmak ve onları birleştirmek örneğin feature_yyy_frontendşube. Sonra ön uç dalında devam edin.

Arka uç şubesinin incelemesi tamamlandıktan sonra bir araya gelir master. Bu noktada, akıllıca olacaktır rebasefeature_yyy_frontend üzerine dalı masteryorumcular sadece incelemeniz gerekir ki, yeni bu dalı katkıda değişiklikleri masterve gerek zaten onaylanmış arka uç için yapılan değişiklikleri (yeniden inceleyecektir ).

Bu, iki, üç veya daha fazla bağımlı dalınız olduğunda da yapılabilir. Bağlı olduğunuz iki özellik dalınız varsa, her ikisi de birleştirilmiş özellik olan türetilmiş bir dal yapın. Şube oradan da dal, üçüncü özelliği geliştirin, her ikisi de bu değişim sırasında her iki özellik dalını birleştirin. Her iki özellik yapıldığında ve türetilmiş dallara birleştirildiğinde, buna yeniden uygulayın ya da ana ile birleştirilirse, ana üzerine yeniden başlayın.

Yeniden düzenleme (yukarıda önerildiği gibi) gerçekten güçlüdür ve değişikliklerin temiz bir kaydını tutmaya yardımcı olarak incelemeleri çok daha kolay hale getirir.


2

Polygnome'un bahsettiği gibi, aslında ön uç dalınızı ustalar yerine arka uç dalınızla birleştirebilirsiniz. Şu an sahip olduğunuz mevcut şube kurulumunda bile, aşağıdakileri yapabilirsiniz:

git checkout frontend
git merge backend

ya da sadece

git merge backend frontend

Ancak, arka uç değişiklikleri kabul edilmezse ve daha fazla çalışmaya ihtiyaç duyulursa, çatışmaları önlemek için güncellemeleri arka uçtan ön uca birleştirmek zorunda kalacağınızı unutmayın. Değişiklikler ana kabul edildikten sonra, arka uç birleştirme işlemlerinden kurtulmak için ana uçunuzu ana uç üzerinde yeniden oluşturabilirsiniz.

Teknik olarak her şeyi yeniden rebase ile de yapabilirsiniz, ancak bu, ön şubenizin taahhüt geçmişini bozacaktır. Geldiğim yerde, bu kötü bir uygulama olarak kabul edilir. YMMV


“Kimsenin, ön şubenizi ustalar yerine arka uç şubenizle birleştirebileceğinizden bahsetmemesi garip:” Bu daha önce, örneğin kendi cevabımdan bahsedildi.
Polygnome

@ Polygnome frontend doğrudan arka uçtan dallanmış olmak zorunda değildir. İkisi de ustadan dallanmış olabilir, ama yine de onları birleştirebilirsiniz. Yani cevabınız aslında bundan bahsetmiyor.
Joris Meys

Aslında, cevabım doğrudan arka uçtan dallanmanızı önermiyor, sadece gidilecek yolun bu olduğunu söylüyor (zaten bu değişiklikleri ön uç dalında birleştirdiğiniz için).
Polygnome,

@ Polygnome sonra cevabınızı yanlış anladım. Özellikle sizin için güncellendi :-)
Joris Meys

Bunu kim reddetti bilmiyorum ama lütfen nerede yanlış olduğumu söyle, ben de bir şeyler öğreneyim.
Joris Meys

1

Buradaki cevapların çoğu, ikinci daldan ilkine değişikliklerin birleştirme sürecini doğru bir şekilde açıklamaktadır, ancak çözmeniz gerekebilecek çatışma miktarını en aza indirmeyi ele almamaktadır.

Bireysel olarak incelemek istediğiniz iki büyük değişiklik kümeniz olduğunda (benzer featureAve featureB), birleştirilmesi gereken OLMAYAN bir PR oluşturun, ancak bir PoC hakkında erken geribildirim alın featureA.

İnsanlar hızlı bir şekilde gözden geçirebilecekler (sadece bir PoC) ve amaç genel tasarımı veya yaklaşımı doğrulamak.

Ardından, A özelliği üzerinde çalışmaya devam edebilir, bunun için bir çekme isteği oluşturabilir ve dallayıp B özelliği üzerinde çalışabilirsiniz.

En büyük fark, artık featureAkökten değişmemeyi beklemeniz olabilir : tasarım ve yaklaşım zaten onaylandı. Kod gözden geçirme ve gerekli değişiklikler "çeteler, farklı bir yaklaşıma ihtiyacınız var" yerine, ince ve yerel olabilir. Bu daha sonra birleştirme için yapmanız gereken iş miktarını en aza indirecektir featureBüzerinde featureAlar kodu' ne olursa olsun yöntemi seçmiş.

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.