git - birleştirme sırasında belirli işlemleri atlama


202

Git'i yaklaşık bir yıldır kullanıyorum ve harika olduğunu düşünüyorum, ancak projenin ikinci bir versiyonuna yeni başladım ve bunun için yeni bir şube başlattım. İleriye dönük işleri halletmenin en iyi yolu ile biraz mücadele ediyorum.

Master10 (v1 için) ve master20 (v2 için) adında iki şubem var. Şube master10'da v1'de hata düzeltmeleri yapıyorum ve master20 yeni şeyler geliştiriyorum. Ne zaman bir hata düzeltme yapmak master20 kontrol ve yaparak v2 içine birleştirmek git merge master10. Çok uzak çok iyi.

Ancak şimdi v1'de v2'de istemediğim bir değişiklik yaptım, ancak diğer hata düzeltmelerini birleştirmeye devam etmek istiyorum. Git'e belirli bir taahhüdü (veya bir dizi taahhüdü) atlamasını nasıl söyleyebilirim, ancak ileriye doğru hala diğer hata düzeltmelerini birleştirmek istiyorum.

git rebaseİhtiyacım olan şey olabileceğini düşündüm ama dokümanı okudum ve başım neredeyse patladı.

İstediğim şey, iki dalın şimdi senkronize olduğunu ve gelecekte yalnızca bu senkronizasyon noktasından gelen taahhütleri birleştirdiğini söyleyen bir "git sync" komutu gibi bir şey olduğunu düşünüyorum.

Herhangi bir yardım takdir.

Yanıtlar:


290

Örneğin, "maint" dalındaki tüm taahhütlerin çoğunu "master" ile birleştirmek istemiyorsanız, bunu yapabilirsiniz. Bazı işler gerektirir ---- yukarıda belirtildiği gibi, her zamanki kullanım durumu bir daldan her şeyi birleştirmektir --- ancak bazen geri entegre edilmemesi gereken bir sürümde bir değişiklik yaptığınız olur (belki de bu kod zaten master'da üstünleştirildi), bunu nasıl temsil ediyorsunuz? İşte gidiyor ...

Diyelim ki maint'in 5 değişikliğinin uygulandığını ve bunlardan birinin (maint ~ 3) tümünün olması gerekse de ustaya geri dönüştürülmeyeceğini varsayalım. Bunu üç aşamada yaparsınız: aslında ondan önce her şeyi birleştirin, git'e maint ~ 3'ü değilken bile birleştirilmiş olarak işaretlemesini söyleyin ve gerisini birleştirin. Sihir:

bash <master>$ git merge maint~4
bash <master>$ git merge -s ours maint~3
bash <master>$ git merge maint

İlk komut , zahmetli bakım ustanız ustaya geçmeden önce her şeyi birleştirir . Varsayılan birleştirme günlüğü iletisi, "şube 'maint' (erken bölüm)" birleştirdiğinizi açıklar.

İkinci komut zahmetli maint ~ 3 taahhüdünü birleştirir, ancak "-s ours" seçeneği git'e aslında birleştirdiğiniz ağacı koruyarak ve taahhütleri göz ardı ederek çalışan özel bir "birleştirme stratejisi" kullanmasını söyler. ) tamamen birleşiyorsunuz. Ancak yine de ebeveyn olarak HEAD ve maint ~ 3 ile yeni bir birleştirme yapar, bu nedenle revizyon grafiği şimdi maint ~ 3'ün birleştirildiğini söylüyor. Yani aslında -m seçeneğini de kullanmak istiyorsanız git merge, bu ~ 3 taahhüdünün aslında göz ardı edildiğini açıklamak için!

Son komut, maint'in geri kalanını (maint ~ 2..maint) master'a birleştirir, böylece hepiniz tekrar senkronize edilirsiniz.


5
Bu taahhüdü birleştirmeyi ertelemeniz gerekiyorsa, atlamaktan (bizimkini birleştirmek) ve daha sonra kiraz toplama komutunu kullanarak uygulamaktan başka seçeneğiniz olmadığını düşünüyorum. Taahhüt master'dan ulaşıldıktan sonra tekrar birleştirilemez - aynı değişikliği iki kez birleştirmekten kaçınmak ana git hedeflerinden biridir.
araqnid

3
Alt şube örneğinizle ilgili olarak: Alt dalı birleştirdikten sonra, yazımın ikinci adımından sonraki durumla tamamen aynı durumda olduğunuzdan şüpheleniyorum. Ek dallar oluşturmak, taahhüt ilişkilerinde bir fark yaratmaz.
araqnid

5
Sadece ilgisiz, sadece bir değişikliği atlamak istiyorsanız, neden sadece bir birleştirme yapmazsınız ve daha sonra üç birleştirme yapmak yerine bir değişiklik kümesini geri döndürmezsiniz? Depoya daha az değişiklik kümesinin ve daha açık bir geçmişe bağlanmasına neden olacaktır.
Mark Booth

3
Genellikle taahhütleri açıkça adlandırmak daha kolaydır. Bu nedenle, birleştirilecek dalın git günlüğünü görüntülemeniz ve birleştirilmemesi gereken taahhüdün karmalarını ve daha önce olanı saymak yerine
taahhütleri

14
@MarkBooth: Atlamak istediğiniz taahhüt, birleştirmek istediğiniz dalla büyük bir çatışma içinde olabilir. Çatışmaları düzeltmek, sonra bu değişikliği geri almak ve tekrar çatışmaları düzeltmek yerine atlamak daha kolay
SztupY

39

IMHO, yapılacak en mantıklı şey, her şeyi birleştirmek ve sonra kaldırmak için git revert (commit_you_dont_want) kullanmaktır .

Misal:

git merge master
git revert 12345678

Birden çok "yoksaymak" işleminiz varsa veya geri alma iletisini düzenlemek istiyorsanız:

git merge master
git revert -n 123456
git revert -n abcdef
git commit -m "... Except commits 123456 and abcdef"

O zaman geçmişiniz şöyle görünebilir:

| ... Except 123456 and abcdef
|\ Merge branch 'master' into 'your_branch'

SADECE bu "yoksay" taahhütlerini içeren çakışmalarınız varsa, şunları kullanabilirsiniz:

git merge master -X ours

Böylece sürümünüz diğerinin üzerinde kalacaktır. Hata iletileri olmasa bile, istenmeyen taahhütleri yine de "geri alabilirsiniz", çünkü çakışmayan başka değişiklikler olabilir ve yine de istemezsiniz.

YALNIZCA "yoksayma" işlemlerini yürütmeyen Çatışmalar yaşıyorsanız, bunları manuel olarak çözmelisiniz ve muhtemelen geri alma sırasında bunları tekrar çözmeniz gerekecektir.


2
Daha sonra geri döndürülen bu taahhütleri şubeye sorgulamak isterseniz, Git onları görmezden gelir mi?
Anriëtte Myburgh

@ AnriëtteMyburgh Geri dönüş taahhütlerini daha sonra birleştirmek için geri alabilirsiniz - aslında "bizimkini birleştir" stratejisiyle kolayca yapamayacağınız bir şey.
Lily Chung

Teşekkürler, tam olarak ihtiyacım olan şey, bir özellik dalında ustada istemediğim birkaç ustalık ve ustalıkta istediğim bir grup vardı. Güzel ve temiz.
Vale Trujillo

17

Taahhütler ataları içerir. Önceki taahhütleri birleştirmeden bir taahhüdü birleştiremezsiniz.

Elbette onları kiraz toplayabilirsiniz. Bakım modunda olan bir şubeniz olduğunda bu iyi bir akıştır.


1
Teşekkürler, kiraz toplama işi yapacak. Ne umuyordum kadar hoş değil ama yapacak.
Brad Robinson


3

Benim için bir tür reklam proje temelde sürecini sarar @araqnid tarafından tarif.

Aşağıdaki GIT akışını tanıtan bir tür yardımcıdır:

  • bakım şubelerinden geliştirici / ana şubeye bekleyen birleştirmelerle ilgili günlük / haftalık bildirim var
  • şube sorumlusu durumu kontrol eder ve tüm taahhütlerin gerekli olup olmadığına karar verir ve ya bazılarını engeller ya da geliştiricilerin kendilerini engellemelerini ister. Sonunda bakım branşmanı yukarı doğru birleştirilir.

Proje sayfasından bir alıntı:

İş akışına bağlı olarak, ana kol ile birlikte bakım veya müşteriye özel kollara sahip olmak mümkündür. Bu dallara LTS dalı da denir.

Sıklıkla düzeltmeler hatanın bildirildiği dallara gider ve daha sonra taahhüt ana dalla birleştirilir.

Genel uygulama, tüm dalların master ile mükemmel bir şekilde senkronize edilmesidir, yani master'ın tüm özellikleri ve hata düzeltmelerini içerip içermediğini anlamak için belirli bir şube ve master arasında açık bir delta görmek istersiniz.

Ancak bazen belirli taahhütler istemezsiniz çünkü bunlar müşteriye özgüdür ve diğer kullanıcılar tarafından görülemez. Ya da ana dalınız, sorunu çözmek için tamamen farklı bir yaklaşım gerektirdiğini veya daha da iyisi, sorunun artık orada bulunmadığını saptırdı.

Ayrıca, master'dan bakım dalına kiraz toplama durumunda, sonuçta ortaya çıkan taahhüt master'da bloke edilir.


0

Master10'da istediğiniz ancak master20'de değil, değişiklikler için üçüncü bir dal oluşturun. Her zaman master10'u en istikrarlı dalı olan "master" ınız olarak düşünün. Şube, diğer tüm şubelerin her zaman senkronize olmasını ister.


Sanırım bu işe yarayabilir, ama kendimi zaten bu duruma soktum ve üçüncü bir şube muhtemelen beni daha da karıştırırdı. :)
Brad Robinson

0

revertVeya yerinecherry-pick bu durum için, size yapılan olanlardan daha büyük olmak atlıyorsun değişiklikleri dikkate için git almak gerekir.

Yani:

  1. atlamak istediğiniz taahhütlerden önce son taahhüdü birleştirin. Bu, elbette, önceden tüm taahhütleri birleştirecektir. git merge ccc
  2. atlamak istediğiniz taahhütleri birleştirin. git merge fff --no-commit
  3. herhangi bir birleştirmeyi gerçekleştirin, tüm değişiklikleri kaldırın, tüm değişiklikleri geri alın. (Belki de bunun için aptal olmayan komutlar vardır, ancak bu kısmı bir kullanıcı arayüzünde yapardım - ancak nasıl olduğunu biliyorsunuz)
  4. boş birleştirmeyi tamamla git merge --continue
  5. atlamak istediğiniz işlemden SONRA taahhütleri birleştirin. git merge source-branch-head

4. Adımdan sonra git, dalınızı zaten ele aldığınızdan (şeylerin SİZİN sürümlerini tutmayı seçerek) bu daldan daha yeni olduğunu düşünecektir.

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.