2009-09-10 12 views
74

Bu senaryoyu ele alalım:GIT'i kullanarak, başkalarının 'çatal'ından gelen değişiklikleri nasıl seçebilirim?

  1. Ben github.com bir kod tabanı 'çatal' karar ve benim rutin yapmaya başlayabilir: Edit - Commit - itin; hack hack hack.
  2. Bazı değişiklikler yaptıktan sonra, başka bir kişinin aynı projede yaptığı bazı değişiklikleri görüyorum ve onları seviyorum!
  3. Onları benimkiyle birleştirmek istediğime karar veriyorum. Sorun şu ki, sadece yaptıkları birkaç taahhütten dolayı, belirli bir taahhüdün 'bölümünü' istiyorum.

Bu belirli miktarda değişiklik yapmanın en etkili yolu ne olurdu?

cevap

112

IRC dünyasının dalgalar trolling sonra, biri büyük bir çözüm verdi!

DÜZENLEME: Tamam, belki de bu kadar basit değil. İşte tam adımlar şunlardır:

  1. Öncelikle siz, depoda olmak zorunda çalışma dizinine almak için -ing gerekli cd yok.

  2. Şimdi uzak şubeyi eklemeniz ve sonra getirmeniz gerekiyor. Bu işlemi: Böyle git log someUser/master olarak

    git remote add someUser git://github.com/someUser/someRepo.git

    git fetch someUser

  3. Artık çalıştırabilirsiniz komutlar 'kısmen' de birleştirmek istediğiniz işlemek SHA1 bulmak için.

  4. Eğer SHA edindikten sonra, artık çalıştırabilirsiniz:

    git cherry-pick -n SHA1

    nerede SHA1 taahhüt SHA yaa olduğunu! Taahhütün kaç yaşında olduğuna ve projenin belirli bir bölümünün ne sıklıkla değiştiğine bağlı olarak, çatışmalar oldukça muhtemel olacaktır. Üzgünüz, ancak bunları güvenilir editörünüzle manuel olarak çözmelisiniz. Yani VIM'i veya kullandığınız her şeyi dışarı çekin ve değişiklikleri sevdiğiniz aşamaya ulaşıncaya kadar çatışmaları ortadan kaldırın.

  5. Artık, o zaman o almak ve ne istediğinizi değişiklikleri seçmek için güvenilir GIT add --patch komutunu kullanabilirsiniz BAŞ revizyon endeksi sıfırlamak zorunda

    :

    git reset HEAD

    git add --patch veya git add -p

  6. Yay! işlemeyeceği:

    git commit -m "I merged a select amount of changes"

  7. karışıklık ve sadece çalışma depoda seçilen değişiklikleri korumak (eğer git add --patch içinde hayır diyen şeyler) temizlemek için, çalıştırın:

    git reset --hard HEAD

    Görünüşe göre git checkout -f da başka bir seçenektir.

+0

seçeneğidir 'git add -p'; Bu son derece güçlü. Söz konusu taahhüdünüz varsa (örn. Kiraz toplamada 'no-commit' kullanmadıysanız, ya da taahhütlerinizden biri değilse), endeksi bir işlemi geri almak için 'sıfırlama HEAD ^' tuşunu kullanabilirsiniz. geri, daha sonra, adımlarda işleyerek değişiklikleri git git -p ile tekrar ekleyin. Taahhüt, şube ipucunda değilse, 'git rebase -i'yi kullanabilir ve söz konusu taahhütleri düzenlemeyi seçebilirsiniz. – Cascabel

+0

Bunun için çok teşekkürler! –

+1

güzel bir geçiş. sadece ** tüm ** taahhüdü istiyorsanız, sadece 4. adımda '-n 'yayarsanız hatırlayın: Bu gibi:' gitmek SHA1' – Hulvej

1

Sadece bir taahhüt limanı istiyorsanız, istediğiniz taahhüdü vurarak ve dokunulmasını istemediğiniz dosyaları sıfırlayarak muhtemelen en iyisi sizsiniz. Tabii

git cherry-pick SHA1 
git checkout HEAD file1 file2 ... fileN 

, bir dosya içinde birkaç modifiye parçaları ve sadece bazıları seçme şansın yok ama onların değişiklikleri kesmek, elle dosyasını düzenlemek tutmak istiyorsanız.

+2

Ödeme gerekli burada mı? Vişne çekme komutu, değişiklikleri çalışma rehberinize koyar mı? –

2

Ne istediğiniz konusunda net değilim. Diğer çatallardan yalnızca belirli işlemleri getirmek isterseniz, git cherry-pick SHA'u kullanabilirsiniz. gitready üzerinde tam açıklama.

git cherry-pick SHA1 --no-commit 
git add --patch 

Umarım aynı soruyla başkasının yardımcı olur:

+0

Sadece belirli bir işlemin bir 'bölüm'/'bölüm'/'bir kaç satır' bölümünden sonra depolamamda birleştirildim. Özellikle dosyaya özel değil. – Tim

+0

Bu durumda, git format-patch SHA, git geçerli bir – hgmnz

2

Tim'in çözümünü gerçekten çok seviyorum, ancak bazen vimdiff'te tinkering yapmayı seviyorum. Bu soruna çözümüm ham, ama benim için çalışıyor çünkü vim'i seviyorum.

Ben dalı diff vimdiff benim difftool olarak belirledik ve sonra seçici birleştirmek için:

git difftool <branch> <file> 

Sonra şimdiki şubesinin sürümü ile bölmesine gidip bazen (vim bu değilmi orijinal düzenlemek 't gerekli ama bazen vimdiff tmp/bir sürümünü açar) ve devre dışı bırakma salt okunur modu:

:e <file> 
:set readonly! 

Şimdi ben istediğimi uygulamak için böyle do ve dp olarak Vim yama araçları kullanabilir ve diğer küçük yapabilir ben giderken düzenlemeler. İşim bittiğinde, dosyayı kaydediyorum, vim'den çıkıyorum ve ardından dosyayı düzenli bir düzenleme gibi git'e bırakıyorum.

Dediğim gibi, bu özellikle karmaşık değil, ama çok güçlü ve hala tamamen komut satırında. Git otomatik olarak sizin için birleştirme mesajı eklemeyeceğinden, açık bir taahhüt mesajı eklediğinizden emin olun.

vimdiff example http://j.mp/1dZVllt

+0

Bu cevabın tamamen bağımsız bir yanıt olarak görülmeye değer olduğunu tam olarak düşünmüyorum. Yararlı bilgiler, ancak özellikle ilgili değil. (Neden bu cevapların başında?) –

İlgili konular