2010-09-14 10 views
30

Eminim bu sorulan ve cevaplanan basit bir şey olduğundan eminim, ama hangi terimleri aradığımı bilmiyorum. Bunu alabilir: Bir dal üzerinde C, D ve E (yalnızca yerel olarak) işlediği, ama sonra D ve E ben kendi C taşımak istediğiniz C'lik gerçekten bağımsız olduğunu farkGit'te şubeler arasındaki bir işlemi nasıl taşırım?

/--master--X--Y 
A--B 
    \--C--D--E 

şube ve D ve E için daha sonra tutmak.

    /--C 
    /--master--X--Y 
A--B 
    \--D--E 

nasıl D ve E altından dışarı C yank yapın: Ben bunu istiyorum mı?

$ git checkout branch-Y 
$ git cherry-pick C 

Yani şimdi C de Y. Ama D ve E üstünde geçerli:

cevap

42

Sen C kapmak için git cherry-pick kullanın ve Y. Y varsayarsak üzerine koyabilirsiniz bir dal branch-Y denilen ucu olarak var hala C içeriyorsa (kiraz toplama, bir taahhüt taşımadı, sadece bir kopyasını yapar). Sen B. varsayarsak E üstündeki D ve E rebase gerekecek branch-E ucu ve B yapabilirsiniz, branch-B geçerli:

$ git checkout branch-E 
$ git rebase --interactive branch-B 

Bu interaktif Rebase oturumu açılacaktır. Sadece C işlemini tamamen kaldırın ve D ve E'yi bozulmamış halde bırakın. Daha sonra, D ve E'nin B olmadan üst üste rebazedini alacaksınız.

+4

1 v1.7.1'den itibaren 'cherry pick' öğesinin birden fazla işi alabileceğini unutmayın, böylece bunu "yank" olarak kullanabilirsiniz. Bir taahhüt daha. Bunu, E'de geçici bir şube oluşturarak ve Y'ye etkileşime girerek, yalnızca istediğiniz ödevleri koruyarak, sonra da Y'in şubesiyle birleştirerek (hızlı ileriye doğru olacak) gerçekleştirebilirsiniz. (Bu her zaman işe yaradı, ve yine de daha kolay olabilir, bu yüzden çok sayıda SHA1'i yapıştırmanız gerekmez.) – Cascabel