2010-06-11 14 views
8

Birkaç düzinelerce farklı şube ve birleştirmelerle çalıştıktan sonra, hem dizüstü bilgisayarımda hem de işimde ve masaüstümde, geçmişim biraz kıvrılmış oldu. Örneğin, sadece bir getirme yaptım, sonra master/master ile master birleştirdi. Ben git Gösteri dalları yaptığınızda, şimdi, çıkış şuna benzer:kıvrık bir geçmişi temizlemek için git rebase nasıl kullanılır

 
! [login] Changed domain name. 
! [master] Merge remote branch 'origin/master' 
    ! [migrate-1.9] Migrating to 1.9.1 on Heroku 
    ! [rebase-master] Merge remote branch 'origin/master' 
---- 
- - [master] Merge remote branch 'origin/master' 
+ + [master^2] A bit of re-arranging and cleanup. 
- - [master^2^] Merge branch 'rpx-login' 
+ + [master^2^^2] Commented out some debug logging. 
+ + [master^2^^2^] Monkey-patched Rack::Request#ip 
+ + [master^2^^2~2] dump each request to log 
.... 

Ben bir git rebase ile bunu temizlemek istiyorum. Bu amaç için yeni bir şube, rebase-master yarattım ve bu dalda 10 ortak atası >'u denedi. Ancak, birçok anlaşmazlığı çözmem gerekiyor ve sonuçta şube rebase-master'ında artık test edilmiş ve çalışmakta olan master'daki ilgili sürümle artık eşleşmiyor!

Bunun bir yere bir çözüm bulduğumu düşündüm ama artık bulamıyorum. Bunu yapmayı bilen var mı? Yoksa birleştirilmiş olan şu andaki dalları silmeye başladığımda, bu kıvrımlı ref isimleri ortadan kalkacak mı?

Bu projedeki tek geliştiriciyim, bundan etkilenecek başka kimse yok. O sadece

git rebase --interactive 

Ama yine:

+9

;-) Felsefe notası: Tarih kıvrılıyor. Bu yaşam gerçeği. AŞ bunu. –

cevap

5

normal süreç, bir dalı (bir rebase tarafından yerel olarak oluşturulan yeni bir teker uzak tarihini değiştirme) itmek zorlayabilir repo için, yapmaktır Repolarınızdan sadece bir tanesi sizseniz geçerli olur ve hatta yerel şubelerinizi yeniden yazılan yeni uzaktan takip edenlere yeniden başlatmanız gerekecektir.

Yeniden düzenleme oturumundan, ihtiyacınız olan geçmiş türünü almak için trimming Git commits and squash history'u kullanabilirsiniz.

+0

Ayrıca bkz. Http://stackoverflow.com/questions/2719579/howto-add-a-changed-file-to-an-older-not-last-commit-in-git/2719631#2719631 – VonC

+0

umm ... uzaktan kumandadan çekilmeden geçerli. Kolayca yeniden inşa edebilirsiniz - (veya temelde hemen hemen her şey) yerel şube, uzak şube, taahhüt. – xenoterracide

10

Yaygın geçmişini temizlemenin en iyi yolu, geçmişin doğrusal kalmasını sağlamaktır. Bunu, hızlı ileriye doğru herhangi bir şekilde birleştirme işleminden kaçınarak yaparsınız.

İş akışı böyle gider.

$ git checkout -b foobranch 
<do stuff> 
$ git commit 
<do stuff> 
$ git commit 
... 

o mürşide dalı entegre etmek zamanı geldiğinde, birleştirme yoktur. Bunun yerine, bu dalı ustaya karşı yeniden donatın. Bu dalın artık bir dal gibi görünmeyeceğini, ancak ağacın üstünde daha fazla büyümeyi sağlayacak. Yeniden düzenleme sırasında birleştirme çakışmasını çözersiniz. Şimdi, dalı ana içine birleştirin. Bu hızlı ileri birleştirme olacak.

Şimdi de işi yukarı doğru itin.

$ git push 
İlgili konular