Detached HEAD
- Okunuşu
- diteçt hed
Kısaca
Detached HEAD, bir branch yerine belirli bir commit'i checkout ettiğiniz ve yaptığınız yeni commit'lerin hiçbir branch'e ait olmadığı bir Git durumudur.
Git'te detached HEAD nedir?
Git'te HEAD, şu anda checkout ettiğiniz şeyi gösteren bir işaretçidir. Normalde main gibi bir branch'i gösterir ve branch bir commit'i gösterir; bu yüzden commit yaptığınızda branch ilerler ve HEAD de onunla birlikte ilerler. Detached HEAD durumunda ise HEAD doğrudan bir commit'i gösterir ve hiçbir branch bağlı değildir.
Bu duruma, yerel bir branch olmayan bir şeyi checkout ettiğinizde girersiniz: git checkout ya da git switch --detach ile bir commit hash'i, v2.1.0 gibi bir tag veya origin/main gibi bir remote-tracking branch. git bisect ve git rebase gibi komutlar da çalışırken HEAD'i geçici olarak ayırır. Git, 'detached HEAD' durumunda olduğunuza dair bir uyarı yazdırır ve git status, 'HEAD detached at' ifadesinin ardından commit'i ya da tag'i bildirir.
Bu, arşivden bir kitabın eski baskısını okumaya benzer: etrafa göz atmak, testleri çalıştırmak veya eski bir sürümü derlemek için gayet uygundur. Düzenleyip commit bile yapabilirsiniz, ancak bu commit'leri gösteren bir branch adı olmadığı için başka yere geçtiğinizde onları bulmak zorlaşır ve sonunda Git'in çöp toplama (garbage collection) işlemiyle silinirler. Bu işi korumak için bulunduğunuz noktada git switch -c <name> ile bir branch oluşturun.
Detached HEAD sıklıkla bir hata ya da bozuk bir depo sanılır, ancak normal ve faydalı bir durumdur; tek risk, bu durumdayken yapılan commit'leri kaybetmektir. Bir branch üzerinde olmaktan temel fark, commit yaptığınızda neyin hareket ettiğidir: bir branch'te branch işaretçisi yeni commit'inizi takip eder, detached HEAD'de ise HEAD'in kendisi dışında hiçbir şey hareket etmez. Başka yere geçip geride commit bıraktıysanız, git reflog onların hash'lerini listeler; böylece bunlara bir branch bağlayabilirsiniz.
Önemli noktalar
HEADnormalde bir branch'i gösterir; detached HEAD durumunda doğrudan bir commit'i gösterir.- Bir commit hash'ini, bir tag'i ya da bir remote-tracking branch'i checkout etmek
HEAD'i ayırır. - Eski sürümleri incelemek, test etmek veya derlemek için güvenlidir.
- Ayrıkken yapılan commit'ler hiçbir branch'e ait değildir ve başka yere geçtikten sonra kaybolabilir.
git switch -c <name>ayrık çalışmayı yeni bir branch'te saklar;git reflogise sonradan kurtarabilir.
Örnek
# Inspect an old release: this detaches HEAD
git checkout v2.1.0
# HEAD is now at 3c4d5e6 Release 2.1.0
git status
# HEAD detached at v2.1.0
# Made commits here that you want to keep? Put them on a new branch
git switch -c fix/old-release
# Nothing to keep? Just go back to your branch
git switch mainSık sorulan sorular
Git'te detached HEAD nasıl düzeltilir?
Tutmak istediğiniz bir commit yapmadıysanız git switch main ile bir branch'e geri dönün. Commit yaptıysanız, önce onları bir branch'e koymak için git switch -c <new-branch> çalıştırın, ardından o branch'i her zamanki gibi merge edin ya da push edin.
Detached HEAD durumunda iş kaybedebilir miyim?
Ayrıkken yapılan commit'ler risk altındadır, çünkü onları gösteren bir branch yoktur. Başka yere geçtikten sonra Git'in çöp toplaması onları silebilmeden önce bir süre, varsayılan olarak 30 gün boyunca git reflog ile bulunabilirler; bu yüzden tutmak istiyorsanız bir branch oluşturun.
Bir tag'i checkout etmek neden detached HEAD'e yol açar?
Tag, hareket etmemesi gereken sabit bir işaretçidir; bu yüzden Git, yeni commit'lerin onu bir branch gibi ilerletmesine izin veremez. Bunun yerine HEAD'i doğrudan etiketlenmiş commit'e yönlendirir ve siz bir branch oluşturana kadar yeni commit'ler bağlantısız kalır.
İlgili sayfalar
- BranchSürüm Kontrolü, s. 2Git'te branch, bir özellik ya da düzeltme üzerinde, birleştirene kadar ana kodu etkilemeden çalışmanızı sağlayan bağımsız bir geliştirme hattıdır.
- Git TagSürüm Kontrolü, s. 23Git tag, belirli bir commit'i gösteren adlandırılmış kalıcı bir işaretçidir; çoğunlukla deponun geçmişinde v1.0.0 gibi sürümleri işaretlemek için kullanılır.
- CommitSürüm Kontrolü, s. 5Commit, Git'te projenin dosyalarının; benzersiz bir kimlik, yazar, zaman damgası ve değişikliği anlatan bir mesajla kaydedilmiş anlık görüntüsüdür.
- Git BisectSürüm Kontrolü, s. 11Git bisect, commit geçmişinde ikili arama (binary search) yaparak hatayı getiren commit'i, yalnızca birkaç commit'i test ederek bulan Git komutudur.
- Git ResetSürüm Kontrolü, s. 20Git reset, mevcut branch'i daha eski bir commit'e geri taşıyan ve moduna göre staging area'yı ile dosyalarınızı da sıfırlayabilen bir Git komutudur.
- HEADSürüm Kontrolü, s. 27HEAD, Git'te checkout edilmiş olanı, normalde bulunduğunuz branch'i gösteren işaretçidir; o branch da son commit'ini gösterir, yeni commit'ler oraya eklenir.
Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin