İzlenmemiş bir dosyayı nasıl saklarsınız?


1436

Bir dosyada ve yeni bir dosyada değişiklik yaptım ve başka bir göreve geçerken onları bırakmak için git stash kullanmak istiyorum. Ancak git stash, yalnızca varolan dosyadaki değişiklikleri saklar; yeni dosya benim çalışma ağacımda kalır ve gelecekteki çalışmalarımı karıştırır. Bu izlenmemiş dosyayı nasıl saklayabilirim?


27
Eğer saklamanızda sadece izlenmemiş dosyalarınız varsa, boş bir dosya gibi görüneceğini git stash showunutmayın, hiçbir şey döndürmez ve onu bırakmaya cazip gelebilirsiniz (birkaç ay önce yazdığım yararlı bir senaryo içerdiğinde yaptığım gibi) → bırakılan bir saklamanın nasıl kurtarılacağı )
Maxime R.

Yanıtlar:


1924

İzlenmemiş dosyalar (özellikle .gitignore'da bulunanlar) dahil olmak üzere çalışma dizininizi saklamak için muhtemelen bu cmd'yi kullanmak istersiniz:

git stash --include-untracked

Daha fazla detay:

Güncelleme 17 Mayıs 2018:

git stash --allGit'in yeni sürümlerinde artık izlenmeyen ve yok sayılan dosyalar da dahil olmak üzere tüm dosyaları saklayan var.
git stash --include-untrackedartık yok sayılan dosyalara dokunmaz (git 2.16.2'de test edilmiştir).

Aşağıdaki orijinal cevap:

Uyarı, gitignore dosyanızda herhangi bir dizin / * girişi varsa dosyalarınızı kalıcı olarak siler.

1.7.7 sürümünden itibaren izlenmeyen dosyaları hazırlamadan git stash --include-untrackedveya git stash save -usaklamak için kullanabilirsiniz .

git addDosyayı ekleyin ( ) ve izlemeye başlayın. Sonra saklamak. Dosyanın tüm içeriği yeni olduğu için saklanırlar ve gerektiğinde manipüle edebilirsiniz.


4
Bu değişiklikler sahnelenmemiş olsa bile stash neden mevcut dosyaları değiştirmiyor?
Alan Christensen

6
@ alan-christensen kernel.org/pub/software/scm/git/docs/git-stash.html AÇIKLAMASINI okuyun . Mesele, saklandıktan sonra temiz bir çalışma ağacına sahip olmaktır.
Kelvin

3
@Kelvin, benim yorumda ne demek istediğim, sahnelenmedikçe yeni dosyaları saklamamıştı, ancak sahnelenmemiş olsalar bile mevcut dosyaları saklıyorlardı. Bana tutarsız görünüyor.
Alan Christensen

11
@AlanChristensen, farklı bir şubenin çıkışıyla üzerine yazılabilecek şeyleri saklamak.
jwg

3
Burada en iyi cevaba sahip olduğunuz için, cevabınızda daha git stash --include-untrackedönce git stash --alliki nedenden dolayı listelemenizi rica ediyorum . İlk olarak OP'nin sorusunu şimdi 2019 ve ikincisinde daha iyi cevaplıyor çünkü --all çoğu kullanıcının muhtemelen istemediği bir şey yapıyor .gitignored
Daniel Flippance

411

Git 1.7.7'den git stashitibaren --include-untrackedseçeneği (veya kısa el -u) kabul eder . İzlenmemiş dosyaları saklamanıza dahil etmek için aşağıdaki komutlardan birini kullanın:

git stash --include-untracked
git stash -u

Uyarı, gitignore dosyanızda herhangi bir dizin / * girişi varsa dosyalarınızı kalıcı olarak siler.


15
Havalı - sonunda manuel sayfada açıklandığı gibi çalışır. Yeni dosyaları saklama (ve temizleme) davranışı bozulur.
Steve Bennett

1
git benim sürüm 1.9.1 ve ben ne .gitignoregibi görünüyor ignoredDirectoryve ignoredDirectory/*bu hala izlenmemiş olanları siler bile. İzlenmeyen dosyalar bile sadece dizinler değil.
theUnknown777

22
Lütfen uyarıyı açıklayabilir misiniz? Neden bu dosyaları siler ki? Onları siler ve saklamaz mı? Git'i bir süredir kullandım ve bu problemle karşılaşmadım.
Aleksandr Dubinsky

Uyarı *.extensiongirişler için de geçerli mi?
arekolek

3
@ aleksandr-dubinsky, @arekolek - git1.8.3 -u( --include-untracked) seçeneği izlenmeyen dosyaları saklayabilir ve pop yapabilir, ancak stash git stash showiçindeki izlenmemiş dosyaları listelemez
xilef

77

Dosyayı dizine ekleyin:

git add path/to/untracked-file
git stash

Dizinin tüm içeriği ve varolan dosyalardaki herhangi bir değişiklik yapılmayan değişiklikler, dizinin tümünün saklanmasına neden olur.


Zaten dizinde olan değişiklikleri saklamak istemezseniz ne olur? Yeni dosyayı saklamak hala mümkün mü?
allyourcode

Dizini uygulayın, yeni dosyayı saklayın, sonra taahhüdü geri alın ve / veya dosyaları taahhütten çıkarın. Bu kaba bir çözüm, ama işe yaramalı.
Gdalya

git add .bir nedenden dolayı dikkate
almıyordu

53

Git bash'da, izlenmeyen dosyaların saklanması komutu kullanılarak elde edilir.

git stash --include-untracked

veya

git stash -u

http://git-scm.com/docs/git-stash

git stash, izlenmemiş veya yüklenmemiş dosyaları çalışma alanınızdan kaldırır. Git komutunu aşağıdaki komutları kullanarak geri alabilirsiniz

git stash pop

Bu, dosyayı yerel çalışma alanınıza geri yerleştirir.

Benim deneyimim

.Classpath ve .project dosyalarının uzak repoya taşınmasını önlemek için gitIgnore dosyamda bir değişiklik yapmak zorunda kaldım. Bu değiştirilmiş .gitIgnore şimdilik uzak repo taşımak izin verilmiyor.

java düzenleyicim olan eclipse için .classpath ve .project dosyaları önemlidir.

Her şeyden önce diğer dosyalarımı seçici olarak ekledim ve sahnelemeye karar verdim. Ancak, değiştirilmiş .gitIgnore alanları ve izlenmeyen dosyalar viz sürece son push gerçekleştirilemez. .project ve .classpath saklanmaz.

kullandım

 git stash 

değiştirilmiş .gitIgnore dosyasını saklamak için.

.Classpath ve .project dosyalarını saklamak için kullandım

git stash --include-untracked

ve dosyaları çalışma alanımdan kaldırdı. Bu dosyaların yokluğu, tutulmadaki iş yerim üzerinde çalışma yeteneğimi ortadan kaldırıyor. Taahhüt edilen dosyaları uzaktan kumandaya gönderme prosedürünü tamamlamaya devam ettim. Bu başarılı bir şekilde yapıldıktan sonra,

git stash pop

Bu, aynı dosyaları çalışma alanıma geri yapıştırdı. Bu bana aynı projede tutulma konusunda çalışma yeteneğimi verdi. Umarım bu fırçalar yanılgıları bir kenara bırakır.


2
Neden IDE dosyaları için global gitignore kullanmıyorsunuz? Yani. kullanın ~/.gitignore.
Antti Pihlaja

20

Başka bir yerde söylendiği gibi, cevap git adddosyayadır. Örneğin:

git add path/to/untracked-file
git stash

Ancak, soru başka bir cevapta da ortaya çıkıyor: Dosyayı gerçekten eklemek istemezseniz ne olur? Söyleyebildiğim kadarıyla söylemelisin. Ve aşağıdakiler ÇALIŞMAZ :

git add -N path/to/untracked/file     # note: -N is short for --intent-to-add
git stash

bu, aşağıdaki gibi başarısız olur:

path/to/untracked-file: not added yet
fatal: git-write-tree: error building trees
Cannot save the current index state

Peki ne yapabilirsin? Peki, dosyayı gerçekten eklemeniz gerekir, ancak daha sonra aşağıdakileri etkili bir şekilde kaldırabilirsiniz git rm --cached:

git add path/to/untracked-file
git stash save "don't forget to un-add path/to/untracked-file" # stash w/reminder
# do some other work
git stash list
# shows:
# stash@{0}: On master: don't forget to un-add path/to/untracked-file
git stash pop   # or apply instead of pop, to keep the stash available
git rm --cached path/to/untracked-file

Daha sonra, daha önce bulunduğunuz durumda çalışmaya devam edebilirsiniz git add(yani, izlenmeyen bir dosya ilepath/to/untracked-file ; artı izlenen dosyalarda olması gerekebilecek diğer değişiklikler).

Bu konuda bir iş akışı için başka bir olasılık şöyle olacaktır:

git ls-files -o > files-to-untrack
git add `cat files-to-untrack` # note: files-to-untrack will be listed, itself!
git stash
# do some work
git stash pop
git rm --cached `cat files-to-untrack`
rm files-to-untrack

[Not: @mancocapac tarafından yapılan bir yorumda belirtildiği gibi --exclude-standard, git ls-fileskomuta (yani, git ls-files -o --exclude-standard) eklemek isteyebilirsiniz .]

... bu da kolayca yazılabilir - takma adlar bile yapardı (zsh sözdiziminde sunulur; gerektiği gibi ayarlayın) [ayrıca, dosya adını kısalttım, böylece bu cevapta kaydırma yapmadan ekrana sığacak; seçtiğiniz alternatif bir dosya adını değiştirmekten çekinmeyin]:

alias stashall='git ls-files -o > .gftu; git add `cat .gftu`; git stash'
alias unstashall='git stash pop; git rm --cached `cat .gftu`; rm .gftu'

Not ikincisi daha iyi bir kabuk ya da fonksiyon olarak olabileceğini, parametreler verilmek üzere izin vermek git stashistemediğiniz durumda, popancak apply, ve / veya belirli bir zulası belirtmek yerine, sadece üst alarak edebilmek istiyorum bir. Belki de bu (yukarıdaki ikinci takma ad yerine) [boşluk, kaydırma yapmadan sığacak şekilde soyulmuştur; okunabilirliği artırmak için yeniden ekleyin]:

function unstashall(){git stash "${@:-pop}";git rm --cached `cat .gftu`;rm .gftu}

Not : Eğer, örneğin bir zula tanımlayıcı tedarik geçiyorsanız, şu formda, tanımlayıcı yanı sıra bir eylem argümanı sağlamanız gerekmektedir unstashall apply stash@{1}veyaunstashall pop stash@{1}

Tabii ki .zshrcuzun vadede var olmak için kendi veya eşdeğeri koymak .

Umarım bu cevap birisi için yararlıdır, her şeyi tek bir cevapta toplar.


1
git ls-files -o ilgilendiğimden çok daha fazla dosya gösterir. Aşağıdaki git durumundan --exclude-standard çalışmaları ekleyerek buldum. git ls-files -o --exclude-standard. Bunu benim almam sadece normalde görmezden gelmeyeceğiniz izlenen dosyaları "içerir", yani sadece .gitignore'nuzun filtrelemeyeceği izlenmemiş dosyaları gösterir
mancocapac

20

Git 2.8.1 sürümünde: aşağıdaki benim için çalışıyor.

Değiştirilmiş ve izlenmemiş dosyaları isimsiz saklamak için

git stash save -u

Değiştirilen ve izlenmeyen dosyaları bir adla saklamak için

git stash save -u <name_of_stash>

Sen kullanmak ya edebilirsiniz pop veya uygulamak aşağıdaki gibi sonradan.

git stash pop

git stash apply stash@{0}

Bu, izlenmeyen dosyaları bilgisayarımdan kaldırmadı, ancak artık izlenmemiş olarak listelenmedi. git stash showonlara göstermediler. Denediğimde git stash apply, "hata: İzlenmeyen dosyaları saklamaktan geri yükleyemedim" hatası aldım. Ancak, dosyalar bir kez daha izlenmemiş olarak listelendi, ancak izlenen dosyalarda yapılan değişiklikler geri yüklenmedi. Bence bu dosyaları saklamak için tek tek geri yüklenebilir, ancak bu çözüm umduğum gibi değildi.
hBrent

9

Yaparak sadece izlenmeyen dosyaları saklamak başardı :

git stash save "tracked files I'm working on"
git stash save -u "untracked files I'm trying to stash"
git stash pop stash@{1}

Sonuncusu, izlenen dosyaların saklanmasını sağlar, böylece yalnızca izlenmeyen dosyalar saklanır.


git stash save -usadece untrackeddosyaları kaydetmekle kalmaz , hem trackedve hem de untracked. Sanırım yaptığınız ilk tasarruf bu durumda bir zorunluluk değil. Atlassian.com/git/tutorials/saving-changes/…
Drenai

2
Soru, sadece izlenmeyen dosyaların nasıl saklanacağıdır. İlk zulayı atlarsanız, o zaman ne ortaya çıkarsınız? Fikir: 1) Stash izledi. 2) Stash izlenmemiş. 3) Pop izlendi. Sonuç: İzlenmemiş kalıntılar saklanır.
Oded

3

İzlenmeyen dosyaları saklamak, ancak dizine alınmış dosyaları (örneğin işlemek üzere olduğunuz dosyaları) saklamak istiyorsanız -k,-u

git stash -u -k


2

diyelim ki yeni ve izlenmemiş dosyanın adı "views.json". uygulamanızın durumunu saklayarak şube değiştirmek istiyorsanız, genellikle şunu yazarım:

git add views.json

Sonra:

git stash

Ve saklanacaktı. Sonra şubeyi sadece

git checkout other-nice-branch

1

Orada birkaç doğru cevaplar burada, ama ben yeni tüm dizinler için, işaret etmek istediği 'git add path'olacak DEĞİL işi. Yani izlenmemiş yolda bir sürü yeni dosyanız varsa ve bunu yapın:

git add untracked-path
git stash "temp stash"

bu aşağıdaki mesajla saklanır:

Saved working directory and index state On master: temp stash
warning: unable to rmdir untracked-path: Directory not empty

ve izlenmeyen yol sakladığınız tek yolsa, saklamak "geçici saklamak" boş bir saklamak olacaktır. Doğru yol, yalnızca dizin adını değil, tüm yolu eklemektir (yani, yolu '/' ile bitirmek):

git add untracked-path/
git stash "temp stash"

En azından benim sistemimde varsayım yanlış. Eğik çizgi olmadan çalışır! Boş dizinler yine de yoksayılır. (macos git 2.6.2)
phobie

0

Ben bu tüm içeriği hazırlama alanına taahhüt yerine git var söyleyerek giderilebileceğini düşündüm ve sonra arayın git stash. Araqnid ilkinin nasıl yapılacağını açıklar .

git add --intent-to-add path/to/untracked-file

veya

git update-index --add --cacheinfo 100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 path/to/untracked-file

Ancak, ikincisi çalışmaz:

$ git stash
b.rb: not added yet
fatal: git-write-tree: error building trees
Cannot save the current index state

1
Anlayabildiğim kadarıyla, eski de çalışmıyor. Bu soruna bir çözüm bulmak için cevabımı görün .
Lindes

0
git stash --include-untracked

en sevdiğim dosya, eklediğiniz dosyaları kaydetmediği ve hazırlayamadığı için de kaydetti.


0

Yeni oluşturulan dosyaları ile Sourcetree kullanırken benzer bir sorunla karşılaştım (onlar da saklamak dahil değildir).

İlk kez 'hepsini sahnele' seçeneğini belirlediğimde, yeni eklenen bileşenleri izlediğimde ve bu nedenle saklamaya dahil ettiğimde sakladım.


Bu soru 11 yaşında ve 14 cevabı zaten var. Göndermeden önce okudunuz mu?
Mickael B.

-7

Eskiden aynı özelliği düşünürdüm ve arzu ederdim. Ama zamanla, gerçekten gerekli olmadığını fark ettim. Saklamak istediğinizde, yeni dosyaları bırakmak sorun olmaz. Onlara "kötü" bir şey olamaz (başka bir şeye baktığınızda git hata verir ve mevcut izlenmeyen dosyanın üzerine yazmaz)

Genellikle arasındaki zaman çerçevesi beri git stashve git stash popoldukça küçük, hızlı tekrar izlenmeyen dosyasını ihtiyacı olacak. Bu yüzden git statusbaşka bir şey ( git stashve arasında git stash pop) üzerinde çalışırken dosyanın ortaya çıkan rahatsızlıktan sonra işin neden olduğu rahatsızlık daha küçük olduğunu söyleyebilirim ve dikkat gerekiyorsa aksi takdirde izlenmemiş dosyayı eklemeyi denemek için mal olacak saklamak.


15
Projeye bağlı. İzlenmeyen dosyanın (yarı yazılı) bir birim test olduğunu ve test kayışının dizindeki tüm birim testlerini çalıştırdığını varsayalım. Vb
Steve Bennett

1
Başka bir örnek, iki bilgisayarda çalışıyorsanız ve verileri A'dan B'ye taşımanıza izin verilir, ancak B'den A'ya gitmenize izin verilirse, önce B'de oluşan bir sorunu çözmek için yeni bir kod parçası oluşturursanız, ancak hem A hem de B'yi istiyorsanız, dosyayı B'de saklamak istersiniz, böylece bu dosyayı A'da yeniden oluşturduğunuzda ve daha sonra bir paket halinde getirdiğinizde, yapmadığınızı doğrulamak için stashed sürümünü dağıtabilirsiniz. hata yap.
Gdalya

7
Bir dosyanın bir dalda izlenmemesi, başka bir dalda izlenen bir dosyayla çakışmayacağı anlamına gelmez.
jwg

3
basit karşı örnek: .conf.d dizinindeki yapılandırma dosyası veya yalnızca orada bulunarak yazılımın davranışını değiştiren herhangi bir dosya.
fotanus

Elbette işlevsellik gereklidir. Ek bir örnek olarak, saklamak istediğiniz yerel olarak izlenmeyen dosyalarınız varsa bir şubeden diğerine geçmek mümkün değildir.
Demitrian
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.