git: yeni dosyalar dahil tüm çalışma dir değişikliklerini geri al


1151

İzlenmeyen yeni dosyalar da dahil olmak üzere çalışma dizinindeki tüm değişiklikler nasıl silinir. Bunu biliyorum git checkout -f, ama son işlemden bu yana oluşturulan yeni izlenmemiş dosyaları silmez.

Bunun nasıl yapılacağı hakkında bir fikri olan var mı?


1
@Joel & Wayfarer: neden denemiyorsun git help resetvegit help clean
SHernandez

3
Git yapılandırmanızda bunun için bir takma ad oluşturmak iyi bir fikirdir;)
anubina

Yanıtlar:


1699
git reset --hard # removes staged and working directory changes

## !! be very careful with these !!
## you may end up deleting what you don't want to
## read comments and manual.
git clean -f -d # remove untracked
git clean -f -x -d # CAUTION: as above but removes ignored files like config.
git clean -fxd :/ # CAUTION: as above, but cleans untracked and ignored files through the entire repo (without :/, the operation affects only the current directory)

Önceden nelerin silineceğini görmek için, onu gerçekten silmeden, -nbayrağı kullanın (bu temel olarak bir test çalıştırmasıdır). Silmeye hazır olduğunuzda, -nbayrağı kaldırın :

git clean -nfd


16
Not: git reset --hard, çalışma dizini değişikliklerinin yanı sıra aşamalı değişiklikleri de kaldırır. Ayrıca, git clean -f -d, yeni bir izlenmemiş dosya eklemenin muhtemelen daha iyi bir tersidir. Sorudan, asker mevcut göz ardı edilen dosya kümesinden oldukça mutlu olabilir.
CB Bailey

7
Bir sonraki cevabı okuyun ve -x anahtarından dikkat edin. (Parola / db-ayarları dosyaları gibi yerel yapılandırmanızı da kaldırabilir. Örn. Database.yml)
Boris

9
Bu -x anahtarı gereksiz ve bu durumda biraz tehlikeli.
Tim Gautier

66
git clean -fxdne yaptığınızı bilmiyorsanız gerçekten tehlikeli olabilir. Sonunda, veritabanınız vb. Gibi iz bırakmayan bazı önemli dosyaları kalıcı olarak silebilirsiniz. Dikkatli olun.
Mason Stewart

10
git clean -f -dDosyaların yok sayılan klasörlerden de silineceğini unutmayın . Böylece tüm yerel günlükler ve bunun gibi şeyler yok olacak. Genellikle büyük bir sorun değildir, ancak bilmek daha iyidir.
cyriel

299

Sık kullandığım en güvenli yöntem:

git clean -fd

/docs/git-cleanSayfa başına sözdizimi açıklaması :

  • -f(takma ad:) --force. Git yapılandırma değişkeni clean.requireForce, false değerine ayarlanmazsa git clean, -f, -n veya -i belirtilmedikçe dosyaları veya dizinleri silmeyi reddeder. Git, ikinci bir f belirtilmezse, .git alt dizini veya dosyası olan dizinleri silmeyi reddeder.
  • -d. İzlenmemiş dosyalara ek olarak izlenmeyen dizinleri kaldırın. İzlenmeyen bir dizin farklı bir Git deposu tarafından yönetiliyorsa, varsayılan olarak kaldırılmaz. Böyle bir dizini gerçekten kaldırmak istiyorsanız -f seçeneğini iki kez kullanın.

Yorumlarda belirtildiği gibi, git clean -ndkuru bir çalışma yapan ve gerçekten silmeden önce neyin silineceğini söyleyen bir işlem yapmak tercih edilebilir.

Bağlantı git cleandoc sayfa: https://git-scm.com/docs/git-clean


124
Ben her zaman daha git clean -nd .önce aslında kullanarak dosyaları silmekgit clean -fd .
tbear

14
Neden? Detayı açıklayabilir misiniz lütfen.
Greg B

31
Başına git temiz -n seçeneği sadece ne yapılacağını gösterir, aslında bir şey kaldırmaz kuru bir koşu.
RNickMcCandless

2
@tbear, Daha önce her zaman boş bir add -A+ commit -a+ yapabilirsiniz . Her bir silme işlemini incelemek, büyük senaryolar için ölçeklendirilmez. Ayrıca, kuru koşu gümüş bir kurşun değildir: gözden geçirme sırasında bir şey kaçırırsanız veya hata yaparsanız ne olur ? revert headgit clean
Pacerier

1
Bu, dosyaları kaldırır, ancak değişiklikleri geri almaz.
donquixote

202

Tüm etiketsiz dosyalar için şunu kullanın:

git checkout -- .

.Sonunda önemlidir.

Sen değiştirebilirsiniz .projenizin yalnızca belirli bir alt dizini temizlemek için bir alt dizin adı olan. Sorun özellikle burada ele alınmaktadır .


7
@Vincent: -, ödeme komutuna başka parametre belirtilmediğini bildirerek yazım hatalarını önler. Onlar olmadan mevcut şubeyi sıfırlamak yerine yeni bir dalla sonlandırabilirsiniz!
Igor Rodriguez

2
Bu en güvenli yoldur, ancak izlenmeyen dosyaları (yeni eklenen dosyalar) kaldırmaz.
TinkerTenorSoftwareGuy

5
Bu, silinmiş ancak henüz taahhüt edilmemiş dosyaları geri yüklemez.
Cerin

Sadece FYI. Bunu özledim. İşaretlenmemiş değişiklikleri silmek istediğiniz dizinde olduğunuzdan emin olun. Örneğin, bir daldaki farklı konumlarda 2 farklı dosyada değişiklik vardı, yani: src/app/work/filename.jsve ../app/working/test/filename.js. Sadece git checkout -- .şube kullanarak sadece ilk dosyayı sildi ( önde ../ olmadan ). Bu nedenle cd ../, bu komutu kullanarak ikinci dosyayı silmek için ikinci konum dizinine çıkmak zorunda kaldım .
Chris22

57

git cleanKomuta bir göz atın .

git-clean - İzlenmemiş dosyaları çalışma ağacından kaldır

Geçerli dizinden başlayarak sürüm denetimi altında olmayan dosyaları yinelemeli olarak kaldırarak çalışma ağacını temizler.

Normalde, yalnızca git tarafından bilinmeyen dosyalar kaldırılır, ancak -x seçeneği belirtilirse, yok sayılan dosyalar da kaldırılır. Bu, örneğin, tüm yapı ürünlerini kaldırmak için yararlı olabilir.


Denedim git clean -ive "temiz" menüsünden seçti - bu nihayet yeni dosyaları kaldırıldı.
Sany

43

Aşağıdaki işler:

git add -A .
git stash
git stash drop stash@{0}

Bunun hem etiketsiz hem de aşamalı yerel değişikliklerinizi sileceğini lütfen unutmayın. Bu komutları çalıştırmadan önce saklamak istediğiniz her şeyi yerine getirmelisiniz.

Tipik bir kullanım örneği: Çok sayıda dosya veya dizin taşıdınız ve orijinal durumuna geri dönmek istiyorsunuz.

Kredi: https://stackoverflow.com/a/52719/246724


1
Neden sadece stash @ {0} yerine başvuruyorsunuz git stash drop?
maikel

Dürüst olmak gerekirse, hatırlamıyorum :)
donquixote

Bu işe yaradı. Not olarak, giriş dizininde ( git add -A .) olduğunuzdan emin olun . Dosya eşleşmesi olmadığı için 30m kaybettim. Teşekkürler!
user9869932

Eskiden bu yaklaşımı kullanırdım ve haklı. Ancak, o zamandan beri jfountain ve Heath Dutton tarafından önerilen çözümleri orijinal sorun olan IMHO'ya daha uygun buldum.
HeyZiko

2
git stash drop stash @ {0} git stash yaparsanız son
stash'ı düşürürse,

42

Bunu iki adımda yapabilirsiniz:

  1. Değiştirilmiş dosyaları geri alma: git checkout -f
  2. İzlenmemiş dosyaları kaldırın: git clean -fd

3
+1 çünkü basit. Ayrıca çalıştığı ve OP'nin tam olarak ne istediğini omg ile korkutmadan yaptığı için bu her şeyi silecektir.
geekzster

30

Düşündüm ki o ( uyarı: Aşağıdaki edecek herşeyi silip )

$ git reset --hard HEAD
$ git clean -fd

resetDeğişiklikleri geri almak. cleanHerhangi izlenmeyen kaldırmak için f iles ve d irectories.


Bu işe yaramaz, git pulldaha sonra yaparken hala bir çakışma uyarısı CONFLICT (content): Merge conflict in...alıyorum : Bunu sadece birgit pull --strategy=ours
rubo77 ile çözdüm

7
git reset --hard origin/{branchName}

İzlenmeyen tüm dosyaları silecektir.


4

git clean -iönce silinecek öğeleri gösterir ve onayınızdan sonra devam eder. Yanlışlıkla silinmemesi gereken önemli dosyalarla uğraşırken bunu yararlı buluyorum.

git help cleanDiğer bazı yararlı seçenekler de dahil olmak üzere daha fazla bilgi için bkz .


4

Tüm değişiklikleri silmek istiyorsanız içindeki bir diğer adda geçerli seçeneklerden herhangi birini kullanabilirsiniz .gitconfig. Örneğin:

[alias]
    discard = "!f() { git add . && git stash && git stash drop stash@{0}; }; f"

Kullanımı: git discard


1
Ben çok beğeniyorum Bu takma adı
bayrakları

3

Alternatif bir çözüm, değişiklikleri taahhüt etmek ve daha sonra bu taahhütlerden kurtulmaktır. Bunun ilk başta anında bir yararı yoktur, ancak parçalar halinde iş yapma ve yedekleme için bir git etiketi oluşturma olanağını açar.

Mevcut dalda bunu yapabilirsiniz, şöyle:

git add (-A) .
git commit -m"DISCARD: Temporary local changes"
git tag archive/local-changes-2015-08-01  # optional
git revert HEAD
git reset HEAD^^

Ya da müstakil KAFA üzerinde yapabilirsiniz. (BRANCHNAME şubesinde başladığınızı varsayarsak):

git checkout --detach HEAD
git add (-A) .
git commit -m"DISCARD: Temporary local changes"
git tag archive/local-changes-2015-08-01  # optional
git checkout BRANCHNAME

Ancak, genelde yaptığım şey parçalara ayırmak, sonra da bazı veya tüm taahhütleri "DISCARD: ..." olarak adlandırmaktır. Sonra kötü taahhütleri kaldırmak ve iyi olanları tutmak için etkileşimli rebase kullanın.

git add -p  # Add changes in chunks.
git commit -m"DISCARD: Some temporary changes for debugging"
git add -p  # Add more stuff.
git commit -m"Docblock improvements"
git tag archive/local-changes-2015-08-01
git rebase -i (commit id)  # rebase on the commit id before the changes.
  # Remove the commits that say "DISCARD".

Bu daha ayrıntılıdır, ancak hangi değişiklikleri silmek istediğinizi tam olarak gözden geçirmenizi sağlar.

git lolVegit lola kısayolları bu iş akışıyla çok yararlı olmuştur.


3

Kullandığım belirli bir klasör için:

git checkout -- FolderToClean/*

3
OP'nin belirttiği gibi izlenmeyen dosyaları silmez.
vonbrand

0

Bu muhtemelen bir noob cevabı, ama: Windows için TortoiseGit kullanın ve REVERT adlı güzel bir özelliği var. Bu nedenle, yerel yüklenmemiş sürüklenmemiş değişikliklerinizi geri almak için yaptığınız şey:

  1. gereken klasör için bir bağlam menüsü getirin ve geri döndür'ü seçin, geri döndürmek / kurtarmak için değiştirilmiş dosyaları seçebileceğiniz bir geri döndürme açılır penceresi gösterir.
  2. Ayrıca (henüz git'te bulunmayan) eklenmiş dosyaları da silmek istiyorsanız, exec komutunu (aynı bağlam menüsünden) tıklatın, Command açılır penceresini açar ve size eklenmiş dosyaları gösterir, ardından her birini sağ tıklatıp sil'i seçin. Ancak taahhüt yapmak istemediğiniz için bu açılır pencerede Tamam btn tuşuna basmayın, ancak yalnızca eklenmiş dosyaları görün ve buradan silin.
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.