SORU
25 EYLÜL 2013, ÇARŞAMBA


Git: kurtarmak için Nasıl kaydedilmemiş değişiklikler saklanmış

Geliştirme şube bazı kaydedilmemiş değişiklikler vardı ve onları git stash kullanarak sakladım ama bu olanları sakladı arasında çok önemli bazı değişiklikler oldu. Bu değişiklikleri geri almak için herhangi bir yolu var mı?

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

Eğer mümkünse yeni bir şube için değişiklik sakladığı almak gibi bir şansım var mı?

CEVAP
25 EYLÜL 2013, ÇARŞAMBA


Kolay soru kolay cevap git stash apply

Sadece şube kontrol yaptığınız değişiklikleri istediğiniz, ve sonra git stash apply. git diff sonucu görmek için kullanın.

Değişiklikler apply iyi görünüyor senin ile yaptıktan sonra saklamak ve herhangi bir ihtiyacın olmadığına emin misin dahasonragit stash drop ondan kurtulmak için kullanın.

Ben her zaman git stash pop yerine git stash apply kullanmanızı öneririz. Farkı apply etrafında zula bakmak için apply, ya da, vb yeniden deneyin kolay bırakır. Eğer pop mümkün ayıklamak için zula, öyle hemen de drop ve eğer aniden gerçekleştirmek istediğin ayıklamak için başka bir yerde (farklı şube), ya da --index ya da bunun gibi, bu o kadar kolay değil. apply eğersana18 ** ne zaman seçeceğim.

Tüm oldukça küçük bir şekilde olsa, ve bir acemi gıt için, yaklaşık aynı olmalıdır. (Ve geri kalan herşey atlayabilirsiniz!)


Eğer daha gelişmiş ya da daha karmaşık şeyler yapıyorsan ne?

Orada en az üç ya da dört farklı "gıt kullanmanın yollarını saklamak gibi.", Yukarıdaki "yol 1", "kolay yolu":

  1. Temiz bir şube ile başlayan, bazı değişiklikler üzerinde çalışıyordu, ve sonra yanlış şube bunları yaptığını fark etti. Şu anda değişiklikleri almak istiyor ve "" başka bir şube için onları. sadece hareket

    Bu kolay bir durum, yukarıda açıklanmıştır. git stash save (veya düz git stash, aynı şey. Diğer şube kontrol ve git stash apply kullanın. Bu gıt önceki değişiklikleri, gıt oldukça güçlü birleştirme mekanizmasını kullanarak birleştirmek için alır.Sonuçları dikkatlice inceleyin(git diff ile) eğer onlar gibi olmadığını görmek için, ve eğer bunu yaparsanız, bırakma git stash drop zula kullanın. Bu kadar!

  2. Bazı değişiklikler başladı ve onları sakladı. Sonra başka bir dala geçiş ve daha fazla değişiklik, olanları sakladım sen bile unutmaya başladı.

    Şimdi devam et, hatta taşımak istiyorumbudeğişiklikler,vesenin de zula geçerlidir.

    Aslında git stash save git stash bir "" değişiklik. yığın yapar gibi tekrar edebilirsiniz İki düzenleme var bunu yaparsan, sadece stash—ama aynı zamanda stash@{0}stash@{1} yazılmış yazabilirsiniz aradı. git stash list (herhangi bir zamanda) hepsini görmek için kullanın. En yeni her zaman en düşük sayılı. Ne zaman yeni düşünceye 30**, ve üstüne stash@{1} hamle bir yığın. Eğer daha varsa, stash@{2} biri stash@{1} ve benzeri olur.

    36**. 34 ** 35 ** bir özel zula sonra da: Belirli bir zula bırakarak, yüksek numaralı sadece onlar yeniden numaralandırır. Yine, bir numarası olmadan bir de stash@{0}.

    Eğer düzenleme çok kazık, (stash@{7} istedim zula yoksa stash@{4}? oldukça dağınık alabilirsiniz Ben sadece başka bir itti, şimdi 8 kalacaklar ve 5?). Ben dalları isimleri var, çünkü ben şahsen yeni bir şube için bu değişiklikleri aktarmak için tercih, ve cleanup-attempt-in-December stash@{12} daha benim için çok daha anlamlı. (git stash komutu isteğe bağlı bir ileti kaydetmek ve bu yardımcı olabilir, ama bir şekilde, bütün zulaları sadece*. *43) adlı rüzgar alır

  3. (Ekstra gelişmiş) git stash save -p git add-ed ve/dikkatli kullandığınız veya-ed git rmgit stash save çalıştırmadan önce kodunuzun belirli bir bit. Dizin/saklanmış salonda bir versiyonu vardı, ve çalışma ağacında (farklı) başka bir versiyonu. Tüm bu korumak istiyorsanız. Şimdi* *48, ve bazen başarısız kullanın:

    Conflicts in index.  Try without --index.
    
  4. Test etmek için git stash save --keep-index kullandığınız taahhüt ne olacak"". Bu cevap; this other StackOverflow answer bakın kapsamı dışında yerine.

Karmaşık durumlar için, "" çalışma dizini ilk, şimdi herhangi bir değişiklik yapılıyor (Eğer isterseniz yeni bir şube üzerinde). temiz başlamanızı öneririm "Onları bir yere uygulama", içinde başka bir şey vardır, ve sadece değişiklikleri saklanmış çalışıyor olacaksın: . bu sayede

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, sen bir "temiz" bir başlangıç noktası. Ya da belki de daha çok şöyle bir şey:

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 temel şey bu."" . zula ^em>bir taahhüt, sadece biraz "anlamında değil," kayıt "dal". komik apply operasyon değiştirdi işlemek ne bakar, ve şimdi her neredeysen tekrar dener. Malı olmaya devam eder (apply tutar çevresinde), bak bu daha fazla veya karar bu oldu yanlış yere apply ve tekrar deneyin farklı, ya da her neyse.


Bir herhangi bir zaman git stash show -p ne basitleştirilmiş bir sürümü saklamak görmek için kullanabileceğiniz güvenli bir yere Sakla. (Bu basitleştirilmiş versiyonu sadece bakıyor "son iş ağacı" değiştirirdeğilkaydedilen Endeksi --index ayrı ayrı yükler değişir.) Komutu --index sadece o yapmaya çalışır olmadan 58**,aynısizin değişiklikler-dizin çalışma şimdi.

Bu zaten bazı değişiklikler varsa bile geçerlidir. apply bir komut için zulası uygulamak için mutludeğiştirilmişdizin (ya da en azından, bunu uygulamak için denemek için) çalışıyor. Örneğin, bunu yapabilirsiniz:

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

"Burada düzen, belli bir sırayla uygulamak için özel ayarları geri almak. uygulamak seçebilirsiniz Her zaman temelde bir yaptığını unutmayın,"", ve birleştirme Belgeleri uyarıyor: . gıt birleştirme

Çalışan gıt önemsiz olmayan kaydedilmemiş değişiklikler ile birleştirme cesareti: mümkün olsa da, zor bir durumda bırakabilir arka çıkmak durumunda bir çatışma.

Eğer temiz bir dizin ile başlarve sadece git apply birden fazla operasyon yapıyor, kolay geri: temiz bir duruma geri almak, ve apply işlemleri değiştirmek için kullanın. git reset --hard. (Bu karmaşık durumlar için temiz bir çalışma dizini ilk başlangıç, tavsiye ederim.)


Ne çok olası en kötü durum?

Diyelim yaptığını Çok İleri Git bir şey yaptın bir saklamak istediğiniz git stash apply --index ama artık mümkün için geçerli kaydedilmiş saklamak --index, çünkü şube var ayrılmaktadır bu yana çok zaman kurtardı.

Bu git stash branch ne.

Eğer:

  1. check outtam olarak işlemekorijinal stash, o zaman sen de buldun
  2. yeni bir şube oluşturmak, ve son olarak
  3. git stash apply --index

yeniden oluşturma denemesi değişiklikleri kesinlikleiş. Bu git stash branch newbranch yapıyor. (Ve daha sonra damla başarılı bir şekilde uygulanmış olduğu için Sakla.)


--index hakkında bazı son sözler (konu neydi?)

--index yaptıklarını açıklamak için basit, ama biraz karmaşık dahili:

  • Değişiklik olduğunda, 73 ** (ya da "sahne") commitönce onları ing.
  • git stash, çalıştırdığınızda böyleceolabilirher iki foo ** 77, dosyalar ama sadece bir tane sahnelenen düzenlenmiş.
  • Geri saklamak için sorduğunuzda, 78 **added şeyler s ve olursa güzel olabilirdeğilgit add non-eklenen şeyler. Eğer added foo zorg değil senden önce geri eğer, stash, aynı Kur için güzel olabilir. Ne değişiklik oldu ama sahnelenen, tekrar yapılması gerekiyor ama numaradan değil ne sahnelenen, tekrar sahnelenen olmalıdır;.

apply --index bayrağı işler bu şekilde çalışır. Eğer iş, ağaç temiz ise, bu genellikle işe yarıyor. Eğer iş, ağaç zaten added şeyler varsa, olsa da, bazı sorunlar olabilir. Eğer gidersen --index, apply tüm operasyon düzenledi/unstaged Kur korumak için denemez. Bunun yerine, sadece git makine birleştirme çalışmaları-ağaç kullanarak "stash bag" taahhüt ... ... çağırır. Eğer/unstaged sahnelenen korumak umurunda eğer, --index bırakmak git stash apply onun bir şey yapmak için çok daha kolay hale getirir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • JorteexHD

    JorteexHD

    20 NİSAN 2012
  • Moto Journal

    Moto Journal

    28 Mayıs 2007
  • Warner Bros. UK

    Warner Bros.

    6 HAZİRAN 2008