İçeriğe geç
academia.sh

Ders 13 / 15

Devirme

Bir işlemenin etkisini tersine çeviren yeni işleme; tarihçeyi bozmadan geri alma, ağaç kimliğiyle doğrulama, işlemeden devirme ve devirmenin devrilmesi.

İçindekiler

Sıfırlama ve değiştirme, tarihçeyi yeniden yazarak çalışır; bu yüzden paylaşılmış işlemelerde kullanılamazlar. Paylaşılmış bir işleme hatalıysa geriye tek bir yol kalır: geçmişi olduğu gibi bırakıp, hatanın etkisini tersine çeviren yeni bir işleme yazmak. Bu işleme devirme (revert) denir.

Hata

Arama betiğinin çıktısı yalnızca Türkçe sütunla sınırlandırılmak istenir ve grep çıktısı bir süzgeçten geçirilir:

if ! grep -i -- "$1" terimler.txt | cut -d '|' -f 1; then
    echo "eşleşme yok: $1" >&2
    exit 2
fi
git commit -m "Arama çıktısını yalnızca Türkçe sütuna indir"
[main ad60f31] Arama çıktısını yalnızca Türkçe sütuna indir
 1 file changed, 1 insertion(+), 1 deletion(-)

Değişiklik istenen çıktıyı üretir ama gizli bir kusur taşır: kabuk, boru hattının çıkış kodunu son komuttan alır. cut her durumda başarıyla sonlandığı için grep eşleşme bulamadığında da koşul yanlış çıkar:

./ara.sh yokboyle
echo "çıkış kodu: $?"
çıkış kodu: 0

Betik hiçbir eşleşme bildirimi yazmadı ve sıfır çıkış koduyla sonlandı; oysa eşleşme yoktur ve çıkış kodu 2 olmalıdır. Kusur, çıktının kendisinde değil hata bildirimindedir; bu nedenle gözden kaçmaya elverişlidir.

İşleme paylaşılmıştır ve tarihçeden düşürülemez.

Devirme

git revert --no-edit ad60f31
[main a58791f] Revert "Arama çıktısını yalnızca Türkçe sütuna indir"
 Date: Mon Mar 11 10:12:00 2024 +0300
 1 file changed, 1 insertion(+), 1 deletion(-)

--no-edit, hazırlanan mesajı düzenleyici açmadan kabul eder. Betik yeniden doğru çalışır:

./ara.sh yokboyle
eşleşme yok: yokboyle
git log --oneline -n 4
a58791f Revert "Arama çıktısını yalnızca Türkçe sütuna indir"
ad60f31 Arama çıktısını yalnızca Türkçe sütuna indir
18600c5 README'ye kullanım bölümü ekle
bfe57d3 Öbek ve dizi terimlerini ekle

Hatalı işleme tarihçede duruyor. Yanına, etkisini tersine çeviren bir işleme eklendi.

Devirme İşlemesinin İçeriği

git show HEAD
commit a58791f8f8b5325563397d592015cb2009b5e567
Author: Deniz Kaya <[email protected]>
Date:   Mon Mar 11 10:12:00 2024 +0300

    Revert "Arama çıktısını yalnızca Türkçe sütuna indir"

    This reverts commit ad60f311bd296f370a18d98a40173d878160d809.

diff --git a/ara.sh b/ara.sh
index 64b5b70..582ddde 100755
--- a/ara.sh
+++ b/ara.sh
@@ -6,7 +6,7 @@ if [ $# -ne 1 ]; then
     exit 1
 fi
 
-if ! grep -i -- "$1" terimler.txt | cut -d '|' -f 1; then
+if ! grep -i -- "$1" terimler.txt; then
     echo "eşleşme yok: $1" >&2
     exit 2
 fi

Fark, devrilen işlemenin farkının tersidir: silinen satır eklenmiş, eklenen satır silinmiştir. Otomatik oluşturulan mesaj, devrilen işlemenin tam kimliğini gövdeye yazar; bu satır sayesinde bir devirmenin neyi geri aldığı tarihçeden okunabilir.

Sonucun Doğrulanması

Devirmenin gerçekten önceki duruma döndürüp döndürmediği, ağaç kimlikleri karşılaştırılarak kesin olarak sınanır:

git log --format='%h %T %s' -n 4
a58791f ac0eb40463f387ce1cb40623aa9c16a9a7ed229f Revert "Arama çıktısını yalnızca Türkçe sütuna indir"
ad60f31 9ab09543909d738602a2a947e858b1457972ef28 Arama çıktısını yalnızca Türkçe sütuna indir
18600c5 ac0eb40463f387ce1cb40623aa9c16a9a7ed229f README'ye kullanım bölümü ekle
bfe57d3 c6ec3cea3b8943f818cd8bb423c65f0cb5c553ea Öbek ve dizi terimlerini ekle

Devirme işlemesinin ağacı ac0eb40, hatalı işlemeden önceki 18600c5 işlemesinin ağacıyla aynıdır. İki farklı işleme aynı ağacı gösteriyor: proje içeriği bayt düzeyinde eski hâline dönmüştür. İçerik adresli depolamanın verdiği bu eşitlik sınaması, farkları gözle karşılaştırmaya gerek bırakmaz.

Devirme Neden Tarihçeyi Bozmaz

Devirme yalnızca ekleme yapar: var olan hiçbir nesneye dokunmaz, hiçbir kimliği değiştirmez. Tarihçeyi daha önce almış kopyalar, ellerindeki zinciri korur ve üzerine tek bir yeni işleme alır. Sıfırlamada ortaya çıkan uyumsuzluk burada oluşmaz.

Bedeli, hatanın tarihçede görünür kalmasıdır. Bu bir kusur değil, çoğu zaman istenen davranıştır: hatalı bir değişikliğin ne zaman girdiği, ne zaman ve neden geri alındığı kaydedilmiş olur.

İşlemeden Devirmek

Devirmenin sonucu doğrudan işlenmeden incelenebilir:

git revert -n bfe57d3
git status --short
M  terimler.txt
git diff --staged
diff --git a/terimler.txt b/terimler.txt
index a5350ef..17af3b8 100644
--- a/terimler.txt
+++ b/terimler.txt
@@ -5,5 +5,3 @@ ağaç | tree
 karma tablosu | hash table
 bağlı liste | linked list
 küme | set
-öbek | heap
-dizi | array

-n seçeneği değişikliği hazırlık alanına koyar ama işlemez. Bu, birden çok işlemeyi tek bir devirme işlemesinde toplamak ya da sonucu işlemeden önce incelemek için kullanılır. İşlem iptal edilebilir:

git revert --abort

Komut çalışma dizinini ve hazırlık alanını devirme başlamadan önceki hâline döndürür.

Örnekte devrilen işleme, tarihçenin en son işlemesi değildi. Devirme herhangi bir işlemeye uygulanabilir; hesaplanan şey, o işlemenin farkının tersinin şu anki içeriğe uygulanmasıdır. Aradan geçen işlemeler aynı satırlara dokunmuşsa uygulama başarısız olur ve çakışma bildirilir. Çakışma çözümü Dallanma ve İşbirliği kursunun konusudur.

Devirmenin Devrilmesi

Devirme de bir işlemedir; devrilebilir. Bu, geri alınan bir değişikliği yeniden uygulamanın yoludur:

git revert --no-edit a58791f
[main 464855e] Reapply "Arama çıktısını yalnızca Türkçe sütuna indir"
 Date: Mon Mar 11 15:00:00 2024 +0300
 1 file changed, 1 insertion(+), 1 deletion(-)

Mesaj bu kez Revert değil Reapply ile başlar: bir devirmenin devrilmesi, özünde yeniden uygulamadır.

git log --format='%h %T %s' -n 4
464855e 9ab09543909d738602a2a947e858b1457972ef28 Reapply "Arama çıktısını yalnızca Türkçe sütuna indir"
a58791f ac0eb40463f387ce1cb40623aa9c16a9a7ed229f Revert "Arama çıktısını yalnızca Türkçe sütuna indir"
ad60f31 9ab09543909d738602a2a947e858b1457972ef28 Arama çıktısını yalnızca Türkçe sütuna indir
18600c5 ac0eb40463f387ce1cb40623aa9c16a9a7ed229f README'ye kullanım bölümü ekle

Dört işleme, iki ağaç arasında dönüşümlü gidip geliyor. Örnek deponun tarihçesinde bu son adım tutulmamıştır — kusurlu değişiklik yeniden uygulanmamış, devirme yerinde bırakılmıştır.

Devirme mi, Sıfırlama mı

Ölçüt Devirme Sıfırlama
Tarihçe Korunur, yeni işleme eklenir Yeniden yazılır
Paylaşılmış işlemede Uygundur Uygun değildir
Hatanın görünürlüğü Kayıtta kalır Silinir
Uygulanabildiği işleme Herhangi biri Dal ucundan geriye doğru

Ölçüt tektir: işleme paylaşılmışsa devirme, paylaşılmamışsa her ikisi de kullanılabilir.

Özet

  • Devirme, bir işlemenin farkının tersini uygulayan yeni bir işleme oluşturur.
  • Tarihçe korunur; hiçbir nesne değişmez, yalnızca yeni bir işleme eklenir.
  • Devirme işlemesinin ağacı, devrilen işlemeden önceki ağaçla aynıdır; bu eşitlik doğrulama aracıdır.
  • -n seçeneği sonucu işlemeden hazırlık alanına koyar; --abort işlemi iptal eder.
  • Bir devirme de devrilebilir; sonuç, değişikliğin yeniden uygulanmasıdır.

Sonraki Adım

Buraya kadarki araçlar tamamlanmış değişikliklerle ilgiliydi. Peki yarım kalmış bir iş varken başka bir konuya geçmek gerekirse ne yapılır? İşlemek erken, geri almak ise kayıptır. Sonraki ders, yarım kalmış işi geçici olarak saklayan zulayı ve bu saklamanın nesne modelindeki karşılığını ele alacak.

İlerlemeni kaydetmek ve not almak için Giriş yap

Notlarım

Not almak için giriş yapmalısın.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat