Program
Depo durumunu kontrol etmek için Git’teki en güçlü araçlardan biri git reset komutudur. Geliştiricilerin bir dalın işaret ettiği commit’i ayarlamasına, bir sonraki commit için nelerin aşamalandığını belirlemesine ve hatta push etmeden önce yerel geçmişi yeniden yazmasına olanak tanır.
Bu rehber, dosyaları aşamadan çıkarma ve commit geçmişini yönetme amaçlarıyla kullanılan çok yönlü bir varyant olan git reset HEAD’e özel olarak odaklanır.
Rehber boyunca bu komutu, çeşitli kiplerini ve git revert ve git clean gibi sıkça karıştırılan komutlarla karşılaştırmasını ayrıntılı biçimde inceleyeceğiz.
Git Reset HEAD’in Temelleri
git reset HEAD’i nasıl uygulayacağınızı öğrenmeden önce, davranışını belirleyen temel kavramları ele alalım.
Git’in üç ağaçlı mimarisi
Git verileri kavramsal olarak üç alanda yönetir:
- Commit geçmişi (depo): Bu, yaptığınız tüm commit’leri saklayan proje anlık görüntülerinin kalıcı kaydıdır.
- Aşama alanı (index): Bir sonraki commit’e dahil edilmek üzere işaretlediğiniz değişiklikleri içerir.
- Çalışma dizini: Kodu düzenleyip test ettiğiniz gerçek dosya sisteminizdir.
Sürüm geçmişini yönetirken bu üç ağaç sürekli etkileşim halindedir.
Örneğin git add çalıştırdığınızda değişiklikleri çalışma dizininden aşama alanına taşırsınız. Commit ettiğinizde ise Git aşama alanının bir anlık görüntüsünü alır ve bunu commit geçmişine kaydeder.
git reset komutu geçerli dal işaretçisini belirtilen bir commit’e taşır ve HEAD de onunla birlikte hareket eder. Ayrık HEAD durumunda, HEAD’i doğrudan kaydırır. Kullanılan kipe bağlı olarak git reset index’i günceller ve çalışma dizinini de değiştirebilir. Bu da onu hassas sürüm kontrolü için vazgeçilmez kılar.
Git’te HEAD’i anlamak
HEAD işaretçisi, commit geçmişinde geçerli konumunuzu takip etmenin Git’teki yoludur. Genellikle HEAD, check-out yaptığınız dalın en son commit’ini işaret eder.
Ancak “ayrık HEAD” durumundaysanız doğrudan bir commit’i de işaret edebilir. Bu işaretçiyi anlamak kritik önem taşır; zira git reset, HEAD’i (ve potansiyel olarak dal referansını) yeni bir commit’e taşıyarak çalışır.
Dal işaretçileri ve commit özetleri (hash) commit’lere sabit referanslar sağlarken, HEAD dinamiktir ve geçmişte gezinirken ya da dallar arasında geçiş yaparken hareket eder.
Bu farkı bilmek, reset işlemi yaparken kafa karışıklığını önlemeye yardımcı olur.
Commit geçmişinde gezinme
Git, HEAD’e göre göreli hareket için kısayol gösterimi sağlar:
HEAD^→ geçerli commit’in birinci (hemen) ebeveyniHEAD~2→ bir üstünün üstü commit (iki adım geri)
Bu kısayol, tam commit özetlerine ihtiyaç duymadan hızlı gezinme olanağı tanır. Dallar ve etiketler de commit’leri referans alabilirken, HEAD gibi komutların (reset veya checkout) mevcut konumunuzu bilmesini sağlar.
Ebeveynler hakkında ipucu: HEAD~N, birinci ebeveyn zincirini N adım izler. ^ bir ebeveyni seçer; birleştirme (merge) commit’lerinde hangisi olduğunu belirtebilirsiniz, örn. HEAD^1, HEAD^2.
git reset HEAD Kiplerini Keşfetme: Soft, Mixed, Hard
git reset depo üzerindeki etki derinliğini tanımlayan üç kip ile gelir. Her biri farklı sonuçlar doğurur; bu nedenle doğru kullanmak için nasıl çalıştıklarını bilmeniz gerekir.
Soft reset kipi
git reset --soft HEAD^
İlk olarak soft reset kipimiz var. git reset --soft <hedef> ile Git, dal işaretçisini geri (veya hedef commit’e) taşır ancak tüm değişiklikleri index’te aşamalanmış halde tutar.
Şu durumlarda özellikle kullanışlıdır:
- Son commit mesajınızın hatalı olduğunu fark ettiğinizde
- Birden fazla değişikliği, aşamalanmış içeriği kaybetmeden tek bir commit’te birleştirmek istediğinizde.
Bu komut aşama alanını olduğu gibi bırakır; böylece daha iyi bir mesajla veya daha rafine bir seçimle yeniden commit edebilirsiniz.
Mixed reset kipi
git reset --mixed HEAD^
Sırada varsayılan kip olan mixed reset var. git reset --mixed <hedef>, dal işaretçisini taşır ve aşama alanını hedef commit ile eşleyecek şekilde sıfırlar; çalışma dizinindeki değişiklikleri ise korur.
Bu sayede tek bir büyük commit’i birkaç daha küçük ve mantıklı commit’e bölerek yeniden yapılandırabilirsiniz. Reset’ten sonra dosyaları seçerek aşamaya alabilir ve daha düzenli biçimde yeniden commit edebilirsiniz.
Hard reset kipi
git reset --hard HEAD^
Son olarak, izlenen dosyalardaki değişiklikleri geri alan hard reset kipi var. git reset --hard <hedef> en güçlü ve en tehlikeli seçenektir. Dal işaretçisini, index’i ve çalışma dizinini hedef commit ile birebir eşleşecek şekilde sıfırlar. Index’inizdeki ve çalışma dizininizdeki izlenen dosyalara ait tüm commit edilmemiş değişiklikleri atar. İzlenmeyen dosyalar kaldırılmaz (onlar için git clean kullanın).
Her şeyi sıfırlamak istediğinizde kullanışlı olsa da özellikle ekip ortamlarında ciddi risk taşır; çünkü commit’e alınmamış değişiklikleri kalıcı olarak kaldırır.
git reset HEAD Komut Sözdizimi ve Varyasyonları
Komutun sözdizimine bakarak tüm bunları daha iyi anlayalım.
Temel komut yapısı
git reset komutunun genel biçimi şöyledir:
git reset [--soft | --mixed | --hard] <target>
Kip, depo durumunuzun ne kadarının etkileneceğini belirler; hedef ise resetleneceğiniz commit’i tanımlar. Kip belirtilmezse varsayılan --mixed kullanılır.
Belirli commit’leri hedefleme
Commit’lere farklı gösterimlerle referans verilebilir:
HEAD^veyaHEAD~3gibi göreli gösterimler- Açık commit özetleri (örn.,
git reset 4a5d9c2) - Dal adları veya etiketler
Güvenlik için, yakın zamandaki HEAD hareketlerini belirlemek ve yanlışlıkla atılan commit’leri kurtarmak üzere git reflog kullanılabilir.
Dosya bazlı reset işlemleri
Sadece belirtilen dosya için aşama alanını güncelleyebilir, çalışma kopyasını olduğu gibi bırakabilirsiniz.
Bu tür işlemler için sözdizimi şöyledir:
git reset HEAD -- <file>
Bu komut genellikle yanlışlıkla index’e eklenen bir dosyayı “aşamadan çıkarma” amacıyla kullanılır.
Alternatif olarak, modern Git’te git restore --staged <file> daha açıklayıcı bir seçenek olarak sunulur. Dosya bazlı reset’ler, düzenlemelerinizi kaybetmeden bir sonraki commit’e nelerin gideceğini hassaslaştırmak istediğinizde idealdir.
Git komutları hakkında daha fazla bilgi için aşağıdaki Git Hızlı Başvuru Kartı’na göz atın.

Git reset HEAD’in Pratik Uygulamaları ve Kullanım Alanları
Bu reset komutunun sürüm kontrolünde pek çok kullanım alanı vardır. İşte bazı pratik örnekler:
1. Commit hatalarını düzeltme
Geliştiriciler sıklıkla çok erken veya eksik değişikliklerle commit eder.
git reset --soft HEAD^, son commit’i geri alırken her şeyi aşamalanmış halde tutmanızı sağlar; böylece tüm değişiklikleri baştan geri almadan düzgün şekilde yeniden commit edebilirsiniz.
Alternatif olarak git reset HEAD^, commit’i geri alır ancak değişiklikleri aşamadan çıkarır; böylece daha ayrıntılı bir şekilde yeniden aşamaya alabilirsiniz.
2. Commit’leri yeniden düzenleme
Bazen commit’ler çok sayıda ilgisiz değişiklik içerir. Mixed reset, bir commit’i geri alırken değişiklikleri çalışma dizininde tutmanıza izin verir.
Buradan, projenin evrimini daha iyi yansıtan birden çok küçük commit oluşturabilirsiniz. Benzer şekilde, değişiklikleri erken birleştirdiyseniz, paylaşmadan önce geçmişinizi yeniden düzenleme şansı verir.
3. Dosya aşamaya alma yönetimi
git reset HEAD -- <file> ile belirli dosyaları aşamadan çıkarmak, yalnızca ilgili dosyaların birlikte commit edilmesini sağlar. Bu da anlaşılması ve gözden geçirilmesi daha kolay olan atomik commit’leri destekler.
Örneğin bir hatayı düzeltip aynı zamanda dokümantasyonu güncellediyseniz, bir değişiklik setini aşamadan çıkarmak her commit’in net ve tek bir amaca sahip olmasını sağlar.
4. Dalları uzak depolarla eşitleme
Yerel dalınız uzak daldan önemli ölçüde ayrıştığında, uzak dala hard reset (örn., git reset --hard origin/main) zorla hizalama sağlar.
Bu, yerel deneysellikleri atmak için yararlı olabilir; ancak yerel değişiklikleri kalıcı olarak sildiğinden dikkatli uygulanmalıdır.
Uzak geçmiş: git reset yereldir. Yeniden yazılmış geçmişi uzakta yansıtmak için git push --force-with-lease kullanın ve ekip arkadaşlarınızın çalışmalarını ezmemek için koordinasyon sağlayın.
Güvenlik Hususları ve Risk Yönetimi
git reset, index’inizde ve çalışma dizininizdeki değişiklikleri atabildiğinden bazı güvenlik ve risk unsurlarını göz önünde bulundurmalısınız.
git reset HEAD kullanımının riskleri
Reset’ler geçmişi temizleyebilse de çalışmayı da yok edebilir.
Herhangi bir ek bayrak olmadan git reset HEAD kullanmak, varsayılan olan mixed reset kipini uygular. Bu, şu anda aşamalanmış değişiklikleri aşamadan çıkarır (değişiklikler çalışma dizininizde kalır). Değişiklikler çalışma dizininizde kalsa da artık bir sonraki commit için işaretlenmiş olmayacaktır.
Commit edilmemiş değişiklikler aşamadan çıkar; dosya değişiklikleriniz diskte kalır. Daha önce aşamaya aldığınız dosyalarda değişiklik yaptıysanız, git reset HEAD aşama alanını HEAD commit’iyle eşleyecek şekilde geri alır ve fiilen bu değişiklikleri aşamadan çıkarır.
Reset öncesi doğrulama adımları
Reset uygulamadan önce, tüm dosyaların yolunda olduğundan emin olmak için depo durumunuzu incelemelisiniz.
Bunu yapmak için şu adımları izleyin:
- Hangi dosyaların aşamada veya değiştirilmiş olduğunu doğrulamak için
git statusçalıştırın. - HEAD’in şu anda nereye işaret ettiğini anlamak için
git logveyagit reflogkullanın. - Neleri kaybedebileceğinizi doğrulamak için
git diffile değişiklikleri karşılaştırın.
Bu adımları atmak sürprizleri en aza indirir ve kasıtlı olarak reset attığınızdan emin olmanızı sağlar.
Yedekleme ve kurtarma stratejileri
Kodda büyük değişiklikler gibi riskli işlemler öncesinde mutlaka yedek alın.
Kullanabileceğiniz bazı stratejiler şunlardır:
- Stashing: Commit edilmemiş değişiklikleri geçici olarak
git stash push -m "backup"ile kaydedin. - Dal oluşturma: Geçerli geçmişi korumak için
git branch savepointile bir yedek dal oluşturun.
Bu önlemler reset işlemlerini daha az göz korkutucu hale getirir ve güvenle denemeler yapmanıza olanak tanır.
Kurtarma ve Geri Alma Mekanizmaları
Yanlış bir Git komutu kullanıldığı her durumda kurtarma yapmanın çeşitli yolları vardır.
Kurtarma için git reflog kullanma
git reflog, HEAD’in her hareketini kaydeder ve yanlışlıkla yapılan reset’lerden sonra hayat kurtarıcı olabilir. Bir commit’in izini kaybederseniz, basitçe şunu çalıştırın:
git reflog
git reset --hard <commit-id>
Commit çöp toplamaya (garbage collection) uğramadığı sürece atılan çalışmayı kurtarmanıza olanak tanır.
Alternatif kurtarma stratejileri
Reflog’un yanı sıra stash’ler ve yedek dallardan yararlanabilirsiniz. Stash’ler commit edilmemiş çalışmayı yakalarken, dallar tüm commit geçmişlerini korur. İşbirlikçi ortamlarda, çoğu zaman doğru durumu uzak depodan çekerek hatalardan kurtulabilirsiniz.
İleri Düzey Kullanımlar ve En İyi Uygulamalar
git reset HEAD komutu daha gelişmiş işlemleri gerçekleştirmek için de kullanılabilir.
1. Etkileşimli aşamaya alma iş akışları
git add --patch ile dosya düzeyinde reset’i eşleştirmek, her commit’e nelerin gireceği üzerinde azami denetim sağlar. Bu iş akışı commit’lerin atomik ve odaklı olmasını garanti eder; okunabilirliği artırır ve alakasız değişiklikler ekleme olasılığını azaltır.
2. Commit mesajlarını iyileştirme
Bir yazım hatası fark ederseniz veya commit mesajlarını daha netleştirmeniz gerekirse, soft reset kodu değiştirmeden commit’i yeniden yazmanıza olanak tanır. Bu, geçmişinizi anlamlı tutmanın temiz bir yoludur.
3. Dal yönetimi ve geçmişi yeniden yazma
Birleştirmeden önce commit geçmişlerini derlemek için reset stratejik olarak da kullanılabilir. Geliştiriciler, dallar ana hatta entegre edildiğinde daha temiz bir geçmiş sunması için commit’leri sıkıştırmak (squash) veya yeniden düzenlemek amacıyla reset’ten yararlanır.
4. İşbirlikçi iş akışı protokolleri
Ekiplerde net mutabakatlar şarttır. Paylaşılan dalları resetlemekten kaçının ve force push gerektiğinde diğerleriyle iletişim kurun.
Bu protokollere uymak, paylaşılan depolarda karışıklığı ve bozuk geçmişleri önler.
İlgili Komutlar ve Ek Araçlar
Git komutları genellikle birbirleriyle birlikte kullanılır. İşte git reset HEAD ile benzer şekilde çalışan bazı ilgili komutlar.
git clean ile izlenmeyen dosyaları kaldırma
Bazen izlenmeyen dosyalar çalışma dizininizi kalabalıklaştırır. git clean bunları kaldırır; ancak dikkatli kullanın—bu işlem geri alınamaz. Dosyaları gerçekten silmeden önce deneme çalışması için git clean -n çalıştırın. git reset ile birlikte bir depo durumunu tertemiz hale getirebilir.
git revert ile herkese açık geçmiş için
Paylaşılan depolarda çalışırken, commit’leri geri almak için git revert kullanmayı git reset’e tercih edebilirsiniz. git revert, önceki bir commit’in değişikliklerini etkisiz hale getiren yeni bir commit oluşturur ve geçmiş bütünlüğünü korur. Buna karşılık git reset geçmişi yeniden yazar ve ekip arkadaşlarınızı etkileyebilir.
Hızlı karşılaştırma:
reset→ geçmişi yeniden yazar.revert→ önceki bir commit’i geri alan yeni bir commit oluşturur.restore→ geçmişi değiştirmeden çalışma dosyalarını ayarlar.
Sonuç
git reset HEAD kullanmak, geliştiricilere depo durumları üzerinde ince ayar kontrolü sağlar. Güçlü olmakla birlikte, özellikle geçmişi yeniden yazmanın çatışmalara yol açabileceği işbirlikçi ortamlarda dikkatle kullanılmalıdır.
Bu temel işlev, depolarla çalışırken ve istenmeyen değişiklikleri geri alırken pek çok olanağı beraberinde getirir. Git hakkında daha fazla bilgi edinmek isterseniz GitHub Foundations beceri yolumuza ya da Foundations of Git kursumuza göz atın.
Git reset HEAD SSS
git reset --hard için en iyi uygulamalar nelerdir?
git reset --hard komutunu ölçülü kullanın; çünkü hem aşama alanınızdaki hem de çalışma dizininizdeki değişiklikleri kalıcı olarak atar. Kaldırmadan önce commit edilmemiş değişikliklere ihtiyacınız olmadığından her zaman emin olun. Komutu çalıştırmadan önce işinizi commit edin veya stash’e alın; böylece aşırı agresif bir reset durumunda geri dönüş seçeneğiniz olur.
Yanlışlıkla yapılan bir git reset --hard işleminden nasıl kurtulabilirim?
Kurtarma, commit’in başka bir yerde referans alınıp alınmadığına bağlıdır. Git’in reflog’u çoğu zaman yardımcı olur: git reflog çalıştırmak, yakın zamandaki HEAD konumlarının geçmişini gösterir; ardından git checkout veya git reset ile kaybolan commit’e geri dönebilirsiniz. Ancak reset’ten önce değişikliklerinizi commit etmediyseniz, commit edilmemiş çalışma genellikle kurtarılamaz.
git reset --soft, --mixed ve --hard arasındaki farklar nelerdir?
--soft, HEAD’i yeni bir commit’e taşır ancak tüm değişiklikleri aşamalanmış halde tutar. --mixed (varsayılan) HEAD’i taşır ve aşama alanını temizler; ancak çalışma dizinine dokunmaz. --hard, HEAD’i taşır, aşama alanını temizler ve çalışma dizinini üzerine yazar; commit edilmemiş değişiklikleri tamamen siler.
git reset --hard, commit edilmemiş değişiklikleri nasıl etkiler?
git reset --hard, commit edilmemiş değişiklikleri siler. Çalışma dizininizdeki veya aşama alanınızdaki ve henüz commit edilmemiş tüm değişiklikler, git reset --hard çalıştırıldığında kaybolur.
Uzak bir depoda git reset --hard kullanabilir miyim?
Hayır. git reset --hard yalnızca yerel deponuzu etkiler. Uzak bir dalı değiştirmek için yerel değişikliklerinizi zorlayarak push etmeniz gerekir (git push --force); bu, o dalda çalışan herkes için geçmişi yeniden yazabilir. İşbirliğini aksatabileceğinden bunu yalnızca ekibinizle net iletişim kurarak yapmalısınız.
Ben Austin, sağlık sektöründe veri bilimci ve veri analisti olarak yıllara dayanan deneyime sahip bir blogger ve teknoloji yazarıyım. Biyoloji geçmişiyle başladığım teknoloji yolculuğumda, şimdi teknoloji blogum aracılığıyla başkalarının da aynı geçişi yapmasına yardımcı oluyorum. Teknolojiye olan tutkum, onlarca SaaS şirketine yazılı katkılar sunmama, başkalarına ilham vermeme ve deneyimlerimi paylaşmama vesile oldu.

