Yalnızca belirli dosyaları nasıl kaldırırım?


386

Değişikliklerimi sakladım. Şimdi sadece bazı dosyaları saklamak istiyorum. Bunu nasıl yapabilirim?


4
Sanırım bütün zulayı uygulamalısın, ama sonra tekrar zulası seçebilirsin.
Richard

4
@AbdouTahiri Zula ile ilgili sorun nedir?
alex

32
@AbdouTahiri Uhhhh .. git stash yasal bir özellik ve son derece kullanışlı. Her gün kullanıyorum. Diyelim ki, bir iş arkadaşım bir şeyi incelemem gerekiyor ama karmaşık bir değişiklik setinin ortasındayım. Dalları değiştirebilmem için bir yığın kırık kod işlemeyeceğim. Ben saklamak, dalları değiştirmek, gözden geçirmek, geri dönmek, untash gidiyorum. Git stash'ın "tavsiye edilmediği" kim veya neden olduğu üzerinde durmak ister misiniz? Çünkü senin git zulası geçmişi kadar bulandırdı ve okunması zor değil ortalama herkes birinin olduğunu yapar. Dağınık git zulası seti Git'in bir kusuru değil, sadece kötü bir iş akışıdır.
dudewad

6
@alex Hiçbir şey. Git stash ile ilgili bir sorun yok. Kullanmaya devam edin.
dudewad

Yanıtlar:


461

Gibi aşağıda belirtilen ve ayrıntılı " nasıl bir git zulası gelen tek bir dosya (veya dosyada değişiklik) ayıklamak ki? ", Sen kullanımını uygulayabilir git checkoutveya git showbelirli bir dosyayı geri yüklemek için.

git checkout stash@{0} -- <filename>

Üzerine yazıyor filename : Yerel değişikliklerin olmadığından emin olun, yoksa bunun yerine saklanan dosyayı birleştirmek isteyebilirsiniz .

( Jaime M. tarafından yorumlandığı gibi) , özel karakterler kaçış için gereken tcsh gibi bazı kabuk için, sözdizimi olacaktır: git checkout 'stash@{0}' -- <filename>)

veya başka bir dosya adı altında kaydetmek için:

git show stash@{0}:<full filename>  >  <newfile>

(burada <full filename>, bir projenin en üst dizinine göre bir dosyanın tam yol adı olduğunu unutmayın (düşünmek: görestash@{0} )).

YÜCER yorumlarda öneriyor :

Bu dosyadan hangi değişiklikleri uygulamak istediğinizi manuel olarak seçmek istiyorsanız:

git difftool stash@{0}..HEAD -- <filename>

Vivek ekler yorumlarda :

Gibi görünüyor " git checkout stash@{0} -- <filename>o yok -" zulası gerçekleştirildi zamanın olarak dosyanın sürümünü geri yükler DEĞİL bu dosya için (sadece) saklanmış değişiklikleri uygulamak.
İkincisini yapmak için:

git diff stash@{0}^1 stash@{0} -- <filename> | git apply

olarak ( yorumladı tarafından peterflynn , ihtiyacınız olabilecek| git apply -p1 (Birini kaldırarak, bazı durumlarda p1) geleneksel fark yolları önde gelen eğik çizgi)


Yorumlandığı gibi: "unstash" (git stash pop ), sonra:

  • tutmak istediğiniz şeyi dizine ekleyin ( git add)
  • geri kalanını saklamak: git stash --keep-index

Son nokta, başkalarını saklarken bazı dosyaları tutmanıza izin veren şeydir.
" Değişen birden çok dosyadan yalnızca bir dosya nasıl saklanır " bölümünde gösterilmiştir .


5
git stash popDosya çakışmaları nedeniyle yapamıyorsanız bu çalışmaz . Balamurugan A'nın cevabı bu durumda benim için hile yaptı.
Andrey

1
Bu dosyadan hangi değişiklikleri uygulamak istediğinizi manuel olarak seçmek isterseniz git difftool stash @ {0} kullanabilirsiniz. HEAD - <filename>
yucer

5
Görünüşe göre "git checkout stash @ {0} - <filename>", saklamanın gerçekleştirildiği andan itibaren dosyanın sürümünü geri yükler - bu dosya için saklanan değişiklikleri UYGULAMAZ (sadece). Sonuncusunu yapmak için: "git diff stash @ {0} ^ 1 stash @ {0} - <filename> | git uygula"
Vivek

1
@JaimeM. Teşekkür ederim. Daha fazla görünürlük için yorumunuzu cevaba ekledim.
VonC

1
Varsayarsak unstasharaçlarını popbuna büyük olasılıkla olur çoğu durumda, bu sadece kısmen sorusunu yanıtlar geliyor bana olarak. Daha sonra, kalan değişiklikleri patlatırken daha sonraki çakışmalardan ve / veya karışıklıklardan kaçınmak için seçici olarak uygulanan parçaları saklamaktan nasıl çıkarırsınız?
DylanYoung

115
git checkout stash@{N} <File(s)/Folder(s) path> 

Örneğin. Yalnızca ./test.c dosyasını ve ./include klasörünü son saklamadan geri yüklemek için,

git checkout stash@{0} ./test.c ./include

12
Bu doğru cevap! Sadece belirli dosyalardan saklanan değişiklikleri uygulamak için tek satır komutu, bir cazibe gibi çalışır!
seviye

1
Dosya için saklanan değişiklikleri uygulamak (sadece): "git diff stash @ {N} ^ 1 stash @ {N} - <filename> | git uygula"
Vivek

Bu benim için de geçerli. Sadece saklamak için gerekli dosyaları seçici bir şekilde kontrol ve bitirdiniz. Bunun içinde sıkışmıştım -ave zulayı oluştururken bayrak kullanmıştım .
Rajeev Ranjan

1
@ 4 seviyeler Bence "saklı değişiklikler uygulamak" ne olduğunu değil, değil mi? Ben "saklı kopya ile ne varsa üzerine yazmak" olduğunu düşünüyorum.
msouth

35

Sanırım VonC'nin cevabı muhtemelen istediğiniz şeydir, ancak burada seçici bir "git uygula" yapmanın bir yolu var:

git show stash@{0}:MyFile.txt > MyFile.txt

4
Bu, bazı durumlarda istediğiniz gibi olabilir, ancak herhangi bir çalışma dizini değişikliği ile birleştirmek yerine bu komutun üzerine yazacağına dikkat edin .
Ravent

Bu benim için işe yarıyor, çünkü sadece saklamakta olan ve hiçbir checkoutşeye önem vermeyen bir dosyayı kopyalamak istedim .
Tom Russell

1
Windows PowerShell için: git show stash@`{0`}:Path/To/MyFile.txt |sc Path/To/MyFile.txt- PS'nin destekleri özel olarak yorumlamaması için backticks gereklidir ve scgereklidir, çünkü PS'nin >operatörü varsayılan olarak istediğiniz şey olmayan UTF-16'yı (aslında UCS-2) kullanır . @ Balamurugan A'nın cevabı bu sorunlardan muzdarip değil.
Ian Kemp

19

İlk önce tüm depoları listeleyin

git stash list

stash@{0}: WIP on Produktkonfigurator: 132c06a5 Cursor bei glyphicon plus und close zu zeigende Hand ändern
stash@{1}: WIP on Produktkonfigurator: 132c06a5 Cursor bei glyphicon plus und close zu zeigende Hand ändern
stash@{2}: WIP on master: 7e450c81 Merge branch 'Offlineseite'

Sonra hangi dosyaların zulada olduğunu gösterin (zu 1'i seçelim):

git stash show 1 --name-only

//Hint: you can also write
//git stash show stash@{1} --name-only

 ajax/product.php
 ajax/productPrice.php
 errors/Company/js/offlineMain.phtml
 errors/Company/mage.php
 errors/Company/page.phtml
 js/konfigurator/konfigurator.js

Ardından, istediğiniz dosyayı uygulayın:

git checkout stash@{1} -- <filename>

veya tüm klasör:

git checkout stash@{1} /errors

Ayrıca olmadan çalışır -- ancak kullanılması önerilir. Bu gönderiye bakın .

Bir çift tireyi seçenek yorumlamasını durdurma sinyali olarak tanımak ve aşağıdaki tüm argümanları tam anlamıyla ele almak gelenekseldir.


1
Bu düzenleme ile daha açık. +1
VonC

1
Birçok yol denedim ve bu şekilde ihtiyacım olan buydu. git stash popİzlenmeyen dosyalar için hata veren bir sorunla karşılaştım . teşekkür ederim.
Ramin Firooz

10

Siz git stash pop(çakışma olmadan) uygulandıktan sonra zulayı kaldırır. Ama eğer git stash applyyamayı istif listesinden çıkarmadan uygular. Ardından, istenmeyen değişiklikleri geri alabilirsiniz.git checkout -- files...


2
Bu yazının çakışma bölümünü açıklığa kavuşturmak için, siz git stash popve orada çakışmalar varsa, bunları manuel olarak düzeltmeniz gerekecek ve stash SİLİNMEZ.
Thomas McCabe

6

Bir yol daha:

git diff stash@{N}^! -- path/to/file1 path/to/file2  | git apply -R

2
Bu tek doğru cevap IMO'sudur. Kullanılması checkoutveya showkörü körüne sadece uygulayarak değişikliklerin yerine dosyanın üzerine olacaktır. "Bir yol daha" bir eksikliktir.
cambunctious

1
Çalışma path/to/file2alanınızdaki aynı dosyaya karşı istediğiniz gibi elde edemiyorum . İkinci yolu terk etmek benim için iyi. - Ve -Rseçeneği kullanarak bir hata mesajı alıyorum ("yama tersine uygula", saklanmış sürümü yama denemek ?!). Yani benim çalışma versiyonum benziyor git diff stash@{N}^! -- path/to/file | git apply -.
ThomasH

"yama başarısız"? 3 yönlü birleştirmeyi deneyin. ...| git apply -3 -
John Mee

6

Windows kullanıcıları için: kıvırcık parantezlerin PowerShell'de özel bir anlamı vardır. Tek tırnak işareti ile çevreleyebilir veya ters tırnakla kaçabilirsiniz. Örneğin:

git checkout 'stash@{0}' YourFile

Bu olmadan, bir hata alabilirsiniz:

Unknown switch 'e'


3
Bu ay gördüğüm en az yardımcı kullanıcı mesajı için PowerShell'in tam notları.
holdenweb
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.