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 topic
oluşturulan dal üzerinde çalıştıktan sonra git checkout -b topic origin/master
, uzaktan izleme dalının geçmişi origin/master
geri 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/master
kaydedilmesini noktaya kullanılan B3
, B2
, B1
ve şimdi işaret B
ve senin topic
ne zaman geri dalı üstünde başlandı origin/master
idi B3
.
Bu mod , çatal noktası olarak origin/master
bulmak için reflog'unu kullanır, böylelikle güncellemenin üstüne şu şekilde B3
yeniden topic
yüklenebilirorigin/master
:
$ fork_point=$(git merge-base --fork-point origin/master topic)
$ git rebase --onto origin/master $fork_point topic
Bu nedenle git merge-base
komutun 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 B3
ve sonra B2
ve 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 Derived
olması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'
B
yama 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 C
ve D
metinsel olarak çakışır;
E
metinsel olarak bağlıdır D
.
Doğru sonuç git rebase master dev
IS B
çatal noktası olarak tanımlanır dev
ve master
böylece C
, D
, E
ihtiyaç üzerine yeniden oynatılır bu kaydedilmesini vardır master
; ama C
ve D
yama ö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 B
içeren bir dalı seçmek B'
bir çatışmaya neden olur ve yama ile özdeş taahhütler doğru şekilde tanımlanmazsa, o zaman C
içeren D
(veya eşdeğer olarak D*
) bir dalı seçmek bir çatışmaya neden olur.
" --fork-point
" Modu "git rebase
Git 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-point
regresyon 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-point
kı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.