Berk Akademi
Birebir ders başvurusu Ücretsiz ön görüşme Ana Sayfa

Git'te git restore --staged Ne İşe Yarar? Dosya Nasıl Unstage Edilir?

git-restore-staged-dosya-nasil-unstage-edilir
Bu yazıda neler var?
  1. Git'te son commit, staging area ve çalışma alanı nasıl ayrılır?
  2. git restore --staged dosyayı nasıl unstage eder?
  3. İki takip edilen dosyadan yalnız biri nasıl unstage edilir?
  4. Unstage etmek ile çalışma alanındaki değişikliği silmek nasıl ayrılır?
  5. Sık Sorulan Sorular

Git'te git restore --staged, bir dosyayı staging area'dan çıkarır, yani dosyanın değişikliklerini bir sonraki commit için hazırlanmış durumdan alır. Yalnızca bu biçimde kullanıldığında çalışma klasöründeki içeriği silmez veya geri almaz. Tek dosyayı unstage etmek için git restore --staged dosya.txt komutunu kullanabilirsin.

Git'te son commit, staging area ve çalışma alanı nasıl ayrılır?

Git'te son commit, staging area ve çalışma alanı nasıl ayrılır?

Git, aynı dosyanın içeriğini üç ayrı katmanda değerlendirebilir. HEAD, bu örnekte son commit içindeki sürümü temsil eder. Staging area, diğer adıyla index, bir sonraki commit için hazırlanan içeriği tutar. Çalışma alanı ise bilgisayarında düzenlemekte olduğun güncel dosyadır.

HEAD, son commit        : başlık
Staging area, index    : başlık + ilk değişiklik
Çalışma alanı          : başlık + ilk değişiklik + ikinci değişiklik

git add dosya.txt çalıştırıldığında dosya başka bir klasöre taşınmaz. Git, dosyanın komut çalıştırıldığı andaki içeriğini index içinde bir sonraki commit için hazırlar. Dosyayı daha sonra yeniden düzenlersen yeni değişiklik çalışma alanında kalır ve tekrar git add çalıştırılana kadar stage edilmiş sayılmaz.

git status çıktısındaki temel bölümler bu katmanların karşılaştırılmasına dayanır:

  • Changes to be committed: Index ile HEAD arasında bulunan, commit için hazırlanmış değişiklikleri gösterir.
  • Changes not staged for commit: Çalışma alanı ile index arasındaki, henüz stage edilmemiş değişiklikleri gösterir.
  • Untracked files: Çalışma alanında bulunan ancak Git tarafından henüz izlenmeyen dosyaları gösterir.

git diff, çalışma alanını index ile karşılaştırır. Bu nedenle genellikle henüz stage edilmemiş değişiklikleri görürsün. git diff --staged ise index ile HEAD'i karşılaştırır ve bir sonraki commit'e girecek değişiklikleri gösterir. Aynı dosya hem stage edildikten sonra hem de yeniden düzenlendiyse iki komut farklı değişiklikler gösterebilir.

git restore --staged dosyayı nasıl unstage eder?

Tek bir dosyayı veya belirlediğin birden fazla dosyayı unstage etmek için şu komutları kullanabilirsin:

git restore --staged dosya.txt
git restore --staged dosya1.txt dosya2.txt

--staged seçeneği hedef olarak yalnızca index'i belirler. Başka bir kaynak belirtilmediğinde Git, index içindeki ilgili yolu HEAD'deki durumuyla eşitler. Çalışma alanı hedef olmadığı için dosyanın bilgisayarındaki düzenlenmiş içeriği korunur.

Unstage etmek, değişikliği silmek değil, dosyayı bir sonraki commit'e hazırlanmamış hâle getirmektir.

Örneğin dosya.txt içine ilk değişikliği yaptıktan sonra git add dosya.txt çalıştırdığını düşün. Ardından aynı dosyada ikinci bir değişiklik yapıp yeniden git add çalıştırma. Bu durumda dosyanın ilk değişikliği index içinde, ikinci değişikliği ise yalnızca çalışma alanında bulunur.

Komuttan önce git diff yalnızca ikinci değişikliği gösterir çünkü çalışma alanını index ile karşılaştırır. git diff --staged ise ilk değişikliği gösterir çünkü index ile HEAD arasındaki farkı inceler.

git restore --staged dosya.txt çalıştırıldığında index, bu dosya için HEAD'deki duruma döner. İlk ve ikinci değişiklik çalışma alanında birlikte kalır ve artık ikisi de unstaged görünür. Sonrasında normal git diff iki değişikliği de gösterirken git diff --staged -- dosya.txt o dosya için fark göstermez.

İki takip edilen dosyadan yalnız biri nasıl unstage edilir?

İki takip edilen dosyadan yalnız biri nasıl unstage edilir?

Yalnız rapor.txt dosyasını unstage etmek için git restore --staged rapor.txt yazılır. Birden fazla yolu aynı işlemde çıkarmak için dosya adlarını yan yana ekleyebilirsin. Aşağıdaki Bash örneğinde rapor.txt ve kod.txt ilk commit ile takip edilir, ikisi değiştirilir, yeni notlar.txt stage edilir ve rapor.txt içinde ikinci bir değişiklik yapılır.

set -eu
tmpdir="$(mktemp -d)"
trap 'rm -rf "$tmpdir"' EXIT
cd "$tmpdir"

git init -q
git config user.name "Git Örneği"
git config user.email "[email protected]"

printf '%sn' 'Rapor başlangıcı' > rapor.txt
printf '%sn' 'Kod başlangıcı' > kod.txt
git add rapor.txt kod.txt
git commit -q -m 'İlk commit'

printf '%sn' 'İlk rapor değişikliği' >> rapor.txt
printf '%sn' 'Kod değişikliği' >> kod.txt
printf '%sn' 'Yeni not' > notlar.txt
git add rapor.txt kod.txt notlar.txt
printf '%sn' 'İkinci rapor değişikliği' >> rapor.txt

printf '%sn' 'İşlem öncesi:'
git status --short

git restore --staged rapor.txt notlar.txt

printf '%sn' 'İşlem sonrası:'
git status --short

printf '%sn' 'Normal diff:'
git diff

printf '%sn' 'Staged diff:'
git diff --staged

git restore --staged rapor.txt notlar.txt komutu, belirtilen iki yolun indexteki hazırlığını kaldırır. kod.txt komuta verilmediği için staged kalır. notlar.txt ilk committe bulunmayan yeni bir dosya olduğundan çalışma alanında kalır, ancak indexten çıkınca untracked görünür. --staged yalnızca indexi hedeflediği için çalışma alanındaki dosya içerikleri bu komutla silinmez.

İşlem öncesi beklenen durum

M  kod.txt
A  notlar.txt
MM rapor.txt

MM rapor.txt, dosyada hem staged hem de unstaged değişiklik bulunduğunu gösterir. M  kod.txt yalnızca ilk sütunda değişiklik olduğunu, A  notlar.txt ise yeni dosyanın indexe eklendiğini anlatır.

İşlem sonrası beklenen durum

M  kod.txt
 M rapor.txt
?? notlar.txt

Durum kodlarının iki sütunu

İlk sütun, X, index durumu

M       Indexteki içerik son committen farklı
A       Yeni dosya indexe eklenmiş
boşluk  Index son commit ile aynı
İkinci sütun, Y, çalışma alanı durumu

M       Çalışma alanı indexten farklı
boşluk  Çalışma alanı index ile aynı
??      Dosya indexte bilinmiyor, untracked

İşlemden sonra rapor.txt içindeki ilk staged değişiklik ile sonradan yapılan ikinci değişiklik dosyada kalır. Index son committeki rapor içeriğine döndüğü için bu iki değişiklik birlikte unstaged görünür ve durum kodu  M olur. Git'in kısa durum biçiminde ilk sütun indexi, ikinci sütun çalışma alanını temsil eder.

Diff çıktıları ne gösterir?

git diff, çalışma alanı ile index arasındaki farkı karşılaştırır. Bu örnekte index, rapor.txt için ilk committeki içeriğe döndüğü ve çalışma alanında iki yeni satır bulunduğu için her iki rapor değişikliğini gösterir. git diff --staged ise index ile HEAD arasındaki farkı gösterir; bu aşamada yalnızca kod.txt değişikliği kalır. notlar.txt artık indexte bulunmadığı için normal git diff çıktısında bu dosyanın içeriği yer almaz.

Unstage etmek ile çalışma alanındaki değişikliği silmek nasıl ayrılır?

Unstage etmek, değişikliği yalnızca bir sonraki commit adayından çıkarmaktır. Çalışma alanındaki unstaged değişikliği kaldırmak ise dosyanın kaydedilmemiş içeriğinin üzerine yazabilir. --staged verildiğinde hedef index, flagsiz git restore kullanımında hedef çalışma alanıdır; varsayılan kaynaklar da sırasıyla HEAD ve indextir.

Amaç Önce kontrol et Komut Staging area etkisi Çalışma alanı etkisi
Değişikliği yalnızca commit adayından çıkarmak git status ve git diff --staged git restore --staged dosya.txt Index, varsayılan olarak HEAD ile eşleşir ve staged fark çıkar. Değişmez; unstaged değişiklikler çalışma alanında kalır.
Sonucu ve iki fark katmanını incelemek git status git status, git diff, git diff --staged Değişmez. Değişmez.
Çalışma alanındaki unstaged değişikliği geri almak git status ve git diff git restore dosya.txt Değişmez; indexteki staged içerik korunur. Dosya varsayılan olarak indexteki içerikle eşleştirilir ve kaydedilmemiş değişikliklerin üzerine yazılabilir.

git restore dosya.txt biçiminde kaynak indextir. Bu nedenle staged içerik varsa çalışma alanı doğrudan son committeki hâle değil, staged hâle getirilir. Index değişmediği için staged içerik korunabilir, ancak indexte olmayan kaydedilmemiş çalışma alanı değişiklikleri kaybolabilir.

git reset, git checkout ve git restore komutlarını bağlamdan koparıp eş anlamlı kabul etme. git reset bazı kiplerde branch'in işaret ettiği commit'i, bazı yol kullanımlarında ise indexi etkileyebilir. git checkout dal değiştirme veya dosya geri yükleme bağlamına göre farklı davranır. Bu bölümdeki karar, yalnızca indexi mi yoksa çalışma alanını mı değiştirmek istediğinle ilgilidir.

Uygulamadan önce kısa güvenlik kontrolü

  • git status ile dosyanın staged, unstaged veya untracked durumunu kontrol et.
  • git diff ile henüz stage edilmemiş çalışma alanı değişikliklerini incele.
  • git diff --staged ile commit adayındaki içeriği incele.
  • Çalışma alanındaki içeriği kaldırma kararın net değilse git restore dosya.txt çalıştırma.

Sık Sorulan Sorular

git restore --staged. ne yapar?

git restore --staged ., komutun çalıştırıldığı dizindeki eşleşen yolların indexteki hâlini varsayılan olarak HEAD ile eşleştirir. Böylece bu yolların staged değişiklikleri çıkarılır, çalışma alanındaki dosyalar değiştirilmez. Yeni eklenmiş dosyalar indexten çıkınca untracked olarak görünebilir.

Unstage işlemi mevcut commit geçmişini değiştirir mi?

Hayır. Unstage işlemi indexi değiştirir; mevcut commitleri, HEAD'i veya branch geçmişini değiştirmez. Değişikliklerin commit geçmişine girmesi, daha sonra yeni bir commit oluşturulmasına bağlıdır.

Özetle, önce değişikliğin yalnızca commit adayından mı yoksa çalışma alanından da mı çıkarılacağını belirle; ardından uygun git restore biçimini seç.

Bu içerik aradığın cevabı verdi mi?
Yanıtın, hangi yazıları geliştirmemiz gerektiğini anlamamıza yardımcı olur.
Bu içeriğin üretilmesinde yapay zeka araçlarından destek alınmıştır.

Bu konudan sonra ne okuyabilirsin?

Tüm yazılar

İlgili Eğitimler

Berk Keskin, yazılım geliştirici ve eğitmen
Yazar

Berk Keskin Kimdir?

Yazılıma 12 yaşında başladı; İzmir Ekonomi Üniversitesi'ni bölüm birincisi ve yüksek şeref öğrencisi olarak tamamladı. Bugün yalnızca eğitim vermekle kalmıyor, sektörde aktif olarak yazılım projeleri geliştiriyor ve gerçek dünya deneyimini birebir derslerine taşıyor. Ezberden uzak, mühendislik zihniyetini merkeze alan sürdürülebilir öğrenme sistemleri tasarlayarak sorgulayan, üreten ve problem çözebilen yeni nesil yazılımcılar yetiştiriyor.

Sektörel Deneyim & Projeler

  • Ticarify Entegrasyon Yazılım logosu CEO Ticarify Entegrasyon YazılımPazaryerleri ve e-ticaret sitelerine otomatik e-fatura kesimi, sipariş ve kargo takibi hizmetleri sunan e-Dönüşüm platformunun API mimarisini ve yazılım ekibini yönetmektedir.
  • Benim Düğünüm logosu CEO Benim DüğünümDijital etkinlik ve anı paylaşım platformu.
  • Siberdizayn logosu Yazılım Ekibi Lideri SiberdizaynYüksek anlık oyuncu trafiğine sahip oyun kontrol panelleri ve sunucu altyapıları geliştiren yazılım ekibine liderlik etmektedir.
  • MEDYOGRAFYA 360° Dijital Çözümler logosu Dijital Strateji Lideri MEDYOGRAFYA 360° Dijital ÇözümlerŞirketlerin dijital çözümlerde uzun vadede nasıl ilerlemesi gerektiği ve dijital dönüşüm süreçlerinin yönetilmesine destek olmaktadır.
  • İzmir Ekonomi Üniversitesi logosu Danışma Kurulu Üyesi İzmir Ekonomi ÜniversitesiMezun olduğu üniversitesinde, Bilgisayar Programcılığı bölümünün akademik müfredatını güncel sektör ihtiyaçlarına göre şekillendirmek adına Danışma Kurulu'nda görev almaktadır.
WhatsApp Hemen Ara