İlk olarak, HEAD'in ne olduğunu ve ayrıldığında ne anlama geldiğini açıklığa kavuşturalım .
HEAD, şu anda teslim alınan işlemin sembolik adıdır. HEAD ayrılmadığında (“normal” 1 durum: bir şubeniz kontrol edildiğinde), HEAD aslında bir şubenin “ref” sini ve şube bu taahhüdü işaret eder. Böylece HEAD bir dala “tutturulur”. Yeni bir taahhütte bulunduğunuzda, HEAD'ın işaret ettiği şube yeni taahhüdü gösterecek şekilde güncellenir. HEAD otomatik olarak dalı takip ettiği için takip eder.
git symbolic-ref HEAD
verim refs/heads/master
“Master” adlı dal teslim edilir.
git rev-parse refs/heads/master
verim 17a02998078923f2d62811326d130de991d1a95a
Bu taahhüt, ana dalın şu anki ucu veya “başı” dır.
git rev-parse HEAD
aynı zamanda 17a02998078923f2d62811326d130de991d1a95a
“sembolik ref” olmanın anlamı da budur. Başka bir referans yoluyla bir nesneye işaret eder.
(Sembolik referanslar başlangıçta sembolik bağlantılar olarak uygulandı, ancak daha sonra sembolik olmayan platformlarda kullanılabilmeleri için ekstra yorumlu düz dosyalara dönüştürüldü.)
Biz HEAD
→ refs/heads/master
→17a02998078923f2d62811326d130de991d1a95a
HEAD ayrıldığında, bir daldan dolaylı olarak birine işaret etmek yerine doğrudan bir taahhüdü işaret eder. Müstakil bir HEAD'in isimsiz bir dalda olduğunu düşünebilirsiniz.
git symbolic-ref HEAD
ile başarısız fatal: ref HEAD is not a symbolic ref
git rev-parse HEAD
verim 17a02998078923f2d62811326d130de991d1a95a
Sembolik bir referans olmadığından, doğrudan taahhüdün kendisine işaret etmelidir.
Biz HEAD
→17a02998078923f2d62811326d130de991d1a95a
Müstakil bir HEAD ile hatırlanması gereken önemli şey, işaret ettiği taahhüt başka bir şekilde referans verilmezse (başka hiçbir referansa ulaşamazsa), başka bir taahhüdü kontrol ettiğinizde “sarkan” olacaktır. Sonunda, bu tür sarkan taahhütler çöp toplama işlemi boyunca budanır (varsayılan olarak, en az 2 hafta tutulur ve HEAD'in refloguyla referans gösterilerek daha uzun süre saklanabilir).
1
Müstakil bir KAFA ile “normal” iş yapmak gayet iyi, sadece balık bırakılan geçmişi reflog dışında bırakmak zorunda kalmamak için ne yaptığını takip etmek gerekir.
Etkileşimli bir yeniden tabanın ara adımları, bağımsız bir HEAD ile yapılır (kısmen aktif dalın reflogunu kirletmemek için). Tam rebase işlemini tamamlarsanız, orijinal şubenizi rebase işleminin kümülatif sonucu ile günceller ve HEAD'ı orijinal şubeye yeniden bağlar. Benim tahminim, rebase sürecini asla tam olarak tamamlamamanızdır; bu, rebase operasyonu tarafından en son işlenen taahhüdü işaret eden müstakil bir KAFA ile size bırakacaktır.
Durumunuzdan kurtulmak için, müstakil HEAD'in şu anda işaret ettiği taahhüdü gösteren bir şube oluşturmalısınız:
git branch temp
git checkout temp
(bu iki komut şu şekilde kısaltılabilir git checkout -b temp
)
Bu, HEAD'inizi yeni temp
şubeye yeniden bağlayacaktır .
Ardından, mevcut taahhüdü (ve geçmişini) üzerinde çalışmayı beklediğiniz normal şubeyle karşılaştırmalısınız:
git log --graph --decorate --pretty=oneline --abbrev-commit master origin/master temp
git diff master temp
git diff origin/master temp
(Muhtemelen günlük seçeneklerini denemek isteyeceksiniz: ekleyin -p
, --pretty=…
tüm günlük mesajını görmek için bırakın , vb.)
Yeni temp
şubeniz iyi görünüyorsa, master
onu işaret edecek şekilde güncellemek isteyebilirsiniz :
git branch -f master temp
git checkout master
(bu iki komut şu şekilde kısaltılabilir git checkout -B master temp
)
Daha sonra geçici dalı silebilirsiniz:
git branch -d temp
Son olarak, muhtemelen yeniden kurulan tarihi zorlamak isteyeceksiniz:
git push origin master
--force
Uzak dal yeni taahhüde "hızlı iletilemiyorsa" (yani varolan bir taahhüdü düşürdünüz veya yeniden yazdınız veya başka bir tarih geçmişini yeniden yazdıysanız), bu komutun sonuna eklemeniz gerekebilir .
Bir rebase operasyonunun ortasındaysanız, muhtemelen temizlemelisiniz. Dizini arayarak bir rebase işleminin devam edip etmediğini kontrol edebilirsiniz .git/rebase-merge/
. Devam eden rebase'i yalnızca bu dizini silerek manuel olarak temizleyebilirsiniz (örneğin, etkin rebase işleminin amacını ve içeriğini artık hatırlamıyorsanız). Genellikle kullanırsınız git rebase --abort
, ancak bu muhtemelen kaçınmak istediğiniz bazı ekstra sıfırlama yapar (HEAD'ı orijinal şubesine geri taşır ve orijinal taahhüdüne sıfırlar, bu da yukarıda yaptığımız bazı işleri geri alır).