Git önbelleğe alınmamış: tüm aşamalanmamış değişiklikler nasıl kaldırılır?


102

Git tarafından versiyonlanan bir projede iki değişiklik setinin yapıldığını varsayalım. Bir set sahneleniyor, diğeri değil.

Projemi bu durumda çalıştırarak (kaydetmeden önce) aşamalı değişiklikleri yeniden kontrol etmek istiyorum. Tüm aşamalı olmayan değişiklikleri ortadan kaldırmanın ve yalnızca aşamalı olarak bırakmanın basit bir yolu nedir? Bu yüzden, aşamalı olmayan değişikliklerin projemden kaybolması, ancak daha fazla çalışma için bir yerde saklanmasına ihtiyacım var.

Bu git stashkomuta çok benziyor . Ancak git stashhem aşamalı olmayan hem de aşamalı değişiklikleri projemden uzaklaştırırdı. Ve buna benzer bir şey bulamıyorum git stash uncached.


1
Bugün itibariyle 2.21 sürümümle, buna hala iyi bir cevap yok. Aşağıdaki tüm yanıtlar ya yanlıştır ( -kisteğe bağlı) ya da kullanımı zahmetlidir.
Penghe Geng

Yanıtlar:


103

Güncelleme 2:
İnsanların bu cevaptan neden şikayet ettiklerinden emin değilim, benimle mükemmel çalışıyor gibi görünüyor, izlenmemiş dosyalar için -ubayrağı ekleyebilirsiniz.

Tam komut, git stash --keep-index -u

Ve işte git-stashyardımdan bir parça

--Keep-index seçeneği kullanılırsa, dizine önceden eklenmiş tüm değişiklikler olduğu gibi bırakılır.

--İnclude-untracked seçeneği kullanılırsa, izlenmeyen tüm dosyalar da saklanır ve ardından git clean ile temizlenir ve çalışma dizini çok temiz bir durumda kalır. Bunun yerine --all seçeneği kullanılırsa, izlenmeyen dosyalara ek olarak yok sayılan dosyalar saklanır ve temizlenir.

Ve bu nasıl göründüğünü gösteren bir gif:

görüntü açıklamasını buraya girin

Güncelleme:

Seçilen cevap bu olsa da, birçok kişi [aşağıdaki cevabın] (https://stackoverflow.com/a/34681302/292408) doğru cevap olduğuna işaret etti, kontrol etmenizi öneririm.

Cevabımı bugün (31/1/2020) git sürümüne karşı tekrar test ettim 2.24.0ve hala doğru olduğuna inanıyorum, yukarıda izlenmeyen dosyalar hakkında küçük bir not ekledim. Çalışmadığını düşünüyorsanız, lütfen git sürümünüzü de belirtin.

Eski cevap :
Eğer --keep-indexseçenek kullanıldığında, zaten dizinine eklenecek tüm değişiklikler bozulmadan kalır:

git stash --keep-index

Gönderen belgelenmesigit-stash :

Kısmi kaydetmeleri test etme

Sen kullanabilirsiniz git stash save --keep-indexEğer iş ağacındaki değişiklikler dışında iki veya daha fazla kaydedilmesini yapmak istediğinizde ve taahhütte bulunmadan önce her bir değişikliği test etmek istiyorum:

# ... hack hack hack ...
$ git add --patch foo            # add just first part to the index
$ git stash save --keep-index    # save all other changes to the stash
$ edit/build/test first part
$ git commit -m 'First part'     # commit fully tested change
$ git stash pop                  # prepare to work on all other changes
# ... repeat above five steps until one commit remains ...
$ edit/build/test remaining parts
$ git commit foo -m 'Remaining parts'

Ancak, yalnızca aşamalı değişiklikleri görsel olarak kontrol etmek istiyorsanız, deneyebilirsiniz difftool:

git difftool --cached

4
ayrıca git stash [-p|--patch]hangisinin etkileşimli zula gibi hissettirdiğine bakın. Gönderen man git stash"--patch ile, etkileşimli HEAD ve çalışma ağaca saklanmış olması arasındaki fark gelen hunks seçebilir."
burada

1
Genellikle add -p, checkout -pve reset -pçalıştı, asla stash -pD:, ipucu için teşekkürler
Mohammad AbuShady

22
Bu cevabın, hazırladığınız değişiklikleri de saklayacağını unutmayın.
Ben Flynn

2
Bu cevap, kafa karışıklığına neden olacağı için gerçekten yararlı değil. Bu cevap daha iyi stackoverflow.com/a/34681302/292408 .
Elijah Lynn

1
@ElijahLynn Daha iyi cevap olduğunu söyleyen birçok insan bulduğum için diğer cevaba bağlandım, yorumunuz için teşekkürler
Mohammad AbuShady

110

Kabul edilen yanıt, birkaçının da işaret ettiği gibi, aşamalı değişiklikleri de saklar. İşte aşamalı değişikliklerinizi zulaya almadan yapmanın bir yolu.

Buradaki fikir, aşamalı değişikliklerinizin geçici bir kaydını yapmak, ardından aşamalı olmayan değişiklikleri saklamak, ardından geçici kesinlemeyi kaldırmaktır:

# temp commit of your staged changes:
$ git commit --message "WIP"

# -u option so you also stash untracked files
$ git stash -u

# now un-commit your WIP commit:
$ git reset --soft HEAD^

Bu noktada, aşamalı olmayan değişikliklerinizin bir zulasına sahip olacaksınız ve yalnızca aşamalı değişiklikleriniz çalışma kopyanızda mevcut olacak.


22
Bu gerçekten doğru cevap IMO. --keep-indexBugün için kabul cevap seçeneği hala, sadece endeks içinde ne miktarlarsa da endekste tutar. Böylece kopyalanır ve neşe doğar.
Ken Williams

4
@KenWilliams <del> komiklik </del> <ins> trajedi </ins>
tuespetre

@KenWilliams Bu beni gerçekten rahatsız etti. OP Lütfen seçilen cevabı ayarlayabilir misiniz?
MikeMurko

2
git add .Adım geliştirilebilir isteyebilirsiniz git add --allbu da geçerli çalışma dizininin üstünde bir dizindeki dosyaları kapmak gerektiği gibi.
Elijah Lynn

1
Kabul edilen yanıttaki --keep-index seçeneği yanıltıcı olduğundan şu ana kadarki en iyi yanıt budur. Kabul edilen cevap bu olmalıdır.
Elijah Lynn

22

Yalnızca aşamasız değişikliklerimi gerçekten saklayan bir şeye ihtiyacım olduğu için işaretli cevabın benim için işe yaramadığını fark ettim. İşaretli cevap, git stash --keep-indexhem aşamalı hem de aşamasız değişiklikleri saklar. --keep-indexBölüm sadece yanı çalışma kopyasında sağlam endeksi bırakır. Bu OP için işe yarıyor, ancak yalnızca cevabını istediğinden biraz farklı bir soru sorduğu için.

Hazırlanmamış değişiklikleri saklamanın tek doğru yolu, zulayı hiç kullanmamaktır:

git diff > unstaged.diff
git apply -R unstaged.diff

git checkout -- .yerine de çalışacaktır apply -R.

Çalış çalış çalış...

git apply unstaged.diff
rm unstaged.diff

1
Burada üzerinde git version 2.6.1.windows.1, git stash -kaçıklandığı gibi çalıştı.
koppor

Kabul edilen cevap bu olmalı! Bu, birden çok stackoverflow iş parçacığında, iddia ettiği şeyi yapan ve geçici taahhütlere dayanmayan tek kişidir!
user643011

1
@ user643011: Geçici kayıtlar git'te kötü bir şey değildir. Hiçbir maliyeti yoktur ve kimseye zarar vermezler.
Fritz

2
@Fritz: Bazı senaryolarda geçici taahhütler mümkün değildir. Mevcut çalışma kodunu kontrol eden bir ön işleme kancanız varsa başarısız olabilir. Aşamalı değişiklikleriniz iyiyse ancak aşamalı olmayan değişiklikleriniz değilse, bu yaklaşım aşamalı değişiklikleri gerçekleştiremeyecektir.
Penghe Geng

1
Bu izlenmeyen dosyaları içermez. Diff yamasındakileri bulmak ve eklemek için "git ls-files" kullanmanız gerekir
ACyclic

5

Git: Aşamasız değişiklikleri saklayın

Bu, git eklemediğiniz tüm değişiklikleri saklayacaktır:

git stash -k

Yeni oluşturulan (ve eklenmeyen) dosyaların siz de -uanahtarı kullanmadıkça çalışma dizininizde kalacağını unutmayın .

git stash -k -u 

Ayrıca, daha sonra git stash pop'u kullandığınızda çalışma dizininiz temiz olmalıdır (yani tüm değişikliklerin eklenmesi gerekir).

http://makandracards.com/makandra/853-git-stash-unstaged-changes


14
Bu eşdeğerdir git stash --keep-index. Hazırlanmış dosyalar zulaya dahil edilir.
Benjamin Cheah
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.