İçeriğe geç

Menü

Berk Akademi
Yorumlar Google yorumları Özel Ders Başvuru Ücretsiz ön görüşme Ana Sayfa

git detached head Durumu Nedir ve Nasıl Düzeltilir?

git-detached-head-durumu-nedir-nasil-duzeltilir
Bu yazıda neler var?
  1. Detached HEAD durumu ne anlama gelir?
  2. Değişiklik yapmadıysan ana dala nasıl dönersin?
  3. Detached durumda oluşturduğun commit'i nasıl korursun?
  4. Commit'i başka dala geçtiysen nasıl bulursun?
  5. Sık Sorulan Sorular

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?

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 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.

Bu içerik aradığın cevabı verdi mi?
Yanıtın, hangi yazıları geliştirmemiz gerektiğini anlamamıza yardımcı olur.
Bu içeriğin üretilmesinde yapay zeka araçlarından destek alınmıştır.

Bu konudan sonra ne okuyabilirsin?

Tüm yazılar

İlgili Eğitimler

Berk Keskin, yazılım geliştirici ve eğitmen
Yazar

Berk Keskin Kimdir?

Yazılıma 12 yaşında başladı; İzmir Ekonomi Üniversitesi'ni bölüm birincisi ve yüksek şeref öğrencisi olarak tamamladı. Bugün yalnızca eğitim vermekle kalmıyor, sektörde aktif olarak yazılım projeleri geliştiriyor ve gerçek dünya deneyimini birebir derslerine taşıyor. Ezberden uzak, mühendislik zihniyetini merkeze alan sürdürülebilir öğrenme sistemleri tasarlayarak sorgulayan, üreten ve problem çözebilen yeni nesil yazılımcılar yetiştiriyor.

Sektörel Deneyim & Projeler

  • Ticarify Entegrasyon Yazılım logosu CEO Ticarify Entegrasyon YazılımPazaryerleri ve e-ticaret sitelerine otomatik e-fatura kesimi, sipariş ve kargo takibi hizmetleri sunan e-Dönüşüm platformunun API mimarisini ve yazılım ekibini yönetmektedir.
  • Benim Düğünüm logosu CEO Benim DüğünümDijital etkinlik ve anı paylaşım platformu.
  • Siberdizayn logosu Yazılım Ekibi Lideri SiberdizaynYüksek anlık oyuncu trafiğine sahip oyun kontrol panelleri ve sunucu altyapıları geliştiren yazılım ekibine liderlik etmektedir.
  • MEDYOGRAFYA 360° Dijital Çözümler logosu Dijital Strateji Lideri MEDYOGRAFYA 360° Dijital ÇözümlerŞirketlerin dijital çözümlerde uzun vadede nasıl ilerlemesi gerektiği ve dijital dönüşüm süreçlerinin yönetilmesine destek olmaktadır.
  • İzmir Ekonomi Üniversitesi logosu Danışma Kurulu Üyesi İzmir Ekonomi ÜniversitesiMezun olduğu üniversitesinde, Bilgisayar Programcılığı bölümünün akademik müfredatını güncel sektör ihtiyaçlarına göre şekillendirmek adına Danışma Kurulu'nda görev almaktadır.
WhatsApp Hemen Ara