Bunu başarmak için 2 adım vardır:
- Yeni bir boş taahhüt oluşturma
- Bu boş işlemden başlamak için geçmişi yeniden yazın
newroot
Kolaylık sağlamak için yeni boş taahhüdü geçici bir şubeye koyacağız .
1. Yeni bir boş taahhüt oluşturun
Bunu yapmanın birkaç yolu vardır.
Sadece sıhhi tesisat kullanma
En temiz yaklaşım Git'in tesisatını sadece doğrudan bir taahhüt oluşturmak için kullanmaktır.
Boş bir dizin için bir ağaç nesnesi oluşturun:
tree=`git hash-object -wt tree --stdin < /dev/null`
Etrafına bir taahhüt sarın:
commit=`git commit-tree -m 'root commit' $tree`
Bir referans oluşturun:
git branch newroot $commit
Kabuğunuzu yeterince iyi biliyorsanız, elbette tüm prosedürü tek bir astar halinde yeniden düzenleyebilirsiniz.
Sıhhi tesisat olmadan
Düzenli porselen komutlarıyla, newroot
şubeyi kontrol etmeden ve dizini ve çalışma kopyasını tekrar tekrar güncellemeden boş bir taahhüt oluşturamazsınız, bunun bir nedeni yoktur. Ancak bazıları bunu daha kolay anlayabilir:
git checkout --orphan newroot
git rm -rf .
git clean -fd
git commit --allow-empty -m 'root commit'
Eksikliği Git çok eski sürümlerinde olduğu Not --orphan
geçiş checkout
, bununla ilk satırı değiştirmek zorunda:
git symbolic-ref HEAD refs/heads/newroot
2. Bu boş işlemden başlamak için geçmişi yeniden yazın
Burada iki seçeneğiniz var: yeniden basma veya temiz bir geçmişi yeniden yazma.
rebasing
git rebase --onto newroot --root master
Bu sadelik erdemine sahiptir. Bununla birlikte, şubedeki her son taahhütteki komisyoncu adını ve tarihini de güncelleyecektir.
Ayrıca, bazı son vaka geçmişlerinde, hiçbir şey içermeyen bir taahhüde dayanıyor olmanıza rağmen, birleşme çatışmaları nedeniyle bile başarısız olabilir.
Geçmişi yeniden yazma
Daha temiz yaklaşım, dalı yeniden yazmaktır. Şunun aksine git rebase
, şubenizin hangi taahhütten başladığını araştırmanız gerekir:
git replace <currentroot> --graft newroot
git filter-branch master
Yeniden yazma açıkça ikinci adımda gerçekleşir; açıklanması gereken ilk adım. Yapılması git replace
gereken, Git'e, değiştirilmesini istediğiniz bir nesneye her başvuru gördüğünde, bunun yerine nesnenin değiştirilmesine bakması gerektiğini söyler.
İle --graft
anahtarı, normalde biraz daha farklı bir şeyler anlatıyor. Henüz bir yedek nesnesi yok diyorsun, ama Değiştirmek istediğiniz <currentroot>
kendisinin tam kopyasıyla nesneyi işlemek dışında yani (listelenen bu bir (ler) olmalıdır değiştirme ebeveyn taahhüt (ler) newroot
işlemek ). Sonragit replace
devam eder ve bu taahhüdü sizin için oluşturur ve ardından bu taahhüdü orijinal taahhüdünüzün yerine geçer.
Şimdi bir git log
yaparsanız, şeylerin zaten istediğiniz gibi göründüğünü göreceksiniz: şube başlar newroot
.
Bununla birlikte, git replace
gerçekte geçmişi değiştirmediğini veya deponuzdan yayılmadığını unutmayın. Yalnızca deponuza bir nesneden diğerine yerel bir yönlendirme ekler. Bunun anlamı, başkasının bu değiştirme işleminin etkisini görmemesi - sadece siz.
Bu yüzden filter-branch
adım gerekli. İle git replace
root düzeltilmiş ebeveyn kaydedilmesini ile tam bir kopyasını oluşturmak işlemek; git filter-branch
bu işlemi aşağıdaki tüm taahhütler için de tekrarlar. Tarih, aslında onu yeniden yazabilmeniz için burada yeniden yazılıyor.