İçeriğe geç

Git commit geri alma ve önceki duruma dönme

Orta 10 dk Güncellendi:

Kısa cevap

Değişiklik henüz uzak depoya gönderilmediyse commit'i `git reset` ile, başkalarıyla paylaşıldıysa `git revert` ile geri alırsınız. Her şeyden önce `git status` ve `git log` komutlarını kontrol edin, çünkü `git reset --hard` izlenen dosyalardaki commit edilmemiş değişiklikleri kalıcı olarak siler.

Sorun nasıl anlaşılır

  • Yanlış dosyalarla veya yanlış mesajla commit yaptınız
  • Son commit derlemeyi veya testleri bozdu
  • Commit zaten uzak depoya gönderildi, nasıl kaldıracağınızı bilmiyorsunuz
  • Yanlışlıkla `git reset --hard` çalıştırdınız ve değişiklikleri kaybettiniz
  • Başarısız bir reset sonrası çalışma ağacı garip bir durumda

En yaygın nedenler

Commit içeriği yanlış

Commit'e `.env` dosyası veya başka bir daldan gelen değişiklikler gibi olmaması gereken dosyalar dahil oldu.

Kodda hata olan commit

Değişiklik yerelde geçti ancak testleri veya uygulamayı bozuyor, bu yüzden önceki sürüme dönmek gerekiyor.

Commit zaten paylaşıldı

Commit başkalarının da kullandığı `main` dalına gönderildiyse, geçmişi yeniden yazmak iş arkadaşlarınız için sorun yaratır.

Reset seçeneklerinin anlaşılmaması

`--soft`, `--mixed` ve `--hard` indeks ve çalışma dizinini farklı şekilde ele alır, bu yüzden değişiklikler kolayca kaybolur.

Adım adım çözüm

  1. 1

    Deponun mevcut durumunu kontrol edin

    Commit edilmemiş değişiklik olup olmadığını görmek için git status ve son beş commit'i görmek için git log --oneline -5 komutlarını çalıştırın. Dönmek istediğiniz commit'in hash değerini not edin, çünkü sonraki adımlarda buna ihtiyacınız olacak. Commit edilmemiş işiniz varsa önce git stash ile kaydedin.

  2. 2

    Dalın yedeğini alın

    Herhangi bir reset işleminden önce mevcut durumu gösteren bir dal oluşturun: git branch backup-<isim>. Böylece bir sorun çıkarsa eski duruma dönebilirsiniz. Bu dal zarar vermez ve daha sonra git branch -D backup-<isim> ile silebilirsiniz.

  3. 3

    Değişiklikleri silmeden son commit'i geri alın

    Commit'in kaybolmasını ancak değişikliklerin çalışma dizininde kalmasını istiyorsanız git reset --soft HEAD~1 kullanın. Dosyalar değişmiş olarak kalır ve yeni, doğru bir commit için hazırdır. Bu, yerel çalışma için en güvenli seçenektir.

  4. 4

    İndeksi ve çalışma dizinini önceki commit'e döndürün

    Tamamen önceki duruma dönmek için git reset --hard HEAD~1 kullanın. Uyarı: bu komut son commit'i mevcut daldan kaldırır ve izlenen dosyalardaki tüm commit edilmemiş değişiklikleri kalıcı olarak siler. Önce git status ile kontrol edin ve yedek bir dal oluşturun.

  5. 5

    Hash ile belirli bir commit'e dönün

    Sadece son commit'i değil, belirli bir commit'e dönmek istiyorsanız hash değerini belirtin: git reset --hard <hash>. Hash değerini git log --oneline çıktısında bulun. Birkaç commit geriye gitmek için hash yerine HEAD~3 kullanın. Burada da uyarı geçerlidir: önce yedek bir dal oluşturun ve git status ile kontrol edin, çünkü bu komut izlenen dosyalardaki commit edilmemiş değişiklikleri siler.

  6. 6

    Zaten gönderilmiş commit'i geri alın

    Commit zaten uzak depodaysa, paylaşılan dalda reset kullanmayın. Bunun yerine git revert <hash> çalıştırın, bu ters değişiklikler içeren yeni bir commit oluşturur. Ardından git push ile gönderin.

  7. 7

    Kaybolan commit'leri reflog'dan geri getirin

    Yanlışlıkla reset --hard çalıştırdıysanız ve commit'i kaybettiyseniz, git reflog çalıştırın ve reset öncesi durumun hash değerini bulun. Ardından git reset --hard <hash> ile geri dönün, ancak önce git status ile kontrol edin çünkü bu komut da izlenen dosyalardaki commit edilmemiş değişiklikleri siler. Reflog, HEAD işaretçisinin geçmişini genellikle 30 ila 90 gün saklar, ancak commit edilmemiş değişiklikleri geri getiremez.

  8. 8

    Sonucu kontrol edin ve çalışmaya devam edin

    Durumun doğru olduğunu onaylamak için git status ve git log --oneline -3 çalıştırın. revert yaptıysanız yeni commit'in mevcut olup olmadığını kontrol edin. Ancak emin olduktan sonra yedek dalı silin.

Reset yeterli olmadığında

Yanlış commit zaten paylaşılan bir dala gittiyse ve başkaları da onu çektiyse, git revert en güvenli yoldur. Paylaşılan bir dalda git push --force ile yeniden yazılmış geçmişi zorla göndermek başkalarının commit'lerini silebilir ve tüm iş arkadaşlarınızda çakışmalara neden olabilir. Zorla gönderme yapmanız gerekiyorsa önce ekibi bilgilendirin ve --force yerine --force-with-lease kullanın, çünkü bu komut arada birisi değişiklik gönderdiyse durur. Geçmişe giren büyük dosyalar veya gizli anahtarlar için reset yeterli değildir: geçmişi temizlemek ve anahtarları değiştirmek gerekir.

Tekrarlanmaması için

  • Sık sık ve küçük parçalar halinde, açık bir mesajla commit yapın
  • `reset --hard` öncesinde her zaman `git status` ile kontrol edin ve yedek bir dal oluşturun
  • Paylaşılan dallarda `git revert`, yalnızca yerelde `reset` kullanın
  • Yalnızca yerel duruma bağımlı kalmamak için çalışmanızı düzenli olarak uzak depoya gönderin

Ne zaman uzmana başvurmalı

Yanlış commit zaten birden fazla kişinin kullandığı paylaşılan bir daldaysa veya reset'in commit edilmemiş işinize ne yapacağından emin değilseniz, kendi başınıza devam etmeden önce BT desteğine danışmanız daha iyi olur.

Yazılım ve ürün geliştirme · Özel uygulamalar, SaaS ve 4-8 haftada MVP

Sık sorulan sorular

git reset ile git revert arasındaki fark nedir?

`git reset` dal işaretçisini taşır ve geçmişi yeniden yazar, bu yüzden yalnızca yerelde güvenlidir. `git revert` önceki commit'i geri alan yeni bir commit oluşturur ve geçmişi değiştirmez, bu yüzden paylaşılan dallar için güvenlidir.

Yanlışlıkla sildiğim commit'i geri getirebilir miyim?

`git reflog` içinde bulursanız getirebilirsiniz. `git reflog` çalıştırın, istediğiniz durumun hash değerini bulun ve `git reset --hard <hash>` ile geri dönün.

git reset'te --soft, --mixed ve --hard ne anlama gelir?

`--soft` değişiklikleri indekste ve çalışma dizininde tutar, `--mixed` (varsayılan) değişiklikleri yalnızca çalışma dizininde tutar, `--hard` ise izlenen dosyalardaki değişiklikleri siler ve onları commit durumuna döndürür.

Paylaş
Çözüm bulamadınız mı?AI BT asistanı 7/24 hizmetinizde. Sorunu anlatın veya hatanın ekran görüntüsünü gönderin, durumunuza özel talimat alın.AI BT asistanına sorun