Neden çalışma dizinine saklanamıyor?


96

Stash'i çalışma dizinine geri uygulayamıyorum.

Küçük hikaye:

Önce bazı kesin değişiklikleri zorlamaya çalıştım, ama dedi ki: "hayır, önce çekemezsin" ... Tamam o zaman, GitHub'dan bir şeyler alacağım ve sonra değişikliklerimi göndereceğim. Çekmeye çalıştığımda, üzerine yazılacak değişikliklerim olduğunu ve değişikliklerimi saklamam gerektiğini söyledi. Tamam, değişiklikleri sakladım ... çekmeyi yaptım ve taahhüt edilen değişiklikleri zorladım. Ancak şimdi, üzerinde çalıştığım taahhüt edilmemiş değişiklikleri geri yükleyemiyorum.

Bu hata:

MyPath/File.cs already exists, no checkout
Could not restore untracked files from stash

Elbette git'in tüm kavramlarını henüz anlamıyorum, kafamı biraz karıştırıyorlar ... belki yanlış bir şey yaptım.

Birisi bunu çözmeme yardım edebilirse harika olurdu ... Google'da ve her şeyde bir saatten fazla bir süredir arama yapıyorum ve henüz bir çözüme ulaşmadım.

Yardım çok takdir edilmektedir. Teşekkürler!

Yanıtlar:


75

Deponuzun daha sonra depoya eklenen izlenmemiş bir dosya içeriyor gibi görünüyor. Bunu denediğinizde ve kontrol ettiğinizde, git haklı olarak reddediyor çünkü mevcut bir dosyanın üzerine yazıyor olacaktı.

Düzeltmek için, bu dosyayı silmek (sorun değil, hala depoda), zulanızı uygulamak ve ardından dosyanın saklanan sürümünü uygun şekilde depo içi sürümle değiştirmek gibi bir şey yapabilirsiniz.

Düzenleme: Bu dosya yalnızca çalışma ağacında oluşturulduğunu da mümkündür olmadan repo eklendi edilerek. Bu durumda, bunun yerine yerel dosyayı silmeyin, bunun yerine:

  1. başka bir yere taşı
  2. zulayı uygulamak
  3. iki dosya sürümünü manuel olarak birleştirin (çalışma ağacı - taşınan).

2
Gelecekte bir şeyleri saklamak zorunda kalmamamın bir yolu var mı ... SVN'den geliyorum ve çok ileriye bakıyorum ... sadece günceller, çatışmaları çözer ve sonra taahhüt edersiniz. Git o kadar zor olamaz, döngüye 2 adım eklemem gerekiyor. Tekrar teşekkürler!
Miguel Angelo

2
@Miguel: Saklamak bir engel değil . Git tarafından sağlanan, iş akışınızı iyileştirmenize ve çatışmalardan ve kirli taahhütlerden kaçınmanıza olanak tanıyan ek bir araçtır. git-scm.com/docs/git-stash
Koraktor

8
Cevap geçerli olsa da git'in bu konuda "doğru" olduğundan emin değilim. Dosyalar depodadır, bu nedenle veri kaybı tehlikesi yoktur. neden değişiklikleri uygulamıyoruz? Bu konuya bakın - git.661346.n2.nabble.com/stash-refuses-to-pop-td7453780.html
studgeek

5
Bu cevabın pek yardımcı olmadığını düşünüyorum. git stashyerel değişiklikleri hızlı bir şekilde yedeklemeye yardımcı olmalıdır. Geri yüklemek için bir dizi dosyayı manuel olarak silmek, akışı bozar. git stash branchDiğer yanıtında yaklaşım ama hala çok fazla manuel istenenden daha, iyi geliyor.
bentolor

Bu cevap, aynı durumda olduğumda benim için en iyisi oldu. Zulayı patlattıktan sonra, baştan beklediğim gibi bir birleştirme sürecinden geçtim.
Billy Lazzaro

59

En güvenli ve en kolay yol, muhtemelen bir şeyleri tekrar saklamak olacaktır:

git stash -u             # This will stash everything, including unstaged files
git stash pop stash@{1}  # This will apply your original stash

Daha sonra sonuçtan memnunsanız arayabilirsin

git stash drop

"güvenli" zulanızı kaldırmak için.


2
Bunun için teşekkür ederim, beni birçok acıdan ve ıstıraptan kurtardı!
danjarvis

9
stash pop uygulayacak ve orijinal zulanızı bırakacaktır. Sadece güvenli kullanım applyyerine pop.
Hilbrand Bouwkamp

2
Aslında popbir kombinasyonudur applyve dropfakat sadece edecek dropeğer applyçakışma olmadan çalıştı. Ama evet, applygenellikle daha güvenlidir.
Koraktor

2
Bu, çalışma dizininde saklamak istediğiniz başka değişiklik olmadığını varsayar. Bu özel soru için temiz bir durumda olduğunu ima ediyor (ama açıkça söylemiyor), ancak buraya yerel değişikliklerle gelen başkaları için bunu belirtmek istedim.
studgeek

2
Bu, yalnızca çatışan sorunlar işlenmemişse sorunu çözer . İşlendiklerinde tamamen aynı mesajı alırsınız (örneğin temiz bir ödeme ile) ve sonra bu hiçbir şeyi değiştirmez ...
Jasper

57

@Bentolo'da belirtildiği gibi, şikayet ettiği dosyaları manuel olarak silebilir, şubeleri değiştirebilir ve ardından manuel olarak geri ekleyebilirsiniz. Ama ben şahsen "git içinde" kalmayı tercih ederim.

Bunu yapmanın en iyi yolu, zulayı bir dala dönüştürmektir. Bir dal olduğunda, bildiğiniz ve sevdiğiniz normal dalla ilgili teknikleri / araçları kullanarak git'te normal şekilde çalışabilirsiniz. Bu aslında listelenen hataya sahip olmasanız bile zulalarla çalışmak için yararlı bir genel tekniktir. İyi çalışıyor çünkü zula gerçekten kapakların altındaki bir işlemdir (bkz. PS).

Bir zulayı bir dala dönüştürmek

Aşağıdakiler, zula yaratıldığında HEAD'i temel alan bir dal oluşturur ve ardından zulayı uygular (onu kaydetmez).

git stash branch STASHBRANCH

"Zula dalı" ile çalışma

Bundan sonra ne yapacağınız, zula ile hedef şubenizin (ORİJİNALBRANCH diyeceğim) şu anda nerede olduğuna bağlıdır.

Seçenek 1 - Stash şubesini normal şekilde yeniden başlatın (saklamadan bu yana birçok değişiklik)

ORIGINALBRANCH'ınızda çok fazla değişiklik yaptıysanız, muhtemelen STASHBRANCH'a herhangi bir yerel şube gibi davranmak en iyisidir. Değişikliklerinizi STASHBRANCH'ta teslim edin, ORIGINALBRANCH'da yeniden başlatın, ardından ORIGINALBRANCH'a geçin ve STASHBRANCH değişikliklerini bunun üzerine yeniden bağlayın / birleştirin. Çatışmalar varsa bunları normal şekilde halledin (bu yaklaşımın avantajlarından biri çatışmaları görebilmeniz ve çözebilmenizdir).

Seçenek 2 - Orijinal şubeyi zulayla eşleşecek şekilde sıfırlayın (zuladan bu yana sınırlı değişiklikler)

Bazı aşamalı değişiklikleri saklarken zulalandıysanız, sonra taahhüt ettiyseniz ve tek yapmak istediğiniz ek değişiklikleri almaktır, zulalandığında yapılmamışsa, aşağıdakileri yapabilirsiniz. Çalışma kopyanızı değiştirmeden orijinal şubenize ve dizine geri dönecektir. Sonuç, çalışma kopyanızdaki ek zula değişiklikleriniz olacaktır.

git symbolic-ref HEAD refs/heads/ORIGINALBRANCH
git reset

Arka fon

Zulalar, dalları / etiketleri sever (yamalar değil)

Not: Bir zulayı bir yama olarak düşünmek caziptir (tıpkı bir commit'i bir yama olarak düşünmek gibi), ancak bir zula, yaratıldığında HEAD'e karşı yapılan bir işlemdir. / Pop uyguladığınızda, onu mevcut şubenize kiraz toplamaya benzer bir şey yapıyorsunuz. Dalların ve etiketlerin gerçekten sadece commitlere referans olduğunu unutmayın, bu yüzden birçok yönden zulalar, dallar ve etiketler bir commit'i (ve geçmişini) işaret etmenin farklı yollarıdır.

Çalışma dizini değişiklikleri yapmamış olsanız bile bazen gereklidir

PPS, Bu tekniğe --patch ve / veya --include-untracked ile sadece zulayı kullandıktan sonra ihtiyacınız olabilir. Çalışma dizinlerini değiştirmeseniz bile, bu seçenekler bazen tekrar uygulayamayacağınız bir zula oluşturabilir. Nedenini tam olarak anlamadığımı itiraf etmeliyim. Biraz tartışma için http://git.661346.n2.nabble.com/stash-refuses-to-pop-td7453780.html adresine bakın .


5
Bu yanıt, 'kilitli bir zulanın' en etkili şekilde nasıl çözüleceğine dair en yararlı işaretçileri sağladığı için çözüm olarak işaretlenmelidir. Belki önce 'basit silme çözümünden' ve ikinci seçenek olarak dal çözümünden bahsederek bunu iyileştirebilirsiniz.
bentolor

8
Bu senaryo ile karşı karşıya iseniz "git stash branch STASHBRANCH" çalışmıyor gibi görünüyor (pop ile aynı hata mesajı çıkıyor). Önceden bazı git sıfırlamaları yapmanız gerekebilir.

1 Ben kaydedilmesini ve değişiklikleriyle bir spagetti karmaşa içinde kendimi var ve vs vs stashing Bu bir dal sayesinde studgeek için zulası poping tarafından bunun bana çıktı
RobbZ

Zulaların nasıl yama olmadığına ve HEAD'e nasıl bağlandıklarına (saklama sırasında) açıkladığınız için teşekkür ederiz. Bu çok mantıklı. - Öyleyse ... Sanırım bir yama oluşturmanın bir zuladan ziyade daha esnek / taşınabilir / daha uygun olduğu durumlar vardır (bahsettiğiniz gibi: çok fazla değişiklik olduğunda), böylece herhangi bir yere uygulanabilir (ve sadece çatışmaları çözme meselesi). Belki git stash show -porada zula yapmanıza yardımcı oluyor -> * yama *.
Kamafeather

39

Çözüm: Söz konusu dosyayı silmeniz, ardından pop / application'ı tekrar saklamayı denemeniz gerekir ve devam etmelidir. Diğer dosyaları silmeyin, yalnızca hatada belirtilenleri silmeyin.

Sorun: Git bazen berbat. Çalıştırırken git stash -uo izlenmeyen dosyaları (serin!) İçerir ama gelmez bu izlenmeyen dosyaları kaldırmak ve yok gerçekten yapar (soğutmak değil!) Kalanlar üstünde saklanmış izlenmeyen dosyaları nasıl uygulanacağını bilmek -useçenek oldukça yararsız.


3
Benim sorum olsaydı bu cevabı kabul ederdim. Teşekkürler @qwertzguy, cevabınız sorunumu çözdü,
Kobus Myburgh

Aynı sorunla kendim de karşılaştım, git stash pop söz konusu dosyaları silene kadar geçerli olmayacaktı - sonra bir dosyayla zulanın reddedilmesine neden olan bir çatışmaya girdim. Ama daha sonra onları geride bırakan izlenmemiş dosyaları kaldırmak yerine .. Gelecekte git stash -u
kendime

Etkilenen dosyaların her iki sürümünden parçalara ihtiyacınız varsa kötü tavsiye.
Walf

2
"izlenmeyen dosyaları kaldırmaz" ... ve içinde listelemez git stash show. Bu cevap ampulü çalıştırdı.
jscs

2
artı bir de Git için bazen berbat.
Harish

29

Bunun yerine zuladaki kod farklılıklarını yama olarak uygulamak için aşağıdaki komutu kullanın:

git stash show --patch | patch -p1

11
Genellikle birkaç satırlık anonim kod göndermek yerine bir çözümü açıklamak daha iyidir. Nasıl iyi bir cevap yazabilirim ve ayrıca tamamen koda dayalı cevapları açıklama okuyabilirsiniz .
Massimiliano Kraus

Bu, benim için işe yarıyor çünkü yama git stash show --patch, izlenmeyen dosyaları içermiyor.
Steven Shaw

Zulamın itilmesinden bu yana depomdaki bir çok değişiklik nedeniyle zulamı açamadığım için bu cevap bana çok yardımcı oldu.
Erik Finnman

1

Bu bana defalarca oldu, izlenmemiş dosyaları depoya git stash -uekledim ve depolanmış değişiklikleri artık uygulayamıyorum.

git stash pop/applyDosyaları değiştirmeye zorlamanın bir yolunu bulamadım , bu yüzden önce saklanan izlenmemiş dosyaların yerel kopyalarını kaldırıyorum (kaydedilmemiş tüm değişiklikleri sileceğinden dikkatli olun ) ve ardından saklanan değişiklikleri uyguluyorum :

rm `git ls-tree -r stash@{0}^3 --name-only`
git stash apply

Son olarak, kullanmak git status, git diffve diğer araçlar kontrol edip eksik bir şey varsa kaldırılan dosyalardan bölümlerini geri ekleyin.


Saklamak istediğiniz taahhüt edilmemiş değişiklikleriniz varsa, önce geçici bir kayıt oluşturabilirsiniz:

git add --all
git commit -m "dummy"
rm `git ls-tree -r stash@{0}^3 --name-only`
git stash apply

Önceden kaydedilmiş değişiklikleri yerel dosyalara geri birleştirmek için size uygun olan araçları kullanın ve sahte commit'i kaldırın:

git reset HEAD~1

0

Benzer şekilde engellenen pop işlemim artık dosyaların yok sayılmasıydı (.gitignore dosyasına bakın). Git durumu izlendiğimi ve izlenmediğini gösterdi, ancak etkinliklerim göz ardı edilen dosyaları temizlemedi.

Ayrıntılar: Kullandım git stash save -a, orijinal davranışı derlemek ve görmek için ana bilgisayarı kontrol ettim, sonra düzenlemeye devam etmek için hepsini geri koymaya çalıştım. Dalımı kontrol ettiğimde ve açmaya çalıştığımda, göz ardı ettiğim dosyalarım saklanmadan önce hala oradaydı. Bunun nedeni, ana teslim alma işleminin yalnızca kaydedilmiş dosyaları etkilemesidir - yok sayılan dosyaları silmemiştir. Böylece pop başarısız oldu, esasen saklanan göz ardı edilen dosyalarımı hala orada olan dosyaların üzerine geri yüklemek istemediğini söyledi. Onlarla bir birleştirme seansı başlatmanın bir yolunu bulamadığım için talihsiz bir durum.

Sonunda, git clean -f -d -xyok sayılan dosyaları kaldırırdım. İlginç bir şekilde, ~ 30, 4 dosyam temizlendikten sonra hala kaldı (alt dizinlere gömülü). Hangi kategoride olduklarını ve manuel olarak silinmeleri gerektiğini bulmam gerekecek.

Sonra babam başarılı oldu.



-1

Diğer çözüm:

cd to/root/your/project

# Show what git will be remove
git clean -n

# If all is good
git clean -f

# If not all is good, see
git clean --help

# Finish
git stash pop

Soruda bahsedilen hata, hem yığın hem de çalışma dizininde bulunan bir dosyadan kaynaklanır. Temizleme, yalnızca bu dosya izlenmezse, bu kesinlikle her zaman geçerli değildir (ve dosyayı bir çekmeden aldığı için OP'nin durumu değil) düzeltir.
Xavier Poinas

-1

Git 2.14.x / 2.15 (Q3 2017) ile, qwertzguy 'in solüsyonu 2014 artık gerekli olmayacaktır.

2017'nin 3. çeyreğinden önce söz konusu dosyayı silmeniz ve ardından pop / apply'ı tekrar saklamayı denemeniz gerekiyordu.
Bir sonraki Git sürümüyle bunu yapmak zorunda kalmayacaksınız.

Bkz. Commit bbffd87 (11 Ağu 2017), Nicolas Morey-Chaisemartin ( nmorey) .
(Göre Birleştirilmiş - Junio Cı Hamano gitster- içinde 0ca2f32 tamamlama 2017 23 Eyl)

stash: sıfırlamadan önce izlenmeyen dosyaları temizle

git stash -uDosyadaki mevcut bir değişiklik nedeniyle artık yok sayılmayan bir dosya içeren bir depoyu çağırıyorsanız gitignore, bu dosya saklanır ancak çalışma ağacından kaldırılmaz.
Bunun nedeni, git-stashönce dosya değişikliğini reset --hardtemizleyen .gitignoreve ardından git cleandosyayı el değmeden bırakarak çağıran bir işlem yapmaktır.
Bu git stash pop, mevcut dosya nedeniyle başarısız olmasına neden olur .

Bu yama basitçe temizlik ve sıfırlama arasındaki sırayı değiştirir ve bu kullanım senaryosu için bir test ekler.


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.