2009-02-24 17 views
24

Git/git-svn öğrenme eğrisi ile savaştım ve geçen gece, bu öğrenme eğrisinin bir parçası olarak, çok ama çok kötü bir şey yaptım. O zamandan beri düzeltildi, ama hatayı benim yollarımı anlamayı umuyorum.Git-svn'yi kullanma: Çekme, Birleştirme veya Yeniden İşleme?

Bagajı ve dalları klonladığım bir svn deposum var (üzerinde çalışmadığımızdan beri göz ardı ettiğim etiketler). budala kullanarak, ben şu anda birlikte çalışması gereken dalların her biri için yerel şubesi oluşturuldu:

$ git checkout -b trunk svn/trunk 
$ git checkout -b feature1 svn/branches/development/feature1 
$ git checkout -b maint svn/branches/maintenance/previous-version 

benim aktif dalı Feature1 yaptı ve birkaç gün uzak çekilmeden önce birkaç değişiklik yaptık. Dün geri döndüğümde, en son ve en iyi şekilde çalışmak için bagaja yapılan tüm değişiklikleri birleştirmek istedim. Yaptığım şey, git svn rebase (özellik1'de başka hiç kimse işe yaramadı) aracılığıyla tüm branşların eksiksiz bir güncellemesiydi. Svn deposumdan bugüne kadar olan her şeyle, yeniden oluşturmaya çalıştım.

Özellik1, aktif şubemde, gövdesindeki değişiklikleri, özellik1 dalına içine çekeceğimi düşünerek bir "git rebase gövdesi" yaptım. Çıkıyor çok ama çok yanlıştım. Tüm çakışmaları birleştirdikten sonra, git svn dcommit yaptım ve değişikliklerin bagaja uygulandığını gördüm.

İlk sorum, düşünce sürecimdeki temel hatanın neresiydi? İkincisi, çok fazla okumadan sonra ve Googling'den sonra, çekme, birleştirme ve geri çekilmeyi destekleyen insanları görüyorum. Bir yerel şubede uygulanan değişiklikleri başka bir yerel şubeye birleştirmek istediğimde, ne yaptım? Bu senaryo için en iyi uygulama nedir?

Yardımlarınız için teşekkürler.

cevap

16

Karşılaştığınız sorun, rebase için komut satırı sözdiziminin (çok makul, IMO) beklentilerinize uymadığıdır.

$ git checkout feature1 
$ git rebase trunk 

Bu sekans paylaşılmayan Feature1 gövdenin BAŞ üzerine taahhüt ekler ve yeni gövde Feature1 BAŞ üzerine taahhüt vereceğini vurgulayan bekliyorduk. Sözdizimi, Git'in veri modelinin nasıl uygulandığını bildiğinizde (mantıksız olduğu gibi) gerçekten bir anlam ifade ediyor. Ama benim için işlevsel olarak beklediğim şeyin tam tersi. Bunu keyfi bir yapı olarak öğrenmek ve beklentileri karşılamaya çalışmak en iyisidir.

Git-svn'yi kullanarak SVN repo ile nasıl etkileşimde bulunacağınızı anlamanız doğru. Bu yüzden, Googling'de itme ve çekme ve birleştirme hakkında bulduğunuz şeyleri görmezden gelmeyin - itme ve çekme ile birleştirme sanki git ve svn'de olduğu gibi davranan insanlar tarafından neredeyse doğru bir tartışma var. Neredeyse doğru olanı hala yanlış.

+0

Veri modeli uygulamasına aşina olmadığım doğru mu (iyi URI'lara sahip misiniz?). Eğer rebase ifademi okuyabilseydim, onu “git * aktif şube * - *] gövdesine kadar * düzeltmek mi, yoksa çok mu kısıtlı mı? Teşekkürler. –

+0

* Yukarıdan Bottom Up'dan * (http://www.newartisans.com/blog_assets/git.from.bottom.up.pdf) ve * Git Internals * (http://peepcode.com/products/git-internals -pdf) Git'in yapısını anlamak için her ikisi de çok iyi. (Git Internals $ 9; Aynı sitede bulunan Screencast'i tavsiye etmiyorum). – Paul

+0

Bu, komutu iyi okuyor. Harekete geçirilen nesnenin birçok git komutunda kontrol edilen şube olduğundan hatırlamakta zorlanıyorum. – Paul

-3

Tüm şubeler de dahil olmak üzere tüm svn ağacını kopyalamak için git svn clone -s kullanmalısınız. O zamandan itibaren git svn rebaseve svn ile başa çıkmak için git svn dcommit ve özel kullanımınız için düzenli git dalları oluşturabilirsiniz.

+0

Bu gerçekten sorulara cevap vermiyor. Nasıl gidileceğini ve git-svn kullanarak Svn'ye nasıl konduğumu anlıyorum. Yerel şubelerimin etrafından nasıl taşınacağımı anlamaya çalışıyorum. Ben ** svn bağlantısından bağımsız olarak hepsi git şeyler olduğunu düşünüyorum. –

+1

Peki ben yararlı buldum :) Git svn yerine git svn rebase kullanmalıyım bilmiyorum. –