---
title: Devirme
source: 'https://academia.sh/tr/kurslar/surum-kontrolune-giris/devirme'
course: 'Sürüm Kontrolüne Giriş'
language: tr
updated: '2026-08-17T18:10:48+00:00'
license: 'CC BY-SA 4.0'
---

# 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.

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:

```sh
if ! grep -i -- "$1" terimler.txt | cut -d '|' -f 1; then
    echo "eşleşme yok: $1" >&2
    exit 2
fi
```

```bash
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:

```bash
./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

```bash
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:

```bash
./ara.sh yokboyle
```

```
eşleşme yok: yokboyle
```

```bash
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

```bash
git show HEAD
```

```
commit a58791f8f8b5325563397d592015cb2009b5e567
Author: Deniz Kaya <deniz@ornek.test>
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:

```bash
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:

```bash
git revert -n bfe57d3
git status --short
```

```
M  terimler.txt
```

```bash
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:

```bash
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:

```bash
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.

```bash
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.
