Saklı taahhütlü değişiklikler nasıl kurtarılır


695

Geliştirme branşımda bazı taahhüt edilmemiş değişiklikler vardı ve bunları kullanarak sakladım git stash, ancak bu saklı olanlar arasında çok önemli olan bazı değişiklikler vardı. Bu değişiklikleri geri almanın bir yolu var mı?

Ayrıca, beri stashed kod dosyalarının üstünde bazı değişiklikler yaptık.

Mümkünse yeni bir şubeye saklanan değişiklikleri geri alma şansım var mı?


7
'stash pop' kullanmayı denedin mi?
robert

Hayır. Aslında git konusunda yeniyim. Tüm komutların tam olarak farkında olmadığım için başka bir şey denemedim! Bu değişiklikleri kaybetmek istemiyorum.
Aswathy P Krishnan

33
Stashed değişikliklerini kaybetmek istemiyorsanız, 'git stash uygula' seçeneğini kullanmayı deneyin. Bu, saklanan değişiklikleri korurken geçerli dalınıza saklanan değişiklikleri uygulayacaktır. Her şey yolundaysa, zulayı uyguladıktan sonra, 'git stash drop' kullanarak zulayı düşürebilirsiniz
robert

2
@robert Çok karmaşık (bir acemi için) kabul edilen cevaba kıyasla basit cevap için teşekkür ederim.
Saheel Godhane

Yanıtlar:


1187

Kolay soruya kolay cevap git stash apply

Değişikliklerinizi yapmak istediğiniz dalı kontrol edin ve ardından git stash apply. Sonra git diffsonucu görmek için kullanın .

Değişikliklerinizi bitirdikten sonra - applyiyi görünüyor ve artık saklamaya ihtiyacınız olmadığından eminsiniz - sonragit stash drop kurtulmak için kullanın .

Her zaman kullanmak git stash applyyerine kullanmanızı öneririm git stash pop. Aradaki fark, applyistifin kolay yeniden denenmesi applyveya bakılması vb. İçin etrafta kalmasıdır. İstifin popçıkarılması mümkün ise, hemen da olacaktır dropve aniden bir yere çıkarmak istediğinizi fark ederseniz başka (farklı bir dalda), ya --indexda böyle bir şeyle , o kadar kolay değil. Eğer sen apply, ne zaman seçeceksin drop.

Yine de hepsi bir şekilde oldukça küçük ve bir aceminin gitmesi için hemen hemen aynı olması gerekir. (Ve bunların geri kalanını atlayabilirsiniz!)


Daha gelişmiş veya daha karmaşık şeyler yapıyorsanız ne olur?

Olduğu gibi, en az üç veya dört farklı "git stash kullanmanın" yolları vardır. Yukarıdaki "yol 1", "kolay yol" içindir:

  1. Temiz bir dalla başladınız, bazı değişiklikler üzerinde çalışıyorsunuz ve daha sonra bunları yanlış dalda yaptığınızı fark ettiniz. Sadece sahip olduğunuz değişiklikleri almak ve başka bir şubeye "taşımak" istiyorsunuz.

    Yukarıda açıklanan kolay durum budur. Koş git stash save(ya da sade git stash, aynı şey). Diğer dalı kontrol edin ve kullanın git stash apply. Bu git, git'in oldukça güçlü birleştirme mekanizmasını kullanarak önceki değişikliklerinizde birleşmeye başlar. Sonuçları beğenipgit diff beğenmediğinizi görmek için dikkatlice inceleyin (ile ) ve eğer isterseniz git stash dropzulayı düşürmek için kullanın . Sen bittin!

  2. Bazı değişiklikler yaptınız ve sakladınız. Sonra başka bir şubeye geçtiniz ve daha fazla değişiklik başlattınız ve saklanmış olanları unutuyorsunuz.

    Şimdi bu değişiklikleri korumak, hatta taşımak ve saklamak da istersiniz .

    Aslında , değişikliklerin bir "yığın" yapar git stash savegibi tekrar yapabilirsiniz git stash. Bunu yaparsanız, biri sadece “ stashama aynı zamanda yazabilirsiniz” olarak adlandırılan stash@{0}ve bir tanesi de yazılan iki zuvanız vardır stash@{1}. Kullanım git stash list(her an) hepsini görmek için. En yenisi her zaman en düşük numaralıdır. Siz git stash drop, en yeniyi ve stash@{1}yığının üstüne hareket eden kişiyi bırakır . Hatta daha olsaydı, oldu bir stash@{2}hale gelir stash@{1}, ve böyle devam eder.

    Siz applyve sonra dropbelirli bir zulayı da yapabilirsiniz: git stash apply stash@{2}vb. Belirli bir zulayı düşürmek, yalnızca daha yüksek numaralı olanları yeniden adlandırır. Yine, numarası olmayan da stash@{0}.

    Çok fazla zıvana biriktirirseniz, oldukça dağınık olabilir (istediğim zulası mıydı stash@{7}yoksa öyle stash@{4}miydi? Şahsen bu değişiklikleri yeni bir şubeye aktarmayı tercih ediyorum, çünkü şubelerin isimleri var ve cleanup-attempt-in-Decemberbana göre çok daha fazla şey ifade ediyor stash@{12}. ( git stashKomut isteğe bağlı bir kaydetme mesajı alır ve bunlar yardımcı olabilir, ancak bir şekilde, tüm stash'larım sadece adlandırılır WIP on branch.)

  3. (Ekstra gelişmiş) Çalıştırmadan önce kodunuzun belirli parçalarını kullandınız git stash save -pveya dikkatlice git addokudunuz ve / veya git rmkurunuz git stash save. Depolama dizini / hazırlama alanında bir sürümünüz ve çalışma ağacında başka bir (farklı) sürümünüz vardı. Bütün bunları korumak istiyorsun. Yani şimdi kullanıyorsunuz git stash apply --indexve bu bazen ile başarısız oluyor:

    Conflicts in index.  Try without --index.
    
  4. git stash save --keep-index"Ne yapılacağını" test etmek için kullanıyorsunuz . Bu, bu cevabın kapsamı dışındadır; bunun yerine bu StackOverflow yanıtına bakın .

Karmaşık durumlar için, şu anda yaptığınız değişiklikleri (isterseniz yeni bir dalda) gerçekleştirerek önce "temiz" bir çalışma dizininde başlamanızı öneririm. Bu şekilde, onları uyguladığınız "bir yerlerde", içinde başka hiçbir şey yoktur ve sadece saklanan değişiklikleri denersiniz:

git status               # see if there's anything you need to commit
                         # uh oh, there is - let's put it on a new temp branch
git checkout -b temp     # create new temp branch to save stuff
git add ...              # add (and/or remove) stuff as needed
git commit               # save first set of changes

Şimdi "temiz" bir başlangıç ​​noktasındasınız. Ya da belki daha çok böyle gider:

git status               # see if there's anything you need to commit
                         # status says "nothing to commit"
git checkout -b temp     # optional: create new branch for "apply"
git stash apply          # apply stashed changes; see below about --index

Hatırlanması gereken en önemli şey "zula" olmasıdır olduğu o "/ komik tuhaf" sadece biraz olduğunu "bir dala" değil işlemek, bir taahhüt. applyŞimdi her yerden işlem değişti kesinleştirme ne görünüyor ve çalışır onu tekrar etmek. Zula hala orada olacak ( applyetrafında tutar), böylece daha fazla bakabilir veya bunun yanlış yer olduğuna karar verebilir applyve farklı bir şekilde tekrar deneyebilirsiniz.


Zulası her bulduğunuzda, zulandakinin git stash show -pbasitleştirilmiş bir sürümünü görmek için kullanabilirsiniz . (Bu, yalnızca "nihai çalışma ağacı" değişikliklere sürüm görünüyor basitleştirilmiş değil kaydedilen indeks bu değişiklikler --indexayrı ayrı geri yüklemeler.) Komutu git stash applyolmadan --indexsadece bu yapmaya çalışır, aynı anda iş-dizindeki değişiklikler.

Zaten bazı değişiklikleriniz olsa bile bu doğrudur. applyKomutu bir bir zulası uygulamak için mutlu olduğunu modifiye (uygulamak için denemek için, en azından ya) çalışma dizini. Örneğin şunları yapabilirsiniz:

git stash apply stash      # apply top of stash stack
git stash apply stash@{1}  # and mix in next stash stack entry too

Burada "uygula" sırasını seçebilir ve belirli bir sırayla uygulamak için belirli zulayı seçebilirsiniz. Bununla birlikte, her seferinde bir "git merge" işlemi gerçekleştirdiğinizde ve birleştirme belgelerinin uyarıda bulunduğu gibi:

Önemsiz, taahhüt edilmemiş değişikliklerle git birleştirme çalıştırmak önerilmez: mümkünse, bir çatışma durumunda geri çekilmesi zor bir durumda bırakabilirsiniz.

Temiz bir dizinle başlıyorsanız ve sadece birkaç git applyişlem yapıyorsanız , geri git reset --hardalmak kolaydır: temiz duruma geri dönmek ve applyişlemlerinizi değiştirmek için kullanın . (Bu yüzden bu karmaşık durumlar için önce temiz bir çalışma dizinine başlamanızı öneririm.)


Mümkün olan en kötü durum ne olacak?

Diyelim ki bir sürü Gelişmiş Git İşi yapıyorsunuz ve bir zulası yaptınız ve yapmak istiyorsunuz git stash apply --index, ancak kaydedilen zulayı uygulamak artık mümkün değil --index, çünkü şube, kaydettiğiniz zamandan beri çok fazla sapmış.

Bunun git stash branchiçin bu.

Eğer sen:

  1. orijinali yaptığınız zamanki kesin taahhüdü kontrol edin stash, sonra
  2. yeni bir şube oluştur ve son olarak
  3. git stash apply --index

değişiklikleri yeniden yaratma girişimi kesinlikle işe yarayacaktır. İşte böyle. (Ve başarılı bir şekilde uygulandığından beri zulası düşürür.)git stash branch newbranch


Hakkında bazı son sözler --index(bu ne halt?)

Ne --indexyapar açıklamak basittir, ama biraz içten karmaşık:

  • Değişiklikleri varsa, gerek git adddaha önce (veya "aşama") onlara commiting.
  • Eğer çalıştırdığınızda Böylece git stash, sen belki iki dosyayı düzenledikten foove zorgancak onlardan biri düzenledi.
  • Eğer zula geri almak için sorduğunuzda o, yani güzel olabileceğini git adds added şeyler yapar ve olmayan git add olmayan ilave şeyler. Eğer kendisine, added fooama zorgsenin yaptığın geri önce stash, o tam aynı kurulum olması güzel olabilir. Evrelendirilen, tekrar evrelendirilmelidir; modifiye edilmiş ancak aşamalanmamış olanların tekrar modifiye edilmesi, ancak aşamalandırılmaması gerekir.

--indexİçin bayrak applybu şekilde kurmak şeyler denemeden. Çalışma ağacınız temizse, bu genellikle işe yarar. Çalışma ağacınızda zaten bir şeyler addvarsa, burada nasıl bazı problemler olabileceğini görebilirsiniz. Dışarıda kalırsanız --index, applyişlem tüm aşamalı / unstaged kurulumu korumaya çalışmaz. Bunun yerine, "saklamak torba" daki iş ağacı taahhüdünü kullanarak git'in birleştirme makinelerini çağırıyor . Aşamalı / düzensiz korunmayı umursamıyorsanız, dışarıda bırakmak işini yapmayı --indexçok daha kolay hale getirir git stash apply.


2
Yorumunu anlamıyorum. Şunu mu demek istedin you run git stash pop? Veya şunu mu demek istediniz: bazı dosyaları düzenlediniz, ancak git stashhenüz tekrar çalıştırmadınız mı? Yoksa tamamen başka bir şey mi demek istiyorsun?
torek

1
Evet. Not, (uzun) düzenlememde, applybir zulası almadan önce sahip olduklarınızı taahhüt etmenizi öneririm . Sen yok olması bunun için, ancak bu bakmak için çok daha basit şeyler yapar. Sen kullanabilirsiniz rebase -ibirlikte birden kaydedilmesini ezmeye veya daha sonra, özellikle değişiklikleri kiraz almak, ya da her neyse.
torek

1
Evet: git stash apply --index(iki tireyi unutmayın). Eğer dışarıda kalırsanız --index, önemli değil; tek nokta --indexaşamalı / unstaged kurulum tutmaktır. (Muhtemelen ilk etapta herhangi bir özel kurulumunuz yoktu.) Sonra git statusvb . Ve istediğiniz şekilde ekleyin / ekleyin git stash drop.
torek

1
Sürece (yapamaz tutmak gibi dropya popbir zulası çünkü) zulası, her zaman, bir taahhüt orijinal saklanmış kod kasa vardır olduğunu bir taahhüt! Tam olarak geri almak istiyorsanız, ancak bir dalda kullanın git stash branch(yukarıdaki bölüme veya Shunya'nın cevabındaki Pro Git kitabına bakın ). Daha sonra o şubeyi veya bu şubeyi git checkoutgit cherry-pick
devredebilirsin

2
@ChuckWolber: Git'in adlandırma kuralları istenecek çok şey bırakıyor ("uzak", "izleme" ve "şube" kelimelerine kaç farklı anlam atayabiliriz ?!). Yine de, orijinal saklamakla ilgisi olmayan bir şeye bir saklamak uygulayabileceğinizi belirtmek gerekir.
torek

57
git stash pop

her şeyi yerine yerleştirecek

yorumlarda önerildiği gibi git stash branch newbranch, stash'ı çalışanla aynı olan yeni bir dala uygulamak için kullanabilirsiniz :

git checkout -b newbranch
git stash pop

Yardım için teşekkürler. Bu değişiklikleri yeni bir şubeye alabilir miyim? Şimdi ben şube üzerinde gelişmek
Aswathy P Krishnan

3
git stash şube newbranch, saklanan değişikliklerle yeni bir şube oluşturur.
robert

3
@robert: git stash branch newbranchbunu gerçekten yapacak; ancak, yeni dalın, üstlendiği HEADzamanki taahhütte bulunacak şekilde üst öğesi oluşturduğunu unutmayın stash. Başka bir deyişle, uzun bir hack seansından sonra ya da her neyse geri döndüğünüzde, dağınıklığa bakıp, "Bunu saklamak yerine bir dala koymalıyım" kararına varmak için :-)
torek

Sorumu düzenledim. Mümkünse bu değişiklikleri yeni bir şubeye almak istiyorum.
Aswathy P Krishnan

1
Bazen TLDR cevabını istiyorsunuz :)
sachinruk

24

Bunu kolaylaştırmak için, saklamanızı tekrar uygulamak için iki seçeneğiniz vardır:

  1. git stash pop - Kaydedilen duruma geri yükleyin, ancak geçici depolama alanından depolamayı siler.
  2. git stash apply - Kaydedilen duruma geri yükleyin ve daha sonra tekrar kullanmak üzere saklamak listesini bırakır.

Bu makalede git zulası hakkında daha ayrıntılı bilgi edinebilirsiniz .


19

Saklama içeriğinizi kontrol etmek için: -

git saklamak listesi

stash listesinden belirli bir stash no uygulayın: -

git stash stash @ {2} uygula

ya da sadece ilk zulayı uygulamak için: -

git stash pop

Not: git stash pop, stash'ı listenizden kaldırırken git stash uygulanmaz. Bu yüzden onları uygun şekilde kullanın.


2

Mac'te bu benim için çalıştı:

git stash list (tüm stash'larınıza bakın)

git stash list

git stash uygula (yalnızca saklamak listenizden istediğiniz sayı)

bunun gibi:

git stash apply 1

0

"git stash" kullanarak taahhüt edilmemiş değişiklikleri saklayabilir ve sonra "git checkout -b" kullanarak yeni bir şubeye ödeme yapabilir ve "git stash uygula" ifadesini uygulayabilirsiniz.

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.