Farklı özellik dallarını acısız bir şekilde nasıl birleştirebilirim?

0

Soru

Adında bir şubede açık bir PR'M var feature-b bu yakında birleştirilecek main. Ancak, bunu desteklemek için yazdım. feature-a devam eden şube. Üzerinde çalışmaya devam etmek istiyorum feature-a ve yaptığım işi kaldıraç feature-b birleştirilmeden önce main.

Bu benim yapabileceğim en iyi yolu nedir? Birleşmelerimiz main ezilmiş, bu yüzden tüm taahhütler feature-b birleştirildiğinde tek bir taahhüt olarak yeniden yazılır main. Bu nedenle, rebasing feature-a üzerinde feature-b şimdi birleştiğimde gelecekteki çatışma acısına neden olacak feature-a -e doğru main çünkü aynı değişiklikler farklı taahhütlerde yapılmış olacaktır.

Yapılan değişiklikleri dahil etmenin en iyi yolu nedir feature-b in my feature-a sonunda birleştiğimde gelecekteki acıyı en aza indirirken dallanma feature-a -e doğru main?

Güncelleme

Devam ettim ve:

  1. Yeniden basıldı feature-a üzerinde feature-b
  2. Daha fazla değişiklik yaptı (yalnızca 1 taahhüt) feature-a iken feature-b gözden geçiriliyordu
  3. Kabak-birleştirilmiş feature-b bir kez daha gerekli değişiklikleri onayladı (öyleydi yani feature-a zaten birleştirilmiş tam kod var)
  4. En son çekildi main ve rebased feature-a bunun üstüne

Korktuğu gibi git, birkaç dosyanın "her ikisi de değiştirilmiş" veya "her ikisi de eklenmiş"olduğundan şikayet ediyor. Bu tek başına biraz can sıkıcı olurdu, ama düzeltilmesi basit. Bunu inanılmaz derecede kafa karıştırıcı yapan şey - özellikle de herhangi bir zaman geçtiyse-dosyalardaki yorumları birleştirmektir.

Her ikisi de olsa main ve feature-a dallar tüm dosyalarda aynı koda sahip, süper sinir bozucu davranışlar alıyorum:

  1. "Her ikisi de eklenen "dosyalar için" HEAD (Geçerli Değişiklik) "ve"#HASH (commit message) öğesinin üst öğesi " için birleştirme açıklamaları eklenir. Tam olarak aynı olsalar bile birini ya da diğerini seçmek zorunda kalıyorum!
  2. "Değiştirilmiş" dosyaların, daha kötü olacak. "HEAD (Current Change)" doğru kodu gösterir. Ancak," #HASH (commit message) öğesinin üst öğesi " bölümü kodun yarısını gösterir. Yine, her iki dalın da tüm kodu olmasına rağmen!! Şaka yapmıyorum, "gelen değişikliği" kabul etmek (VS Koduyla etiketlendiği gibi) her iki dalda da bulunan kodu kaldıracaktır!

Bu değişiklikleri hızlı bir şekilde yapmasaydım, umutsuzca kaybolurdum ve git'in bana gösterdiği şey hakkında kafam karışırdı. Bu gerçekten geçmişte birkaç kez oldu ama neyin yanlış gittiğine parmak basamadım. Şimdi bunu yeniden ürettim ve davranışı doğruladım, git'in ne yaptığı ve insanların bu senaryoyla nasıl başa çıktığı konusunda tamamen kafam karıştı.

GÜNCELLEME 2

Tamam, şimdi neden kodu kaldıracağını anladım. Çünkü yaptığım değişiklikler feature-b birden çok taahhütte bulundular ve bu taahhütler birleştirildiğinde ezildi main oluştu. Bu hiç şüphesiz acının kaynağı ve neden daha aklı başında bir iş akışı bulmaya çalışıyorum.

git
2021-11-23 23:26:24
1

En iyi cevabı

0

Son birleştirme / ezmenin dağınık olacağına ikna olmadım. Aynı değişiklik farklı taahhütlerde yapılıyorsa, belki Git bunu algılayabilir ve bundan memnun olabilir.

Yine de dağınık olacağını düşünüyorsanız, yapabileceğiniz şey:

  1. Senin Rebase feature-a şube ile feature-b şimdi, böylece senin feature-a şube artık tamamlanmış özellik B'yi ve devam eden özellik A'yı içerir, bu da işinizi yapmak için ihtiyacınız olan şeydir.
  2. Sonra feature-b birleştirilir main şube, rebase feature-a özellik B için yaptıkları ezilmiş taahhütten hemen önce taahhüt üzerine. Bu sorunsuz gitmelidir.
  3. Senin üzerinde feature-a şube, kullanım git reset --soft X nerede X özellik B için yaptıkları ezilmiş taahhüt için taahhüt karması mı? Sonra kullan git commit bir taahhütte bulunmak için. Artık içeriği özellik A'daki çalışmanızın geçerli durumuna eşit olan ezilmiş bir taahhüdünüz var. Ancak bu taahhüdün ebeveyni, özellik B'yi ana şubeye ekleyen taahhüttür, bu nedenle bu taahhüdün bu üst öğeyle olan farkı yalnızca özellik A'yı içerecektir. Bu noktada özellik A üzerinde çalışmaya devam etmek veya yalnızca birleştirme istemek sorun değil.

Bu arada, kuruluşunuz ana şubeye bir şeyler eklemek için rebases yerine merges kullandıysa, işlerin bu kadar dağınık olması gerekmeyeceğinden eminim. Ve sonra, üzerinde çalıştığınız kodun gerçek geçmişini korumanın yararı olacaktır, sadece bu yapay tarihi korumak yerine.

2021-11-23 23:52:54

Açık olmak gerekirse, rebases kullanmıyoruz-ezilmiş taahhütler kullanıyoruz. Ve bunu geçmişte denediğim için işlerin dağınık olacağından %99 eminim. Git, aynı değişiklikleri yapan farklı taahhütlerle korkunç bir şekilde karışır. Yine de tekrar denemeye ve rapor vermeye hazırım :)
me--

@me-Ezilmiş taahhütlerin bir rebase olduğuna eminim
evolutionxbox

Rebasing, dalı hareket ettirmek anlamına gelir, böylece farklı bir noktaya başlar, bu da nasıl geliştirildiğinin tarihini yeniden yazar. Ezmek, tüm dalı tek bir taahhütte değiştirmek, nihai sonuç dışında nasıl geliştirildiğinin tarihini atmak anlamına gelir.
David Grayson

@DavidGrayson Git'ten gördüğüm davranışın açıklaması için lütfen güncellenmiş soruma bakın.
me--

tamam. 4. Adımınız ("En son ana ve rebased özelliğini çekti-üstüne"), tüm acıya neden olan şeydir, bu yüzden yapmanızı tavsiye edeceğim bir şey değildir. Sorunuzdaki 4. adımı yapmak yerine, cevabımdaki 2.ve 3. adımları deneyin.
David Grayson

Teşekkürler @ DavidGrayson. Öyle görünüyor . . . zahmetli
me--

Cevabımda söylediğim gibi, sorun, tüm bu okumaları yapan ve sadece birleşmek yerine ezilen kişiden kaynaklanıyor.
David Grayson

Diğer dillerde

Bu sayfa diğer dillerde

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................