Tek bir dosyayı hazırlama alanından nasıl kaldırabilirim?


1231

Durum: Zaten dizinde olan dosyaları içeren bir Git depom var. Birkaç dosyada değişiklik yapıyorum, Git'i açıyorum ve bu dosyaları "git add" ile aşamalandırma alanına ekliyorum.

Soru: Bu dosyalardan birini hazırlama alanından nasıl kaldırabilirim, ancak dizinden kaldırmam ya da dosyanın kendisindeki değişiklikleri geri almam?


40
Ortaya koyma alanı olduğunu bu yüzden belki de ne demek istediğini tam olarak açıklamak olabilir, endeks?
CB Bailey


Yanıtlar:


1903

Soruyu doğru anlarsam, git addbu dosya için yapılmış olan soruyu "geri almak" istersiniz .

Hazırlama alanından tek bir dosyayı kaldırmanız gerekiyorsa ,

git reset HEAD -- <file>

Bir dizinin tamamını (klasör) hazırlama alanından kaldırmanız gerekiyorsa ,

git reset HEAD -- <directoryName>

Yaptığınız değişiklikler saklanacak. Çalıştırdığınızda git statusdosya bir kez daha değiştirilmiş olarak görünecek, ancak henüz aşamalandırılmayacak.

Ayrıntılar için git resetkılavuz sayfasına bakınız.


41
Teşekkürler ... Bunun sahnelenen dosyaların hemen üstünde olduğunu fark ettim. Sanırım o ekrana uzun zamandır bakıyordum, görmek istediklerimi seçerek seçiyordum.
PHLAK

2
Bu, her yerde aldığım her tavsiyenin aksine (adam sayfaları, burada, arkadaşlar & c) tüm değişikliklerimi etkiliyor. Bir gün reklamı yapılacak şeyi yapacağını düşünüyorum, ama hayır.
rektide

6
Repo için herhangi bir taahhüt alınmadığında dosyaları sahnelemeden kaldırmak için yine de var mı?
Jared Forsyth

3
Bu soruya gelip gelmeye devam ediyorum. Neden daha fazla vuramıyorum? :)
Puce

3
@Jared Forsyth Sahneden hiç işlem yapmayan bir dosyayı kaldırmak için git rm --cached FILE, başka bir yanıtın önerdiği komutu kullanın .
chmike

151
git rm --cached FILE

,

git rm -r --cached CVS */CVS

28
doğru, ama git resetburada kullanmak daha iyi olduğunu düşünüyorum, çünkü --chached seçeneği ommit olabilir ve hemen git rmkomutunu kullanarak üzgün olsun :-) git resetEğer güvenli tarafında, "bazı seçenek" eklemeyi unutursanız günlük kullanım için "daha güvenli" böylece değişiklik tutmak (bahsettiğim git reset --hard).
Konrad 'ktoso' Malawski

20
Daha önce taahhütte bulunmadıysanız bu yöntem yararlıdır.
SomeKittens

2
git rm --cached FILEçalışma ağacından dosya silmeden dosya silme aşamaları. Bu, geri almayla ilgili olan sorudan farklı git add.
Sampo Smolander

1
Bu yanıt, dosyayı çalışma ağacından sildiyseniz bir hata atar.
Samuel Robert

3
git rm --cacheddosyanın dizinden kaldırılmasına neden olur, yani dosya izlenmeyen dosya olur. OP'nin bunu istediği sanmıyorum. Lütfen buradan ilgili bir konuya bakın: stackoverflow.com/questions/45047810/…
smwikipedia

88

git reset <file>

Daha önce herhangi bir taahhüdünüz olsun ya da olmasın çalışır.


53

Yani, Tim Henigan'ın cevabına ufak bir değişiklik: dosya adından önce kullanmanız gerekir. Şöyle görünecektir:

git reset HEAD -- <file>

6
Ne yapar --ve neden ekler? Yaptım git reset HEAD <file>ve işe yaradı.
Paolo

15
--bir çeşit bölücüdür. Dosya adının geleneksel olmaması durumunda, örneğin ( -fveya master) git, dosya adı yerine komut satırı argümanı veya şube adı olarak yorumlayacaktır. Buraya bakınız
Andrew

3
Bu benim için çalıştı - olmadan komutun o dosya için daha önce herhangi bir taahhüt olmadığı için değil. Teşekkürler.
Matt

17
git reset filename.txt

Filename.txt dosyasında bir değişiklik yaptıysanız, yanlışlıkla sahneye eklediniz ve dosyayı hazırlıktan kaldırmak istiyorsunuz ancak değişiklikleri kaybetmek istemiyorsunuz.


6

Dosyanızdaki değişikliklerin bir alt kümesini kaldırmak istiyorsanız, şunları kullanabilirsiniz:

git reset -p

veya

git reset -p <file_name>

Bu komut temelde tersidir git add -p: yalnızca seçilen değişiklikleri hazırlama alanından kaldırır. Yanlışlıkla eklediğim bir şeyin "kaldırılmasında" son derece yararlı buluyorum.


4

Belirli bir kalıbı izleyen dosyaları kaldırmak istiyorsanız ve kullanıyorsanız git rm --cached, dosya glob kalıplarını da kullanabilirsiniz.

Buraya bakın .


2

İstediğiniz:

  • Tek bir dosyayı etkileme

  • Dosyayı hazırlama alanından kaldır

  • Tek bir dosya dizinden kaldırılmıyor

  • Değişikliğin kendisini geri alma

ve çözüm

git reset HEAD file_name.ext

veya

git reset HEAD path/to/file/file_name.ext

2

Bunu yaptığınızda git statusGit size nasıl değişmeyeceğini söyler:

Changes to be committed: (use "git reset HEAD <file>..." to unstage).

Bu yüzden git reset HEAD <file>benim için çalıştı ve değişikliklere dokunulmadı.


2

@CB Bailey'in yorumladığı gibi, muhtemelen indeks kavramı ile karıştırıldığını düşünüyorum :

Evreleme alanı dizindir.

Dizini ve dizini hazırlama işlemini aynı şey olarak düşünebilirsiniz .
Yani, tıpkı @Tim Henigan'ın cevabı gibi , sanırım:

sadece git addbu dosya için yapılmış olanı "geri almak" istersiniz .



İşte cevabım:

Genel olarak, daha önce de belirtildiği gibi, bir sahne operasyonunu geri almanın iki yolu vardır :

git reset HEAD <file>

ve

git rm --cached <file>

Fakat fark nedir?

Dosyanın hazırlandığını ve çalışma dizininde de var olduğunu varsayın, dosyayı hazırlama dizinindengit rm --cached <file> kaldırmak istiyorsanız kullanın ve dosyayı çalışma dizininde tutun . Ama bu işlem yalnızca dosyayı kaldırmak olmaz ihbar evreleme dizine dosyası olarak değil, aynı zamanda işaretlemek içinde dizini evreleme kullanırsanız,deleted

git status

bu işlemden sonra şunu göreceksiniz:

        deleted:    <file>

Bu dosyayı hazırlama dizininden kaldırmanın bir kaydıdır . Bu kaydı saklamak istemiyorsanız ve yalnızca bir dosyanın önceki aşama işlemini geri almak istiyorsanız,git reset HEAD <file> bunun yerine kullanın.


-------- CEVAP SONU --------

Not: Belirtilen bazı cevapları fark ettim:

git checkout -- <file>

Bu komut, dosyanın sahnelenen , ancak dosya modifiye edilmiş çalışma dizini o dosyayı geri yüklemek için bu işlemi kullanın sahnelenen sonra çalışma dizini gelen dizini evreleme . Başka bir deyişle, bu işlemden sonra , hazırlama dizininizde DEĞİL, çalışma dizininizde değişiklikler olur .


2

Sürümden sonra 2.23Sürümden Git, git restorebunu yapmak için kullanabileceğiniz komutu tanıttı . Resmi belgelerin alıntılanması:

Geri yükleme kaynağından bazı içeriklerle çalışma ağacında belirtilen yolları geri yükleyin. Bir yol izlenir, ancak geri yükleme kaynağında yoksa, kaynakla eşleşecek şekilde kaldırılır.

Komut ayrıca dizindeki içeriği ile geri yüklemek için de kullanılabilir. --staged geri yüklemek veya hem çalışma ağacını hem de--staged --worktree .

Böylece git restore --staged <path>dosyayı çağırabilir ve dosyayı kaldırabilirsiniz ancak yaptığınız değişiklikleri de saklayabilirsiniz. Dosya hazırlanmadıysa, dosyada yaptığınız tüm değişiklikleri kaybedeceğinizi unutmayın.


1

İzlenen birçok dosyada değişiklik yapar ancak bunlardan yalnızca birkaçını sahnelemek istiyorsanız,

git add .

her zaman elverişli değildir (veya önerilmez) - izlenen tüm dosyaları hazırladığı için (değişiklikleri yalnızca kendinizde tutmak istediğiniz ve bunları uzak depoya yerleştirmek istemediğiniz bazı durumlar).

ne de bir demet yapmak ideal değil

git add path/to/file1 path/to/file2

iç içe geçmiş dizinleriniz varsa (çoğu projede durum budur) - sinir bozucu olur

İşte o zaman Git GUI yardımcı olur (muhtemelen sadece onu kullandığım zaman). Git GUI'yi açmanız yeterlidir, aşamalı ve işaretsiz dosya bölümlerini gösterir. Çıkarmak istediğiniz aşamalı bölümden dosyaları seçin ve düğmesine basın.

Ctrl+U (pencereler için)

onları tedirgin etmek.


1

Git'in daha yeni sürümleri için git restore --staged <file> .

git statusGit sürümü ile bir yaptığımda 2.26.2.windows.1da unstaging için önerilir:

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)

( Bu yayın, önceki sürümlerde git reset HEADbu noktada önerildiğini gösteriyor)

Hangi tavsiye bu arasındaki farkları açıklayan yazıyı git revert, git restoreve git resetiçin ve ayrıca ek parametreler git restore.


0

Benim örnek:

$ git status
On branch feature/wildfire/VNL-425-update-wrong-translation
Your branch and 'origin/feature/wildfire/VNL-425-update-wrong-translation' have diverged,
and have 4 and 1 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    modified:   ShopBack/Source/Date+Extension.swift
    modified:   ShopBack/Source/InboxData.swift
    modified:   ShopBack/en.lproj/Localizable.strings

Fark edebileceğiniz gibi

> Changes to be committed:
>       (use "git reset HEAD <file>..." to unstage)

-1

Dosyanın dizininde olmanız ve daha sonra terminale aşağıdakileri yazmanız gerekir

git reset HEAD .

Varsayım, yalnızca bir dosyayı sıfırlamanız gerektiğidir.



-10

git checkout -- <file>

Hazırlama Alanından dosyaları kaldırmak için mükemmel çalışır


4
aşağıda belirtildiği gibi, bu, dosyadaki değişiklikleri geri alır ve bu da OP'nin gitmek istediğinden bir adım daha ileri gider.
stolli

git rm flie.txt
Juan Ramirez

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.