2011-08-05 12 views
5

Zip anlık görüntülerinden geriye dönük bir proje geçmişi yapıyorum. Elime geçen anlık görüntülerden uzun bir şube dizisi oluşturdum. Şimdi ekledim ki, daha fazla 'bulunan' enstantanenin sırasının çeşitli yerlerinde 'ortada' olması gereken enstantaneler var.git: bir taahhüt dizisini yeniden (ciddi şekilde) yeniden sipariş etme

Git anlık görüntülerini yeniden sipariş vermek için git rebase -i <startCommit> kullanmaya çalışıyorum. Seçim listesi siparişini takas ediyorum. Bu, yalnızca tahakkuk eden nesnelerin yeniden yazılması, ancak alttaki ağaçların aynı kalması (anlık görüntüler değişmediği için) olmalıdır. Bu durumda rebase, basit yeniden düzenlemeyi yapmaktan ziyade yamalar oluşturmaya ve çok sayıda çatışmaya sahip olmaya çalışıyor gibi görünüyor. Bu özel durum için daha uygun bir komut var mı? Benim birleşme ve sadece bir dalım yok. Tüm repo hala çok yerel ve özel.

+1

'git rebase', taahhütlerin aslında yalnızca ağaç tarafından değil, değişiklikleriyle tanımlandığını varsayar. Ne yapmaya çalışıyorsun oldukça sıradışı, bu yüzden git porselen parçası sizin için çok yardımcı olmayacak ve sıhhi tesisat kullanmak zorunda kalacağım. – svick

+0

[Bu özel birleştirme sürücüsü] kullanmanın (http://stackoverflow.com/questions/928646/how-do-i-tell-git-to-always-select-my-local-version-for- kullanıp kullanmadığını merak ediyorum çakışan-bir-bir-bir-sp-930495 # 930495) veya benzeri çalışır. –

+0

@Karl: En azından ne yaptığını anlamak için bu yönteme iyi bakacağım. Hızlı bakış, Windows <-> Linux confusions'ımı basitleştiriyorsa, Adymitruk'ın yönteminin önüne geçebileceğini düşündürüyor ;-) –

cevap

3

rebase ile uğraşmayın. Yeni bir şube yap.

git checkout X -- . 
git add -A 
git commit -C X 

tekrarlayın İstediğiniz kronolojik sırayla tüm kaydedilmesini için: X, sha1 veya daha sonra kullanmak için taahhüt ait treeish ise.

biz son 5 kaydedilmesini sırasını tersine çevirmek Bir örnek: Bu yardımcı olur

git checkout -b temp old_branch~5 
git checkout old_branch -- . 
git add -A 
git commit -C old_branch 
git checkout old_branch~1 -- . 
git add -A 
git commit -C old_branch~1 
git checkout old_branch~2 -- . 
git add -A 
git commit -C old_branch~2 
git checkout old_branch~3 -- . 
git add -A 
git commit -C old_branch~3 
git checkout old_branch~4 -- . 
git add -A 
git commit -C old_branch~4 

git push . HEAD:old_branch -f 
git checkout old_branch 
git branch -d temp 

git log -5 # to see the new history 

umut.

+0

Sanırım bununla birlikte devam edebilirim, ama başlangıç ​​isyanını kullanarak, sha1'lerin listesini almak için kullanacağım, esas olarak hepsini toplama dosyasına koydukları için. Sonra bir betik olarak çalıştırın. Diğer işletim sistemlerinde 30 yıl sonra linux düzenleme ve script yöntemlerinden bazılarını öğrenmek garip! –

+0

Git'e ekle -A 'komutları, tüm dosyaları seçmek için bir '' 'biti varsa ya da' -A 'nın örtülü bir parçası mı? (Ben her zaman gördüm/kullandım) –

+0

Ayrıca, zaman zaman kesinti dizinleri ve dosyaları arasındaki çıkışları başarısızlık ile ilgili bir sorun alıyorum. Üst düzey dizin adı, normalde bir dizi isim olarak gösterilecek olan her anlık görüntü arasında değişir, ancak burada yalnızca bir ek seti alıyorum! Baska öneri? –

0

Rebase işlemini kolaylaştırmaya yardım edemiyorum, ancak bunun neden basit bir yeniden düzenleme olmadığını açıklayabilirim. Örnek olarak, revizyon başına eklenen bir metin satırına sahip bir dosya alın. İlk taahhüt günü, görünüşe gibi: On

Commit 1 

Başlangıçta bozuk koydu beri ikinci benzediğini, taahhüt: En olan üçüncü günü

Commit 1 
Commit 2 
Commit 3 

, taahhüt ikinci anlık, görünüşe gibi:

Commit 1 
Commit 2 
Git Git o kadar, yamalar uğraşıyor

, seri '

  • "1 Commit" diyor satırdan sonra
  • "2 Commit" demek satırları ekleyin "1 Commit" diyen bir çizgi ile dosya ekleme ve "3 Commit": gibi kaydedilmesini arasında es görünüyor

    • bir çizgi t sahip bir dosya ekleme: Yeniden sıralamak zaman gibi

    , görünüşe "2 Commit"

  • diyor satırdan sonra "3 Commit" diyor satırını kaldırın hat "Commit 1" yazıyor
  • "Commit 2" yazan satırdan sonra "Commit 3" yazan satırı kaldırın "Commit 2"
  • "Commit 2" ve "Commit 3" diyen satırları ekleyin. 1 "

İkinci adımı alır," Commit 2 "ile hiçbir çizgiyi görmez, karşı gelmek bilmez, ne yapacağını bilmez, bu yüzden manuel birleştirme gerektirir.

Birleştirmeyi el ile çözümledikten sonra bir sonraki adımda, gitmeyi beklediği 2 satırı görür ve yeniden bir el ile birleştirme gerektirir.e ve f gerekiyordu

a->b->c->d->e->f 

Hala rebase -i yapabilirsiniz

a ila d yere yerleştirilmek üzere, ancak taahhüt üzerine edit koydu:

+0

Bu yüzden, git işe gitmenin bu iş için doğru bir araç olmadığını düşünüyorum. Tam olarak ne olduğundan emin değilim. – svick

+0

Bu çok sıkıcı olurdu. Bir yama uygulamak istemezsiniz, bunun yerine her bir işlemde bulunan anlık görüntüleri birleştirin. –

0

geçmişiniz bu gibi görünüyorsa Eklemek istediğiniz yerden önce. Git bu düzenleme için durduğunda, anlık görüntüyü çalışma direktörünüze yerleştirin ve ekleyin/ekleyin. Bir sonraki noktaya kadar rebase devam edin, durulayın, tekrarlayın.

Söylenmesi gerektiğinde, yanlış yerleştirilmiş ek çekimlerle ilgilenen, başlangıçta hatalı yerleştirilmiş öğeleri, e ve f kaldırmak isteyeceksiniz.

+0

Bu, muhtemelen birçok çakışmalara neden olacaktır. Ve değişiklikleri uygulamak için çalışacağız, bu yüzden sonuç daha önce olduğu gibi aynı ağaç olmayabilir. – svick

İlgili konular