Git detached HEAD durumunda HEAD, bir dalı değil doğrudan belirli bir commit’i gösterir. Bu tek başına hata değildir; Git’te commit’leri inceleyebilir ve değişiklik yapabilirsin. Değişiklik yapmadıysan hedef dala geçerek geri dönebilirsin; detached durumdayken commit oluşturduysan önce onu korumak gerekir.
Detached HEAD durumu ne anlama gelir?

Normalde HEAD geçerli dalı, geçerli dal da o dalın en son commit’ini gösterir. Detached durumda ise HEAD, dal adını aradan çıkarıp doğrudan bir commit’e işaret eder.
Örneğin, main dalının c3d4e5f commit’inde, önceki commit’in de a1b2c3d olduğunu düşün:
Normal durum:
HEAD -> main -> c3d4e5f
|
a1b2c3d
Detached durum:
HEAD -> a1b2c3d
main -> c3d4e5f
Bir commit kimliğine ya da commit’e işaret eden bir etikete git checkout ile geçtiğinde Git, HEAD’i doğrudan o commit’e yöneltebilir. Dal adıyla geçiş yaptığında HEAD dala bağlı kalır; verilen ifade bir commit’e çözülürse detached duruma geçilir. Ayrıntılar için Git’in checkout belgesine bakabilirsin.
Git’in bu geçişte gösterebildiği uyarı, mevcut konumun bir dala bağlı olmadığını ve burada oluşturulan commit’lerin bir dalı kendiliğinden ilerletmeyeceğini açıklar. Uyarının metni Git sürümüne ve bağlama göre değişebilir; bu nedenle tek bir terminal mesajını her kurulumda görülecek sabit çıktı gibi değerlendirmemek gerekir.
Değişiklik yapmadıysan ana dala nasıl dönersin?
Çalışma ağacında kaydedilmemiş değişiklik yoksa önce durumu kontrol et, ardından hedef dala geç. Aşağıdaki akışta örnek dal adı main olarak kullanılıyor; depodaki ana dalın adı farklı olabilir.
git status çalışma ağacındaki değişiklikleri ve HEAD’in hangi durumda olduğunu gösterir; temiz bir çalışma ağacında örnek çıktı şöyle görünebilir:
$ git status
HEAD detached at a1b2c3d
nothing to commit, working tree clean
git log --oneline commit geçmişini kısa biçimde listeler; bu örnek, mevcut commit’in yakın geçmişini gösterir:
$ git log --oneline
a1b2c3d Düzenleme yapıldı
7f8e9a0 İlk sürüm
git switch main HEAD’i main dalına geçirir; örnek terminal çıktısı geçişin tamamlandığını bildirir:
$ git switch main
Switched to branch 'main'
Komut tamamlandıktan sonra git status çalıştırarak HEAD’in beklediğin dala geçtiğini ve çalışma ağacının durumunu yeniden kontrol edebilirsin.
Detached durumda oluşturduğun commit'i nasıl korursun?

Detached HEAD durumunda yaptığın commit'i korumanın en güvenli yolu, o commit'ten hemen bir dal oluşturmaktır. Aşağıdaki örnekte main dalından eski bir commit'e geçip küçük bir düzeltme yapacak, commit oluşturacak ve ardından bu commit'i main dalına birleştireceksin.
Önce main dalına geçmek için git checkout main komutunu çalıştır:
$ git checkout main
Switched to branch 'main'
git checkout HEAD~2 komutu, main dalının iki commit gerisindeki noktaya geçer. Bir dal adı yerine commit'e geçildiği için HEAD detached duruma gelir:
$ git checkout HEAD~2
Note: switching to 'HEAD~2'.
You are in 'detached HEAD' state.
HEAD is now at 4f2a1c7 Eski sürüm
Şimdi bir dosyada küçük düzeltme yapıp git add README.md komutuyla dosyayı bir sonraki commit için hazırlayabilirsin. git commit -m ise hazırlanan değişikliği açıklama mesajıyla birlikte yeni bir commit'e dönüştürür:
$ git add README.md
$ git commit -m "README açıklamasını düzelt"
[detached HEAD 8bd5e73] README açıklamasını düzelt
1 file changed, 1 insertion(+), 1 deletion(-)
Commit oluşturulduktan sonra hâlâ detached durumdasın. git switch -c duzeltme komutu, mevcut commit'i başlangıç noktası kabul ederek duzeltme adında yeni bir dal oluşturur ve bu dala geçer:
$ git switch -c duzeltme
Switched to a new branch 'duzeltme'
git switch komutu Git 2.23 ile kullanıma sunuldu. Daha eski Git sürümlerinde aynı işlem için git checkout -b duzeltme komutu kullanılabilir.
Artık commit bir dala bağlı olduğu için güvenle main dalına dönebilirsin. git switch main komutu çalışma alanını main dalına geçirir:
$ git switch main
Switched to branch 'main'
Son olarak git merge duzeltme komutu, duzeltme dalındaki commit'i mevcut main dalıyla birleştirir:
$ git merge duzeltme
Merge made by the 'ort' strategy.
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
Buradaki commit kimlikleri ve terminal çıktıları öğretici örnek olarak temsili kullanılmıştır. Gerçek depoda commit kimlikleri, değişen dosyalar ve birleştirme çıktısı farklı olabilir.
Commit'i başka dala geçtiysen nasıl bulursun?
Detached HEAD durumunda commit oluşturduktan sonra başka bir dala geçtiysen, önce git reflog ile HEAD'in geçmişte gösterdiği konumları incele. Reflog, yerel depoda dal ve HEAD hareketlerini kaydeder:
$ git reflog
81fa913 HEAD@{0}: checkout: moving from 8bd5e73 to main
8bd5e73 HEAD@{1}: commit: README açıklamasını düzelt
4f2a1c7 HEAD@{2}: checkout: moving from main to HEAD~2
Bu çıktıda 8bd5e73, detached durumdayken oluşturulan commit'tir. Commit'in hemen yanındaki reflog satırını bulduktan sonra git switch -c kurtarma 8bd5e73 komutunu çalıştır. Komut, bulunan commit'ten kurtarma adında yeni bir dal oluşturur ve o dala geçer:
$ git switch -c kurtarma 8bd5e73
Switched to a new branch 'kurtarma'
Commit artık bir dal tarafından gösterildiği için Git'in otomatik temizlik işlemlerine karşı korunmuş olur. Reflog kayıtları süresiz tutulmaz; kayıtların saklanması ve erişilemez commit'lerin ne zaman temizlenebileceği depo yapılandırmasına ve Git'in bakım işlemlerine bağlıdır. Bu nedenle commit'i bulduğun anda yeni bir dal oluşturmak daha güvenlidir.
Detached HEAD uyarısı bir hata mesajı olarak değerlendirilmemelidir. Git, bu konumda inceleme ve commit işlemleri yapabileceğini, ancak dal oluşturmadan başka bir dala geçersen commit'in herhangi bir dal tarafından gösterilmeyebileceğini belirtir. Uyarı görüldüğünde panikle git reset --hard çalıştırmak yerine önce reflog'u incele; bu komut çalışma alanındaki kaydedilmemiş değişiklikleri silebilir.
Sık Sorulan Sorular
Detached HEAD durumunda commit atarsam commit'im hemen kaybolur mu?
Detached HEAD durumunda oluşturduğun commit hemen kaybolmaz, ancak bir dala bağlanmadığı için başka bir dala geçtiğinde doğrudan erişilebilir olmaktan çıkabilir. Commit'i korumak için dal değiştirmeden önce git switch -c dal-adi komutuyla yeni bir dal oluşturabilirsin.
Detached HEAD durumundan değişikliklerimi silmeden nasıl çıkarım?
Commit oluşturduysan önce mevcut commit'ten bir dal oluşturup ardından git switch main gibi bir komutla başka dala geçebilirsin. Henüz commit oluşturmadıysan değişikliklerini kaybetmemek için önce commit edebilir veya uygun bir geçici saklama yöntemi kullanabilirsin.
Reflog ile bulduğum commit'i kalıcı bir dala nasıl alırım?
Reflog'da gördüğün commit kimliğini kullanarak git switch -c kurtarma COMMIT_ID komutunu çalıştır. Böylece Git, bulunan commit'i gösteren yeni bir dal oluşturur ve commit'i normal dal geçmişinin parçası hâline getirir.
Detached HEAD uyarısı, Git geçmişinin bozulduğu anlamına gelmez. Önce commit'i bir dal adıyla güvenceye alıp ardından çalışmaya devam etmek, durumu düzenli biçimde yönetmenin en pratik yoludur.