Yan yana
Git ResetvsGit Revert
git reset ile git revert arasındaki fark nedir?
Güncellendi 2 dk okuma7 fark
Kısaca
Git reset dalı eski bir commit'e geri taşır ve sonrakileri atar; git revert ise bir commit'i geri alan yeni bir commit ekler, paylaşılan dallarda güvenlidir.
Git Reset
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 sayfasını okuGit Revert
Git 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.
Git Revert sayfasını okuGit Reset ve Git Revert karşılaştırması
| Özellik | Git Reset | Git Revert |
|---|---|---|
| Ne yapar | Dal işaretçisini daha eski bir commit'e taşır | Eski bir commit'i tersine çeviren yeni bir commit ekler |
| Geçmiş | Yeniden yazılır: sonraki commit'ler daldan düşer | Korunur: özgün commit günlükte kalır |
| Paylaşılan dallarda güvenli mi | Hayır, iş arkadaşlarında çelişen geçmiş oluşur | Evet, sıradan bir yeni commit'tir |
| Çalışma dosyaları | --soft, --mixed ya da --hard kipine göre korunur veya atılır | Yalnızca commit'in tersi uygulanarak değişir |
| Hangi commit'ler | Hedef commit'ten sonraki her şey | Eski olsa bile herhangi bir commit ya da aralık |
| Push edildikten sonra | Uzak depoyu güncellemek için force push gerekir | Normal bir push çalışır |
| En uygun olduğu yer | Paylaşmadan önce yerel commit'leri temizlemek | Zaten yayımlanmış bir değişikliği geri almak |
Fark, açıklamalı
git reset, geçerli dal işaretçisini başka bir commit'e taşır ve kipe bağlı olarak hazırlık alanını (staging area) ve çalışma dosyalarınızı da değiştirebilir. git revert mevcut geçmişe dokunmaz ve değişiklikleri, geri almak istediğiniz commit'in tam tersi olan yeni bir commit oluşturur.
Fark, geçmişin yeniden yazılıp yazılmadığıdır. Reset commit'leri daldan çıkarır; bu, kimsenin görmediği yerel işler için sorun değildir ama o commit'leri zaten çeken iş arkadaşları için işleri bozar. Revert ise geçmişe yalnızca ekleme yapar; bu yüzden main gibi paylaşılan bir dalda zaten bulunan bir değişikliği geri almanın güvenli yoludur.
Reset'in üç ana kipi vardır: --soft geri alınan değişiklikleri hazırlık alanında tutar, --mixed (varsayılan) onları hazırlanmamış düzenlemeler olarak tutar, --hard ise atar. Revert yalnızca sonuncusunu değil herhangi bir commit'i geri alabilir; tipik bir iş akışı yerel commit'leri temizlemek için reset'i, zaten push edilmiş kötü bir değişikliği geri çekmek için revert'i kullanır.
Sık yapılan bir yanlış, git reset --hard'ın commit'leri sonsuza dek sildiği düşüncesidir. Git eski commit'leri bir süre saklar ve git reflog bunları genellikle bulup geri getirebilir; ancak --hard'ın attığı commit edilmemiş değişiklikler gerçekten kaybolur.
Hangisini kullanmalısınız?
Git Reset şu durumlarda doğru seçim:
- Commit'ler yalnızca sizin makinenizde duruyor.
- Yakın zamandaki yerel commit'leri birleştirmek (squash) ya da yeniden yapmak istiyorsunuz.
- Dosyaları hazırlık alanından çıkarmak ya da yerel değişiklikleri atmak istiyorsunuz.
Git Revert şu durumlarda doğru seçim:
- Commit zaten paylaşılan bir dala push edildi.
- Nelerin geri alındığını gösteren net bir kayıt istiyorsunuz.
- Sonraki commit'leri koruyarak daha eski bir commit'i geri almak istiyorsunuz.
Son commit'i iki yolla geri almak
# Undo the last commit, keep its changes staged
git reset --soft HEAD~1
# Undo the last commit and discard its changes
git reset --hard HEAD~1
# Already pushed? The remote now needs a force push
git push --force-with-lease# Create a new commit that undoes a specific commit
git revert a1b2c3d
# History now shows both the commit and its revert
git log --oneline
# f9e8d7c Revert "Add broken cache layer"
# a1b2c3d Add broken cache layer
git pushSık sorulan sorular
Bir git reset geri alınabilir mi?
Genellikle evet. git reflog dalın daha önce nereyi gösterdiğini listeler, böylece o commit'e geri reset atabilirsiniz; yalnızca --hard ile kaybedilen commit edilmemiş değişiklikler bu yolla kurtarılamaz.
main üzerinde reset mi revert mi kullanmalıyım?
Revert kullanın. main gibi paylaşılan dalların geçmişi yeniden yazılmamalıdır; revert commit'i değişikliği geri alırken herkesin kopyasını tutarlı tutar.
Bir revert geri alınabilir mi?
Evet. Revert commit'ini revert etmek özgün değişiklikleri yeniden uygular; bu, bir özelliği düzelttikten sonra geri getirmenin yaygın bir yoludur.