Git'te, izlenmeyen saklanmış dosyaları zulayı uygulamadan göstermenin bir yolu var mı?


100

Çalıştırırsam git stash -uizlenmeyen dosyaları saklayabilirim. Ancak, söz konusu izlenmeyen dosyalar ile hiç görünmüyor git stash show stash@{0}. Zulayı uygulamadan izlenmemiş zulalanmış dosyaları göstermenin bir yolu var mı?

Yanıtlar:


121

İzlenmeyen dosyalar, zula kaydetmenin üçüncü üst öğesinde saklanır. (Bu aslında belgelenmemiştir, ancak -u özelliğini tanıtan commit, 787513 ... ve ifadeler için belgelerin geri kalanınıngit-stash yolu ... veya sadece yaparak oldukça açıktır git log --graph stash@{0})

Zulanın yalnızca "izlenmeyen" kısmını şu şekilde görüntüleyebilirsiniz:

git show stash@{0}^3

veya yalnızca "izlenmeyen" ağacın kendisi:

git show stash@{0}^3:

veya ağaçtaki belirli bir "izlenmeyen" dosya:

git show stash@{0}^3:<path/to/file>

Ne yazık ki, tüm aşamalı + aşamasız + izlenmemiş ve "mevcut" durum arasındaki farkların bir özetini almanın iyi bir yolu yoktur. yani: git show stash@{0}izlenmeyen dosyaları içerecek şekilde yapılamaz. Bunun nedeni, stash@{0}:zulalama işleminin ağaç nesnesinin üçüncü "aşamalanmamış" ebeveynden herhangi bir değişikliği içermemesidir.

Bunun nedeni, saklamaların yeniden uygulanma şeklidir: izlenen dosyalar kolayca yama olarak uygulanabilir, oysa izlenmeyen dosyalar yalnızca teorik olarak "tüm dosyalar" olarak uygulanabilir.


Yani, zula yürütmenin ebeveynleri (1. İşlem zulasına karşı yapılır 2. Dizin 3. İzlenmemiş çalışma kopyası) ve zula yürütmenin kendisi izlenen çalışma kopyasını içeriyor mu? git stash showçalışan kopya ile # 1 arasındaki farkı gösteriyor gibi görünür (git-stash.sh'den ilgili kod: git diff ${FLAGS:---stat} $b_commit $w_commitburada $ b_commit # 1 ve $ w_commit stash commit'dir); git stash show3 numarayı dahil etmenin yerleşik bir yolu var mı?
Max Nanasy

Dediğiniz gibi, ben bir stash tek özeti görünüm elde etmek için bir yol bulmuş değil, ama sizin için tek bir komutla kendi tam bilgileri görebilirsiniz: git log --graph --topo-order -m -u. matthewlmcclure.com/s/2014/01/10/…
Matt McClure

4
Bu zulada gerçekten izlenmemiş dosyalarınız yoksa (ama fatal: ambiguous argument 'stash@{0}^3': unknown revision or path not in the working tree.yaptığınızı sanıyorsunuz) çirkin bir hata ( ) alacağınızı unutmayın .
Randall

2
@antak: hayır, git stash showyok değil (en azından Git 2.7.4 için de geçerlidir) izlenmeyen dosyaları göstermek:
Norbert BERCI

1
Not (2.13.2-linux): git stash popönce izlenmeyen dosyaları geri yüklemeyi, ardından izlenen dosyaları geri yüklemeyi deneyecek. İkinci işlem başarısız olursa (örn. Çakışma), ilk işlem geri alınmaz (izlenmeyen dosya zulası olduğu gibi kalır, ancak dosyalar diskten kaldırılmaz), bu nedenle çatışmayı düzeltseniz bile bir sonraki açılır pencere başarısız olur neyse.
Marinos

22

Tüm zula kaydetme işlemlerini aşağıdaki komutla listeleyebilirsiniz:

git rev-list -g stash

Stash'ler, HEAD'in 3 yollu birleştirme kaydı, dizin ve izlenmeyen dosyaların ebeveyn içermeyen "kök" kaydı olarak temsil edildiğinden, izlenmeyen dosya zulaları, yukarıdaki çıktıyı aşağıdakilere yönlendirerek listelenebilir:

git rev-list -g stash | git rev-list --stdin --max-parents=0

Yukarıdakilerin faydalı uygulamaları:

Yalnızca izlenmeyen, saklanan dosyaları göster

git rev-list -g stash | git rev-list --stdin --max-parents=0 | xargs git show --stat

Elbette --stat, dosyaların içeriğini görmek için öğesini kaldırın .

Belirli bir dosyayı bulun

git rev-list -g stash | xargs -n1 git ls-tree -r | sort -u | grep <pattern>

İzlenmemiş dosyaları grep

git rev-list -g stash | git rev-list --stdin --max-parents=0 | xargs git grep <pattern>

Tüm zulaların tüm içeriğini listeleyin

git rev-list -g stash | git rev-list --stdin | xargs git show --stat

10

İzlenmeyen dosyaları zulada listelemek için:

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

Tüm izlenmeyen dosyaların (içerikli) tam bir farkını göstermek için:

git show stash@{0}^3

Bu komutlar son (en son) zulayı okur. Daha önceki zulalar için, "zula @" arkasındaki sayıyı artırın, örneğin stash@{2}son zuladan saniye için.

Bunun işe git stashyaramasının nedeni , her zula için stash@{0}, stash@{1}vb. Olarak başvurulabilen bir birleştirme kaydı oluşturmasıdır . Bu işlemenin ilk ebeveyni, zula sırasında HEAD'dir, ikinci üst öğe, izlenen dosyalardaki değişiklikleri içerir ve üçüncü (mevcut olmayabilir) izlenmeyen dosyalardaki değişiklikler.

Bu kısmen "Tartışma" altındaki kılavuzda açıklanmıştır .


5

Zuladaki tüm dosyaları (hem izlenen hem de izlenmeyen) görmek için, bu takma adı yapılandırmama ekledim:

showstash = "!if test -z $1; then set -- 0; fi; git show --stat stash@{$1} && git show --stat stash@{$1}^3 2>/dev/null || echo No untracked files -"

Görüntülemek istediğiniz zulaya ilişkin tek bir argüman alır . Yine de arka arkaya iki listede sunacağını unutmayın.

if...fiBölüm bash argüman değiştirir hiçbiri geçirildi eğer 0'a 1 $.


5

Çözüm: Dosyaları saklamadan önce hazırlamak git stash show -pbeklendiği gibi çalışacaktır.

git add .
git stash save

Not: Bu yol, etkileşimli bölümler eklemeye de güç verir, işte nasıl yapılır .
Dikkat: Önceden hazırlanmış bir çalışmanız olmadığından emin olun, aksi takdirde onu ayırt edemezsiniz.
Bu yararlı olabilir.

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.