2010-11-30 22 views
43

Git: merging public and private branches while while keeping certain files intact in both branches ve diğerleri birleştirme ile bazı hileler hakkında okudum ve bir çözüm bulunamadı. Benim durumumda karşıt birleştirme stratejisini gerçekleştirmem gerektiğini hissediyorum. Paralel gelişimde, bazı dosyaları keyfi branşlarda aynı tutmak zorundayım. Diğer taraftan, squash veya no-commit birleştirme yapmak istemiyorum, fark önemli ve test dalının mevcut durumunu bozabilir.git kısmi birleştirme, tüm dal değil

Ben

git checkout testing

git merge config.xml -b development veya git merge config\*.xml -b development

bu git merge-files ... komutu gibidir sanırım, ama ikinci dosya değil dosya sistemi, daldan teslim gibi bir şey istediğini. Mümkün mü? ya da bir tür geçici çözüm var mı? altmodüller? Öznitellikler?

Teşekkürler

cevap

41

Yapabileceğiniz birkaç şey var.

Bir, sadece tek bir taahhüt geçerlidir istediğiniz değişiklikleri, kiraz alabilirsiniz. Sadece config.xml dokunan bir değişiklik varsa Örneğin, Ayrıca sadece geliştirme şubesinden config.xml kapmak

$ git cherry-pick $COMMIT_ID_YOU_WANT 

ile kiraz alabilirsiniz:

$ git checkout testing 
$ git checkout development -- config.xml 

Bu sana getireyim Geliştirme dalında bulunan config.xml sürümünün aynı sürümü, ancak dosyadaki değişikliklerin tarihini çekmeyeceğini unutmayın.

+0

Bu benim aradığım budur. Teşekkürler. Sadece bir tane daha dileğim, git cherry-pick $ COMMIT_ID config.xml yazabilseydim lüks olurdu. Tamam, bu git forum için bir dilek. – olegtaranenko

+6

İkinci çözüm için: Test şubesi geliştirme dalına birleştirilecek olursa bu bir birleşme çatışmasına neden olur mu? Değişiklikleri bir özellik dalından diğerine getirmek istediğim bir durum var ve bu iyi bir fikir olsaydı o kadar emin değilim çünkü her iki dalın ustalaştığı zaman, büyük bir çatışma çatışmasına neden olabilir. .. – progician

17

Temelde hepsi burada sonrasında okuyabilir: Kısacası http://www.gelato.unsw.edu.au/archives/git/0701/37964.html

, sadece tek bir yapılan kaydedilmesini arasında belirli bir aralık tarafından yapılan değişiklikleri (bu aynı zamanda taahhüt yalnızca tek olabilir), uygulamak istiyorsanız dosyaların alt kümesi o zaman:

git diff commit1..commit2 filepattern | git apply --index && git commit 
2

Doğrudan git ağacından seçilen bir dosyayla birleştirmek mümkündür.
Ne önermek gibi bir şey yapmaktır:
$ git ls-tree development -- config.xml
$ git show <blob-hash> > config.xml.development

Sonra ortak bir temel olsun:

$ git ls-tree $(git merge-base HEAD development) -- config.xml
$ git show <blob-hash> > config.xml.base

Ve nihayet:

$ git merge-file config.xml config.xml.base config.xml.development

Bunu test etmedi olsa da.zsh gibi bir kabuk ile

, bu geçici bir dosyaya damla tasarrufu önleyebilirsiniz:

$ git merge-file config.xml =(git show <base-blob-hash>) =(git show <dev-blob-hash>)

İlgili konular