Git'teki dizinden bir dosya nasıl kaldırılır?


356

Bir dosyayı dosya sisteminden kaldırmadan dizinden (= hazırlama alanı = önbellek) nasıl kaldırılır?


5
"Dosyayı daha fazla istemediğim için" daha önce orada olanlara sıfırla "veya" sil "demek istiyor musunuz?
Andrew Aylett

Benim durumumda aynı çünkü dosya daha önce yoktu ...
hcs42

Yanıtlar:


507

İstediğiniz:

git rm --cached [file]

--cachedSeçeneği atlarsanız , çalışma ağacından da silinir. git rmbiraz daha güvenlidir git resetşube ucu veya diskteki dosya ya uymuyor içeriği sahnelenen eğer uyardı duyarız çünkü. (Yoksa, eklemeniz gerekir --force.)


8
Bu, örneğin, .gitignore'unuza yapmayan bazı derleme aralarında veya yerel yapılandırma dosyalarında yanlışlıkla kontrol ettiyseniz de harika çalışır; kullanmak git rm --cached, repo bunları kaldırmak için .gitignore, aşamayla alakalı dosya veya klasör ekleyebilir ve normal olarak işlemek. Depodan gidecekler, ancak yerel ağacınızda dokunulmadan kalacaklar ve yanlışlıkla tekrar kontrol edemeyeceksiniz.
Ionoclast Brigham

22
Bu işlem, yürüttükten ve zorladıktan sonra dosyayı repo'dan (uzak) da siler.
toz366

6
Bu, dizinden kaldırmaz, ancak dizinde silinmiş olarak işaretler.
JotaBe

4
Bu yanıt büyük olasılıkla yanlıştır, çünkü amaçlanan sonuç olmayan bir dosyayı depodan kaldırır (daha önce belirtildiği gibi @ powder366).
otomobili

1
Bu çözüm benim için işe yaramadı. Belirtilen dosyayı silindi olarak işaretler ve ardından yerel repodan kaldırır.
paiego

134

Bu sizin için <dosya> 'yı bozar (dosyayı kaldırmadan veya başka bir şekilde değiştirmeden):

git reset <file>

6
Bu, belirli bir dosya için en son değişikliği kaldırır, ancak taahhüt ve push işleminden sonra dosyayı repoda (uzak) tutar.
toz366

1
Aradığım cevap buydu. Belirtmek zorunda olmadığınızı unutmayın HEAD.
Michael Dorst

İyi nokta @MichaelDorst. Cevabı atlamak için güncelledim HEAD!
David Underhill

3
git reset HEAD <file> 

belirli bir dosyayı dizinden kaldırmak için.

ve

git reset HEAD

dizine eklenen tüm dosyaları kaldırmak için.


1

İş akışınıza bağlı olarak, bu, bir komut satırı çözümünü anlamaya çalışmak için çok az bir noktaya sahip olmanız için nadiren ihtiyaç duyduğunuz türden bir şey olabilir (herhangi bir nedenle grafik arabirim olmadan çalışmadığınız sürece).

Dizin yönetimini destekleyen GUI tabanlı araçlardan birini kullanın, örneğin:

  • git gui <- Tk pencereleme çerçevesini kullanır - gitk
  • git cola <- daha modern bir GUI arayüzü

Bunlar, dosyaları tıkla ve dizine göre dizinin içine ve dışına taşımanıza izin verir. Hatta bir dosyanın bölümlerini (bireysel değişiklikler) seçerek dizinden taşımak için desteğe sahiptirler.


Farklı bir bakış açısına ne dersiniz: Önerilen, şifreli komutlardan birini kullanırken karışıklık yaşarsanız:

  • git rm --cached [file]
  • git reset HEAD <file>

... veri kaybetme ya da en azından bulmayı zorlaştırma şansınız var. Bunu çok yüksek sıklıkta yapmanız gerekmedikçe, bir GUI aracı kullanmak daha güvenli olacaktır .


Dizin olmadan çalışma

Yorumlara ve oylara dayanarak, birçok insanın endeksi her zaman kullandığını fark ettim. Yapmıyorum. Bunu nasıl yapacağınız aşağıda açıklanmıştır:

  • Tüm çalışma kopyamı taahhüt et (tipik durum): git commit -a
  • Yalnızca birkaç dosya kaydedin: git commit (list of files)
  • Tüm ancak birkaç modifiye dosyaları işlemek: git commit -ao zaman değiştirebilir yoluylagit gui
  • Çalışan kopyadaki tüm değişiklikleri grafik olarak inceleyin: git difftool --dir-diff --tool=meld

@Martin: Sanırım iş akışınıza bağlı. Yaklaşımımda asla endeksi doğrudan kullanmam. İşimi kaydetmek istediğimde, sadece tam taahhütte bulunuyorum git commit -a. Bu soruyu cevaplarken, sizin için dosyaları dizine koyan (egzotik) bir " ters kiraz toplama " yapmıştım, ancak taahhütte bulunmadan önce bir dosyayı düzenlemek istedim. Dosyayı dizinden çıkardığımda farklı bir şekilde alıştığım şekilde çalışmasını sağladım.
nobar

benim kullanım durumum çok dar ve işe yaramazdı: bir şube oluşturmak; yalnızca dal için dosyalarla dolu klasör ekleyin; ustaya geç; birleştirmek; ops, master için yanlış klasör eklendi, gitignore'a ekleyin; dosyalar taahhütten kaldırılmayacaktı, daha iyi bir çözüm sadece hemen kullanacaktı, rmancak ilk olarak şubeleri değiştirmenin göz ardı edilen klasörü öldürmeyeceğini düşündüm . ama ... benim için yeterince iyi olan github "gui tabanlı" aracını kullanıyorum ve bunu desteklemediği sürece bazı dizin yönetimini destekliyorum. peki, dar kullanım için 2 gui kullanmalıyım? hala cevap ile anlaşamıyorlar.
cregox

3
Bu kesinlikle popüler olmayan bir cevaptır. Ancak, önerdiğim yaklaşımın bazı insanlar (kendim dahil) için doğru olduğundan eminim. Dizini yılda birkaç kez değiştirmek için bu araçlardan birini kullanıyorum.
nobar

1
Günümüzde programlama editörleri ve IDE'lerin grafik indeks manipülasyonunu desteklemesi muhtemeldir. En azından GitHub'ın Atomu öyle.
nobar

1
Daha tehlikeli olmasına rağmen her gün GUI üzerinden bir cli arayüzü tercih ediyorum. Rahatlatıcı bulduğum gui olmadan bile git kullanmama izin verecek (örneğin, uzak bir sunucuya bu tür araçları yükleyemediğimde kaybolmak yerine). Bütün bunlar bu cevabın mükemmel bir şekilde geçerli olduğunu ve "kli elitist" iniş vekillerini hak etmediğini, +1 iyi bir gui-alternatifi sağladığı için!
SidOfc
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.