Git ile başlayan 2014 1. Çeyrek 1.9 / 2.0, sen de açıklandığı gibi, yeniden yazılamaz memba dalı üzerinde rebasing önce önceki şube kökenli işaretlemek zorunda kalmazsınız Aristoteles Pagaltzis 'ın cevabı :
Bkz 07d406b işlemek ve d96855f taahhüt :
İle topicoluşturulan dal üzerinde çalıştıktan sonra git checkout -b topic origin/master, uzaktan izleme dalının geçmişi origin/mastergeri sarılıp yeniden oluşturulmuş ve bu şekilde bir geçmişe yol açmış olabilir:
o---B1
/
---o---o---B2--o---o---o---B (origin/master)
\
B3
\
Derived (topic)
nerede origin/masterkaydedilmesini noktaya kullanılan B3, B2, B1ve şimdi işaret Bve senin topicne zaman geri dalı üstünde başlandı origin/masteridi B3.
Bu mod , çatal noktası olarak origin/masterbulmak için reflog'unu kullanır, böylelikle güncellemenin üstüne şu şekilde B3yeniden topicyüklenebilirorigin/master :
$ fork_point=$(git merge-base --fork-point origin/master topic)
$ git rebase --onto origin/master $fork_point topic
Bu nedenle git merge-basekomutun yeni bir seçeneği var:
--fork-point::
Bir dalın (veya yol açan herhangi bir geçmişin <commit>) başka bir daldan (veya herhangi bir referanstan) çatallandığı noktayı bulun <ref>.
Bu, sadece iki commit'in<ref><commit><ref> ortak atasını aramakla kalmaz , aynı zamanda, dalın daha önceki bir enkarnasyonundan çatallanıp çatallaşmaya yol açan tarihin reflog'unu da hesaba katar .
" git pull --rebase" Komutu base, "" temel "durumla başa çıkmak için, şubenin çalışmasının dayandığı " "dalın (tipik olarak bir uzaktan izleme dalı) reflog girişlerini kullanarak yeniden oluşturulan dalın çatal noktasını hesaplar. şube geri sarıldı ve yeniden inşa edildi.
Örneğin, tarih nerede görünüyorsa:
- "
base" dalının şu anki ucu " " konumunda B, ancak daha önceki getirme, ucunun önceden B3ve sonra B2ve sonra B1
geçerli kaydetmeye gelmeden önce olduğunu gözlemledi ve
- en son "temel" üzerine yeniden temel alınan şube, taahhüt üzerine kuruludur
B3,
o bulmaya çalışır B3"çıkışında geçerek git rev-list --reflog base" (yani B, B1, B2, B3) bir o anki ucunun bir atası işlemek bulana kadar "Derived (topic) ".
Dahili olarak, bunu get_merge_bases_many()tek seferde hesaplayabilen buna sahibiz . " " In tüm tarihsel ipuçlarını birleştirerek sonuçlanacak hayali bir birleştirme taahhüdü
arasında bir birleştirme temeli Derivedolmasını isterdik base (origin/master).
Böyle bir kayıt olduğunda, " base" reflog girdilerinden biriyle tam olarak eşleşen tek bir sonuç almalıyız .
Git 2.1 (Q3 2014) bu bu özellik daha sağlam hale katacak: bkz 1e0dacd taahhüt tarafından John Keeping ( johnkeeping)
Aşağıdaki topolojiye sahip olduğumuz senaryoyu doğru şekilde ele alın:
C --- D --- E <- dev
/
B <- master@{1}
/
o --- B' --- C* --- D* <- master
nerede:
B'Byama ile aynı olmayan sabitlenmiş bir sürümüdür B;
C*ve yanlış sırada uygulanırsa, sırasıyla ve D*yama ile aynıdır Cve Dmetinsel olarak çakışır;
Emetinsel olarak bağlıdır D.
Doğru sonuç git rebase master devIS Bçatal noktası olarak tanımlanır devve masterböylece C, D, Eihtiyaç üzerine yeniden oynatılır bu kaydedilmesini vardır master; ama Cve Dyama özdeş ile vardır C*ve D*sonuç, öyle ki, ve böylece düşmüş olabilir:
o --- B' --- C* --- D* --- E <- dev
Çatal noktası tanımlanmadıysa, o zaman Biçeren bir dalı seçmek B'bir çatışmaya neden olur ve yama ile özdeş taahhütler doğru şekilde tanımlanmazsa, o zaman Ciçeren D(veya eşdeğer olarak D*) bir dalı seçmek bir çatışmaya neden olur.
" --fork-point" Modu "git rebaseGit 2.27 (Q2 2020) ile düzeltilen 2.20 çağında C de komut yeniden yazıldığında "geriledi.
Junio C Hamano ( ) tarafından yapılan commit f08132f'ye (09 Aralık 2019) bakın . ( Junio C Hamano tarafından birleştirildi - - in commit fb4175b , 27 Mar 2020)gitster
gitster
rebase: --fork-pointregresyon düzeltmesi
İmza: Alex Torok
[jc: düzeltmeyi yeniledi ve Alex'in testlerini kullandı]
İmza: Junio C Hamano
" git rebase --fork-point master", git merge-base --fork-pointkısa refname ile nasıl başa çıkılacağını bilen ve temeldeki get_fork_point()işlevi çağırmadan önce onu tam refname olarak değiştiren dahili olarak " " olarak adlandırılan " " iyi çalışıyordu.
Bu, komut C dilinde yeniden yazıldıktan sonra, dahili çağrısı doğrudan get_fork_point() yazıldıktan kısa bir referans vermez.
"Git merge-base" içinde kullanılan "refname argümanını tam refname argümanına dwim" mantığını temeldeki işleve taşıyın get_fork_point(), böylece "git rebase" uygulamasındaki işlevin diğer çağırıcısı da aynı şekilde davranır. bu gerileme.