“Git rm --cached x” vs “git reset head - x”?


163

GitRef.org - Temel :

git rmgiriş alanından girdileri kaldırır. Bu, git reset HEAD"eğilimler" dosyalarından biraz farklıdır . "Dengesizlik" derken, bir şeyleri değiştirmeye başlamadan önce hazırlama alanını orada olana döndürür. git rmÖte yandan dosyayı tamamen sahneden çıkarır, böylece bir sonraki taahhüt görüntüsüne dahil edilmez, böylece etkili bir şekilde silinir.

Varsayılan olarak, a git rm filedosyayı hazırlama alanından tümüyle ve diskinizden çıkarır> (çalışma dizini). Dosyayı çalışma dizininde bırakmak için kullanabilirsiniz git rm --cached.

Ama git rm --cached asdve arasındaki fark tam olarak git reset head -- asdnedir?

Yanıtlar:


219

Örneğin, bir dosyanın olabileceği üç yer vardır: ağaç, dizin ve çalışan kopya. Bir klasöre sadece bir dosya eklediğinizde, dosyayı çalışma kopyasına eklersiniz.

Böyle bir şey yaptığınızda git add file yaptığınızda dizine ekleyin. Ve taahhüt ettiğinizde, ağaca da eklersiniz.

Git reset'teki üç yaygın bayrağı daha bilmenize yardımcı olacaktır:

git reset [- <mode>] [ <commit>]

Bu form mevcut şube başkanı sıfırlar <commit>ve muhtemelen endeksi (ağacının sıfırlayarak günceller <commit>) ve çalışma ağaç bağlı<mode> aşağıdakilerden biri olması gereken :
--soft

Dizin dosyasına veya çalışma ağacına hiç dokunmaz (ancak başlığı <commit> tüm modlarda olduğu gibi ). Bu, git durumunun belirteceği gibi, değiştirilen tüm dosyalarınızı "Yapılması gereken değişiklikler" olarak bırakır.

--karışık

Dizini sıfırlar ancak çalışma ağacını sıfırlamaz (yani, değiştirilen dosyalar korunur ancak kesinleştirme için işaretlenmez) ve güncellenmeyenleri bildirir. Bu varsayılan eylemdir.

--zor

Dizin ve çalışma ağacını sıfırlar. O zamandan beri çalışma ağacında izlenen dosyalarda yapılan değişiklikler<commit> atılır.

Şimdi, böyle bir şey git reset HEADyaptığınızda - aslında yaptığınız şey git reset HEAD --mixed, dizini, dosya eklemeye / dizine değişiklikler eklemeye başlamadan önceki durumuna "sıfırlayacaktır" (üzerinden git add) Bu durumda, çalışma kopyalama ve de dizin (veya evreleme) senkronize edildi, ancak HEAD ve dizinin sıfırlamadan sonra senkronize olmasını sağladınız.

git rmÖte yandan, bir dosyayı çalışma dizininden ve dizinden kaldırır ve işlem yaptığınızda dosya ağaçtan da kaldırılır. git rm --cachedancak dosyayı yalnızca dizinden kaldırır ve çalışma kopyanızda tutar. Bu durumun tam tersidir. git add file Bu durumda, HEAD ve çalışmadan farklı olması için indeks yaptınız, HEAD'ın dosyanın daha önce işlenmiş versiyonuna sahip olması, çalışma kopyasının HEAD dosyayı ve dizinden kaldırdınız. Şimdi bir taahhüt, dizin ve ağacı senkronize eder ve dosya kaldırılır.


Ben sonra fark komut herhangi diff ama göstermiyor , gösterileri fark hala önbelleğe sanki. Ancak varlık olarak dosyayı gösterir . Biraz tutarsız görünüyor. git rm --cachedgit diffgit diff --cachedgit statusUntracked
haridsv

7
Boş ver ... Ben kullanmalıydım git reset --mixed. Tam git rm --cachedtersi bir açıklama ile biraz kafam karıştı git add. Kelimenin tam anlamıyla alındığında, yanlış ve hasara neden olabilir. Benim durumumda, git addhazırlama alanına değiştirilmiş bir dosya eklemek için kullanılır ve dosyanın ilk eklenti değil "bu eklemek" tersini istedim. + Greg Hewgill'in yanıtı daha net bir resim elde etmeme yardımcı oldu.
haridsv

12
Çalışan kopya, ağaç ve çalışma ağacının kullanımını biraz kafa karıştırıcı buluyorum. Çalışan ağaç çalışan kopya mı yoksa ağaç mı?
Nealv

3
@Haridsv'in belirttiği gibi, git rm --cached'tam tersi git add file' demek yanıltıcıdır. git reset filetam tersi olmaya daha yakın git add file.
Matt Browne

@Nealv gecikti, ancak bu konuyu bulan başkaları için: çalışma kopyası, ağaç ve çalışma ağacı aynı şeyi ifade eder (git bağlamında).
De Novo

83

Belki bir örnek yardımcı olacaktır:

git rm --cached asd
git commit -m "the file asd is gone from the repository"

karşı

git reset HEAD -- asd
git commit -m "the file asd remains in the repository"

Başka bir şey değiştirmediyseniz , ikinci işlemin aslında hiçbir şey yapmayacağını unutmayın.


3
HEAD'den sonra bu çift kısa çizginin ne anlama geldiğini söyleyebilir misiniz?
yuva

30
@yuva: --Komut seçeneklerini dosya adlarından ayırmak için kullanılır. Bir ikisi olsaydı şube ve bir dosya adı asd, daha sonra git reset HEAD asdbelirsiz olacaktır. --"Her şey şu bu dosya adıdır" diyor.
Greg Hewgill

git reset HEAD <file>Tam olarak git rm --cached <file>ve sonra aynı mı git add --intent-to-add <file>?
alkol kötüdür

1
@alcoholisevil no, özel bir durum hariç. Bkz bu mükemmel, özlü bir cevap.
De Novo

45

git rm --cached fileolacaktır kaldırmak sahneden dosyayı. Yani, taahhüt ettiğinizde dosya kaldırılacaktır. git reset HEAD -- fileyalnızca hazırlama alanındaki dosyayı HEAD taahhüdünde olduğu duruma sıfırlar, yani son işlemden bu yana yaptığınız değişiklikleri geri alır. Bu değişiklik dosyayı yeni ekliyorsa, eşdeğer olacaktır.


7
Bunun git rm --cached filetam tersi olan (diğer cevaplarda belirtildiği gibi) kavramı ile birlikte git add, bu cevap bana çok mantıklı geldi ve oldukça kısa ve özdü. Neredeyse bu yorum kadar kısa;)
rbatt

2
@rbatt sadece yorumu buraya koymak ve açıklığa kavuşturmak git rm --cached filetam tersi değildirgit add file . Davranış git add file, daha önce izlenmemiş yeni bir dosya eklediğiniz özel durumun tersi olur . Diğer her durumda bunun tam tersi git add fileolur git reset HEAD file. git reset HEAD fileayrıca git add fileilk durumda (izlenmeyen bir dosya ekleyerek) ve her durumda tersine döner , bu nedenle git eklentisini tersine çevirmek istiyorsanız git'in önerdiği şey budur.
De Novo
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.