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
Deponun mevcut durumunu kontrol edin
Commit edilmemiş değişiklik olup olmadığını görmek için
git statusve son beş commit'i görmek içingit log --oneline -5komutları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 öncegit stashile kaydedin. - 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 sonragit branch -D backup-<isim>ile silebilirsiniz. - 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~1kullanı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
İndeksi ve çalışma dizinini önceki commit'e döndürün
Tamamen önceki duruma dönmek için
git reset --hard HEAD~1kullanı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. Öncegit statusile kontrol edin ve yedek bir dal oluşturun. - 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ğerinigit log --onelineçıktısında bulun. Birkaç commit geriye gitmek için hash yerineHEAD~3kullanın. Burada da uyarı geçerlidir: önce yedek bir dal oluşturun vegit statusile kontrol edin, çünkü bu komut izlenen dosyalardaki commit edilmemiş değişiklikleri siler. - 6
Zaten gönderilmiş commit'i geri alın
Commit zaten uzak depodaysa, paylaşılan dalda
resetkullanmayın. Bunun yerinegit revert <hash>çalıştırın, bu ters değişiklikler içeren yeni bir commit oluşturur. Ardındangit pushile gönderin. - 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ındangit reset --hard <hash>ile geri dönün, ancak öncegit statusile 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
Sonucu kontrol edin ve çalışmaya devam edin
Durumun doğru olduğunu onaylamak için
git statusvegit log --oneline -3çalıştırın.revertyaptı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 MVPSı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.