Kabul edilen cevaba ek olarak, yanlışlıkla eklenen dosyanız çok büyükse, muhtemelen ' git reset' ile dizinden çıkardıktan sonra bile .gitdizinde 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 addbir ö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 -akomutu ile güncellersek, bu çok kritik değildir .
Düzenle
HEADveyaheadartık kullanabileceğiniz tüm cevaplar . Bkz bu cevabı (son bölüm) bunu yapabilir nedenini öğrenmek için.@HEAD