Git'te silinen bir dosyayı kaldır


504

Genellikle, bir dosyadaki değişiklikleri silmek için şunları yaparsınız:

git checkout -- <file>

Atmak istediğim değişiklik dosyayı siliyorsa ne olur? Yukarıdaki satır bir hata verir:

error: pathspec '<file>' did not match any file(s) known to git.

Diğer komutları geri almadan bu tek dosyayı hangi komut geri yükler?

bonus puanı: Ayrıca, silmek istediğim değişiklik bir dosya ekliyorsa ne olur ? Bu değişimin nasıl değişmeyeceğini bilmek istiyorum.


1
Değişiklikleri atmak ve unstaging yapmak iki farklı şeydir, hangisini yapmaya çalışıyorsunuz?
Andrew Marshall

1
Bu, bir gönderide iki farklı soru ve problemdir. Bu da cevapları çok fazla ve gereksiz yere kafa karıştırıyor.
David Sopko

Yanıtlar:


779

Eğer etkilerini geri isteyen konum varsayarsak git rm <file>veya rm <file>takip git add -Aveya benzeri bir şey:

# this restores the file status in the index
git reset -- <file>
# then check out a copy from the index
git checkout -- <file>

Geri almak için git add <file>, henüz işlemediğinizi varsayarsak, yukarıdaki ilk satır yeterlidir.


70
--Anahtarıdır. git reset <file>işe yaramıyor, beni buraya getiren de buydu.

2
Neden end-of-options-markeryalnızca silinen dosya durumunda gereklidir?
haridsv

5
@handsv Kesinlikle gerekli değildir (dönüşümlü olarak yapabilirsiniz git reset HEAD <file>, eşdeğerdir), ancak git resetilk argümanını daha önce end-of-options-markerbir dosya adı olarak değil, bir ref adı olarak ele alır . Biraz daha esnek yazılabilir mi? Muhtemelen. Neden olmasın? Muhtemelen sadece geliştiriciler bilir.
twalberg

2
@twalberg git reset filenamesilinmemiş dosyalar için iyi çalışır.
Brian Gordon

1
@AaronMahan - git reset <file>ve arasındaki farkı açıklayabilir misiniz git reset -- <file>? Google'da bunun cevabını bulmakta zorlanıyorum.
Neeraj B.

56

Her iki soru da cevaplandı git status.

Yeni bir dosya eklemeyi denemek için git rm --cached filename.ext

# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#   new file:   test

Bir dosya kullanımının silinmesini kaldırmak için git reset HEAD filename.ext

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

Öte yandan, git checkout --hiçbir zaman değişmeden, sadece aşamalı olmayan değişiklikleri atar.


5
Debian'da git 1.7.2.5'te silinen bir dosyanın ipucunu göremiyorum.
tripleee

git statusAlıntı yapmak güzel ; kullanıcılara şimdi ve bir dahaki sefere kendi kendine yardım etmenin bir yolunu gösterir ve gelecekteki git sürümlerinde bilgi eklenmesi veya güncellenmesi durumunda.
Will Cain

Bu yanlış. "Değişiklikler kararlı olmak" Gördüğünüz şeydir öncegit reset . Sonragit reset , siz "Değişti ama güncellenmiş değil" bkz araçlar görünüşe git yazarların ana dilinde "Değişiklikler sahnelenen değil" hangi. Daha da önemlisi, "git durumu hakkında bildiğiniz her şeyi anlatan" dogma yalan. (Bunun insanların zamanını boşa harcadığını ve işten çıkarılması gerektiğini söyleyen yöneticiler.)
personal_cloud

11

İki sorunuzun cevapları birbiriyle ilişkilidir. İkincisi ile başlayacağım:

Bir dosyayı sahneledikten sonra (genellikle git add, diğer bazı komutlar değişiklikleri de örtülü olarak hazırlasa da git rm) bu değişikliği geri alabilirsiniz git reset -- <file>.

Sizin durumunuzda git rm, dosyayı kaldırmak için kullanmış olmanız gerekir ; bu, dosyayı basitçe kaldırmak rmve daha sonra bu değişikliği hazırlamakla eşdeğerdir . Eğer ilk önce onu bozarsanız, o zaman ile git reset -- <file>kurtarabilirsiniz git checkout -- <file>.


7

Hazırlanmış ve tamamlanmışsa, aşağıdakiler dosyayı sıfırlar:

git reset COMMIT_HASH file_path
git checkout COMMIT_HASH file_path
git add file_path

Bu, daha önce birkaç işlem gerçekleştirilmiş bir silme işlemi için işe yarayacaktır.


1
Daha verimligit revert COMMIT_HASH
Flair

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.