Kabul edilen cevaba ek olarak, yanlışlıkla eklenen dosyanız çok büyükse, muhtemelen ' git reset
' ile dizinden çıkardıktan sonra bile .git
dizinde yer işgal ettiğini göreceksiniz .
Bu endişelenecek bir şey değil; dosya gerçekten de hala depoda, ama sadece "gevşek bir nesne" olarak. Diğer depolara kopyalanmayacak (klon, itme yoluyla) ve alan belki de çok yakında olmasa da sonunda geri kazanılacak. Endişeli iseniz, şunları yapabilirsiniz:
git gc --prune=now
Güncelleme (aşağıdaki, en çok oylanan cevaplardan kaynaklanabilecek karışıklığı giderme girişimimdir):
Gerçek Yani, geri alma ait git add
?
git reset HEAD <file>
?
veya
git rm --cached <file>
?
Kesinlikle konuşmak gerekirse ve eğer yanılmıyorsam: hiçbiri .
git add
Geri alınamayanGenel .
Önce git add <file>
gerçekte ne yaptığını hatırlayalım :
Eğer <file>
edilmiştir daha önce izlenmeyen , git add
cache ekler bugünkü içeriğiyle.
Eğer <file>
edildi zaten izlenir , git add
güncel içerik kaydeder önbelleğe (enstantane, sürüm). Git'te, bu eyleme yine de add adı verilir (sadece güncellemez ), çünkü bir dosyanın iki farklı sürümü (anlık görüntüleri) iki farklı öğe olarak kabul edilir: dolayısıyla, sonunda önbelleğe gerçekten yeni bir öğe ekliyoruz sonra taahhüt.
Bunun ışığında, soru biraz belirsiz:
Yanlışlıkla komutu kullanarak dosya ekledim ...
OP'nin senaryosu ilk (izlenmemiş dosya) gibi görünüyor, "geri al" ın izlenen öğelerden dosyayı (yalnızca geçerli içeriği değil) kaldırmasını istiyoruz. Eğer durum böyle ise, o zaman çalıştırmak için Tamam git rm --cached <file>
.
Ve biz de koşabiliriz git reset HEAD <file>
. Bu genellikle tercih edilir, çünkü her iki senaryoda da çalışır: zaten izlenen bir öğenin sürümünü yanlış eklediğimizde de geri alır.
Ama iki uyarı var.
Birincisi: (cevapta belirtildiği gibi), çalışmayan yalnızca bir senaryo var git reset HEAD
, ancakgit rm --cached
yeni bir havuz (taahhüt yok) . Ama, gerçekten, bu pratik olarak alakasız bir durum.
İkincisi: git reset HEAD
Önceden önbelleğe alınan dosya içeriğini sihirli bir şekilde kurtaramayacağının farkında olun , sadece HEAD ile yeniden senkronize eder. Yanlış yönlendirilmiş git add
bir önceki aşamalı taahhütlü olmayan sürümün üzerine yazmışsa, onu kurtaramayız. Bu yüzden, kesinlikle, [*] 'i geri alamayız.
Misal:
$ git init
$ echo "version 1" > file.txt
$ git add file.txt # First add of file.txt
$ git commit -m 'first commit'
$ echo "version 2" > file.txt
$ git add file.txt # Stage (don't commit) "version 2" of file.txt
$ git diff --cached file.txt
-version 1
+version 2
$ echo "version 3" > file.txt
$ git diff file.txt
-version 2
+version 3
$ git add file.txt # Oops we didn't mean this
$ git reset HEAD file.txt # Undo?
$ git diff --cached file.txt # No dif, of course. stage == HEAD
$ git diff file.txt # We have irrevocably lost "version 2"
-version 1
+version 3
Tabii ki, sadece yeni dosyalar eklemek için 'git add' yapmanın her zamanki tembel iş akışını takip edersek ve çok yeni bir içeriği, exec, git commit -a
komutu ile güncellersek, bu çok kritik değildir .
Düzenle
HEAD
veyahead
artık kullanabileceğiniz tüm cevaplar . Bkz bu cevabı (son bölüm) bunu yapabilir nedenini öğrenmek için.@
HEAD