Git Reset
Kısaca
Git 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.
git reset nedir?
git reset, mevcut branch'i farklı, genellikle daha eski bir commit'i gösterecek şekilde geri sarar; bu da sonraki commit'leri o branch'in geçmişinden kaldırır. Esas olarak henüz paylaşılmamış yerel commit'leri geri almak ya da dosyaları staging'den çıkarmak için kullanılır. Örneğin git reset HEAD~1, branch'i bir commit geri taşır; buradaki HEAD~1 'mevcut olandan önceki commit' anlamına gelir.
Geri aldığınız commit'lerin değişikliklerine ne olacağını üç mod belirler. --soft yalnızca branch'i taşır ve bu değişiklikleri stage edilmiş, yeniden commit'e hazır bırakır; varsayılan olan --mixed onları ayrıca staging area'dan temizler ama çalışma dosyalarınızda tutar; --hard ise staging area'yı ve çalışma dosyalarını da sıfırlayarak commit edilmemiş her değişikliği atar. Bir commit yerine git reset <file> örneğindeki gibi bir dosya yolu verildiğinde komut, o dosyayı yalnızca staging'den çıkarır.
Reset, günlükte bir yer imini daha eski bir sayfaya geri taşımaya benzer; mod, o zamandan beri yazılan sayfaların gevşek notlar olarak mı saklanacağını yoksa atılacağını mı belirler. Reset'le uzaklaştırdığınız commit'ler hemen yok edilmez: git reflog, branch'in daha önce nereyi gösterdiğini listeler; böylece genellikle haftalarca git reset --hard <old-hash> ile geri dönebilirsiniz. Ancak --hard ile silinen commit edilmemiş düzenlemeler Git'e hiç kaydedilmemiştir ve bu yolla kurtarılamaz.
Git reset en sık git revert ile karıştırılır. Reset, branch işaretçisini taşıyarak geçmişi yeniden yazar; bu yerel commit'ler için sorun değildir, ancak başkalarının pull ettiği bir branch'te sorun çıkarır, çünkü onların kopyaları sizin kaldırdığınız commit'leri hâlâ içerir. Revert ise geçmişi olduğu gibi bırakır ve eski bir commit'i geri alan yeni bir commit ekler; bu yüzden paylaşılan commit'leri geri almanın güvenli yoludur. Reset ayrıca yalnızca dosyaları değiştiren ve hiçbir branch'i taşımayan git restore'dan da farklıdır.
Önemli noktalar
git reset <commit>mevcut branch'i başka bir commit'e taşır ve sonraki commit'leri ondan kaldırır.--softgeri alınan değişiklikleri stage edilmiş tutar,--mixed(varsayılan) stage edilmemiş tutar,--hardise atar.git reset <file>içeriğini değiştirmeden bir dosyayı staging'den çıkarır.- Reset geçmişi yeniden yazar; bu yüzden yerel commit'ler için onu, paylaşılanlar için
git revert'i kullanın. git reflog, hatalı bir reset sonrası commit'leri kurtarmanıza yardımcı olabilir.
Örnek
# Undo the last commit but keep its changes staged
git reset --soft HEAD~1
# Undo the last commit and unstage its changes (the default, --mixed)
git reset HEAD~1
# Throw away the last commit AND all uncommitted changes (careful!)
git reset --hard HEAD~1
# Unstage a file without touching its contents
git reset src/app.ts
# Made a mistake? Find the previous position and go back to it
git reflog
git reset --hard HEAD@{1}Sık sorulan sorular
git reset ile git revert arasındaki fark nedir?
git reset bir branch'i daha eski bir commit'e geri taşır ve sonraki commit'leri ondan atar; bu yüzden henüz push edilmemiş yerel işler için uygundur. git revert ise eski bir commit'i geri alan yeni bir commit oluşturur ve geçmişi olduğu gibi bırakır; bu yüzden paylaşılan branch'lerde güvenlidir.
git reset --soft, --mixed ve --hard arasındaki fark nedir?
Üçü de branch'i hedef commit'e taşır. --soft geri alınan değişiklikleri stage edilmiş tutar, --mixed onları stage edilmemiş düzenlemeler olarak tutar, --hard ise onları hem staging area'dan hem de çalışma dizininden kaldırır.
Bir git reset --hard geri alınabilir mi?
Commit edilmiş iş genellikle kurtarılabilir: git reflog çalıştırın, branch'in reset'ten önce gösterdiği hash'i bulun ve oraya geri reset edin. --hard ile atılan commit edilmemiş değişiklikler ise Git tarafından hiç kaydedilmemiştir ve genellikle kurtarılamaz.
Sık karşılaştırılanlar
İlgili sayfalar
- Git RevertSürüm Kontrolü, s. 21Git revert, önceki bir commit'i, tersi değişiklikleri içeren yeni bir commit oluşturarak geri alan, mevcut proje geçmişini olduğu gibi bırakan Git komutudur.
- Staging AreaSürüm Kontrolü, s. 37Git'teki staging area, dosyalarınız ile bir sonraki commit arasındaki bekleme alanıdır; o commit'e girecek değişiklikleri tam olarak buraya koyarsınız.
- 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 StashSürüm Kontrolü, s. 22Git stash, commit edilmemiş değişiklikleri geçici olarak saklayıp çalışma dizinini temizleyen komuttur; başka işe geçip çalışmanıza sonra dönmenizi sağlar.
- Detached HEADSürüm Kontrolü, s. 7Detached 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.
- RebaseSürüm Kontrolü, s. 33Git'te rebase, bir branch'in commit'lerini başka bir commit'in üzerine yeniden uygular; geçmişi yeniden yazıp merge commit'siz, temiz ve doğrusal kılar.
Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin