Git zulasına karşı fark


Yanıtlar:


1872

En son saklamaya bakın:

git stash show -p

Keyfi bir zulayı görün:

git stash show -p stash@{1}

Gönderen git stashMan sayfalarından:

Varsayılan olarak, komut diffstat'ı gösterir, ancak git diff olarak bilinen herhangi bir biçimi kabul eder (örn. Git stash show -p stash @ {1}, yama biçiminde en son ikinci stash'ı görüntülemek için).


72
stash@{0}varsayılan değerdir; bir argümana ihtiyacınız varsa, sadece daha önceki zulalara bakmak istiyorsanız.
Cascabel

52
Sağ. Ben sadece, diğer zıvanalara nasıl bakılacağı açıktı {0}.
Amber

74
Bu, stash ve geçerli çalışma dizini arasındaki farkı göstermez, ancak stash ve orijinal ebeveyn arasındaki farkı gösterir. Sağ? Manpage'ten: "Zemine kaydedilen değişiklikleri, saklanan durum ile orijinal üst öğesi arasındaki fark olarak göster."
Magne

14
@Amber - Doğru, mevcut çalışma ağacınız kirliyse de, önemli ve biraz daha karmaşık hale getiriyor. Bu açıdan geldim ve aşağıdaki cevabımda paylaştığım bir prosedür buldum.
Magne

6
ne anlama geliyor -p?
Gerald

308

En son saklananları görmek için:

git stash show -p

Keyfi bir zulayı görmek için:

git stash show -p stash@{1}

Ayrıca, herhangi bir dal ile stash karşılaştırmak için git diff kullanın.

Kullanabilirsiniz:

git diff stash@{0} master

Şube yöneticisine kıyasla tüm değişiklikleri görmek.


Veya şunları kullanabilirsiniz:

git diff --name-only stash@{0} master

Kolayca sadece değişen dosya adlarını bulmak için.


10
Bu özel soruya cevap vermiyor. Stash'ı master'dan oluşturduysanız (daha sonra çalışmak için kaydetmek için), o zaman master'daki diğer işler için bazı taahhütler yapın, sonra git diff stash@{0} masteryapın, mevcut master'a karşı stashınızın bir farkını alırsınız (bu, stash'tan sonra master'da yapılan işi içerir) ), saklamanın değişeceği dosyalar / satırlar değil, sorunun ne olduğu.
Tom De Leu

52
Kesin sorunun cevabı olmasa bile soruyu cevapladığınıza sevindim. Daha fazla bilgi verdi ve bence bir dal ile onu karşılaştırmak istediğiniz diğer dallar arasında nasıl bir fark olacağını bilmek harika. Ayrıca
Rebekah Waterbury

6
Bu aynı zamanda özel bir fark görüntüleyici kullanarak farklılıklara bakmayı sağlar, örneğingit difftool --tool=... stash@{0} HEAD
Andre Holzner

9
@TomDeLeu İyi gözlem ve önemli bir nokta. Bir saklamak öğesini ebeveyniyle karşılaştırmak için bu işe yarıyor gibi görünüyor:git diff stash@{0}^ stash@{0}
erikprice

1
Ayrıca git diff stash@{0} master -- filename, değişiklikleri belirli bir dosyaya almak için dosya adını ekleyebilirsiniz .
David

104

Saklı değişikliklerinizin dayandığı dal bu arada değiştiyse, bu komut yararlı olabilir:

git diff stash@{0}^!

Bu zulayı dayandığı taahhütle karşılaştırır.


çok iyi için bir takma ad ekledim ~/.gitconfig:laststash = diff stash@{0}^!
sbeam

5
Mükemmel çift: git difftool stash^!kesinleşmeye karşı git difftool stash HEADson
saklamanın farkına


"git diff stash @ {0} ^!" "git diff stash @ {0} ^ stash @ {0} ~ 1 ^ stash @ {0} ~ 2 ......." olarak kaynar, ancak git diff yalnızca 2 işlem aldığında, stash arasındaki farkı gösterir @ {0} ve ^ stash @ {0} ~ 1 ve 2. taahhüdün başındaki ^ ifadesi farklı değildir ve git bunu görmezden gelir.
Naga Kiran

Bu sürümün tercih edilen fark aracımı kullanabilmesini tercih ederim (Elbette Karşılaştırmanın ötesinde!). Bu, aynı zamanda, asıl soru olduğuna inandığım bu stashtaki değişikliği, sadece "stashed diff'den daha fazlasını gösteren" git diff stash @ {X} ^ stash @ {X} "yorumlarında belirtilen bir alternatifin aksine gösterir.
user107172

44

Çalışan ağacınız kirliyse , önce kirli çalışan ağacı işleyip ardından saklamakla karşılaştırarak sakla ile karşılaştırabilirsiniz. Daha sonra, kirli çalışan ağaçla olan taahhüdü geri alabilirsiniz (çünkü taahhüt günlüğünüzde bu kirli taahhüdü almak istemeyebilirsiniz).

İki yaklaşımı birbiriyle karşılaştırmak için aşağıdaki yaklaşımı da kullanabilirsiniz (bu durumda ilk başta saklananlardan birini açmanız yeterlidir).

  • Kirli çalışma ağacınızı uygulayın:

    git add .
    git commit -m "Dirty commit"
    
  • Bu taahhüdü saklayın:

    git diff HEAD stash@{0}
    
  • Daha sonra, taahhüdü geri alabilir ve çalışma dizinine geri koyabilirsiniz:

    git reset --soft HEAD~1
    git reset .
    

Şimdi kirli çalışma ağacını zulanızla ayırdınız ve başlangıçta bulunduğunuz yere geri döndünüz.


Bunu yapmanın bir yolu var mı ama sadece saklamak içindekiler tarafından değiştirilecek dosyaların bir farkını görmek için?
lagweezle

In 2020 bu çok daha kolaydır; Benim kontrol yukarı güncel cevabı .
David Deprost

İlginç, bilmiyordum git stash show -l . En son saklamayı çalışan (kirli) kopyaya göre farklılaştırıyor mu? Almadan nasıl kullanıyorsunuz error: switch l requires a value?
Magne

Evet, aslında (muhtemelen kirli) çalışan kopyaya göre farklılık gösterir. Sadece girerek kullanabilirsiniz git stash show -l. Neden sizin için işe yaramazsa, sadece git'in eski bir sürümünde olabileceğinizi tahmin edebilirim? Git v2.20.1'deyim ve hatasız çalışır.
David Deprost

25

@ Magne'nin cevabı , sorunun en esnek / yararlı yorumunu cevaplayan tek (çok geç) bir tarihtir, ancak gerekenden daha karmaşıktır. Taahhüt ve sıfırlama yerine, sadece çalışma kopyanızı saklayın, karşılaştırın, ardından taslağını kaldırın.

git stash save "temp"
git diff stash@{0} stash@{1}
git stash pop

Bu, çalışma klasörü değişikliklerinizi geçici olarak stash yığınının tepesine (stash @ {0}) yaparak, stash yığınının üst kısmı ile çalışma klasörünüz arasındaki farkları gösterir, orijinal yukarıdan aşağıya (stash @ {1}) ) daha sonra orijinal üst kısmını 'yeni küme' konumunda kullanarak karşılaştırarak mevcut işinizin üstüne uygulamanızdan kaynaklanabilecek değişiklikleri görebilirsiniz.

"Peki ya şimdiki işim yoksa?" O zaman normal sıkıcı durumdasınız. @ Amber'ın cevabını kullan

git stash show

veya @ czerasz'ın cevabı

git diff stash@{0}

veya saklamanın ve sökmenin hızlı ve kolay olduğunu itiraf edin, sadece değişiklikleri kaldırın ve inceleyin. Şu anda istemiyorsanız, onları atın (geçerli dizin / çalışma klasörü değişir). Tam olarak bu

git stash apply
git diff
git reset
git checkout

3
Bu basit yaklaşım (saklamak ve daha sonra başka bir saklamakla karşılaştırmak) güvenli ve anlaşılması kolaydır. Bazı kullanım durumlarında, izlenmeyen dosyaları şu şekilde saklamak isteyebilirsinizgit stash save -u
mleonard

19

Bu git sürüm 1.8.5.2 benim için çalışıyor:

git diff stash HEAD

2
Yanıltıcı! Soru şudur: Boşaltmanın mevcut çalışma ağacında yapacağı değişiklikleri nasıl görebilirim? Bu, stash ve HEAD arasındaki farkın, uygulanacak olandan çok farklı olabileceğini gösterir git stash apply.
MikeJansen

Lütfen "Uygulamadan önce hangi değişikliklerin yapılacağını bilmek istiyorum!" Sorusunu daha fazla okuyun. Buna hızlı bir cevap veriyorum.
yerlilbilgin

Ayrıca, diğer tüm cevapların bir şekilde mevcut kafayı (veya çalışma setini) saklamaya karşı dağıtmak olduğunu görebilirsiniz. Neden sadece cevabım yanıltıcı? Bu Adil Değil.
yerlilbilgin

@yerlilbilgin Cevabınızdaki cevabımı aşağıda görebilirsiniz.
MikeJansen

KAFA ommit edebiliriz, varsayılan olarak değil mi?
Al.G.

10

Her halükarda, çalışma ağacındaki ve stash'daki bir dosyayı karşılaştırmak için aşağıdaki komutu kullanın

git diff stash@{0} -- fileName (with path)

9

Diff için araçlarınız varsa (karşılaştırmanın ötesinde olduğu gibi)

git difftool stash HEAD

1
Yanıltıcı! Soru şudur: Boşaltmanın mevcut çalışma ağacında yapacağı değişiklikleri nasıl görebilirim? Bu, stash ve HEAD arasındaki farkın, uygulanacak olandan çok farklı olabileceğini gösterir git stash apply.
MikeJansen

1
Bunun yanıltıcı olduğunu düşünüyorsanız, lütfen diğer tüm yanıtları kontrol edin. Bu Adil Değil!
yerlilbilgin

1
Aynı yorumu yanıltıcı olan diğer cevaba da kopyaladığımı not edeceksiniz (hemen hemen aynı cevap). Zaten benzer bir yorumu olan diğer cevapları yalnız bıraktım. Git stash'ın nasıl çalıştığını anlarsanız, stashın HEAD'a yayılmasının uygulanan şey olmadığını (OP'nin sorduğu şey) fark edeceksiniz. Gerçek "saklamak" saklanma taahhüdü ile ondan önce olan arasındaki farktır. Bu yama daha sonra HEAD'a uygulanır. Bu nedenle OP'nin ne istediğini bilmek istiyorsanız, stash ve ondan önceki taahhüt arasındaki farkı göstermelisiniz, doğru cevapların yaptığı.
MikeJansen

1
Bu, soruyu diğer (gereksiz) uzun cevaplardan daha doğrudan cevaplar ve OP'nin sorduğu soruları tam olarak kaldırır HEAD. @ Yerlilbilgin 'in HEAD' ı kaldırmasına yönelik cevabını değiştirebilirim ama git kullanan herkes bu parçayı çözebilir ve cevabı uzatmak beni daha az okunabilir hale getirir. @ Yerlibilgin'e suçlama yok.
Sridhar Sarnobat

4

Bunu hiçbir şey hareket ettirmeden yapmanın bir yolu patchgit diff'in (temelde birleşik diffs) okuyabileceği gerçeğinden faydalanmaktır.

git stash show -p | patch -p1 --verbose --dry-run

Bu, yamanın normalde ne yapacağının adım adım önizlemesini gösterir. Bunun ek yararı, yamanın yamayı çalışma ağacına yazmasını engellememesidir, eğer herhangi bir nedenle, değişiklik yapmadan önce çalışmaya başlamak için gitmeniz gerekiyorsa, devam edin ve kaldırın - kuru- çalıştırın ve ayrıntılı talimatları izleyin.


2

Ben bu konu ve bu bir ne öğrendim birleştirerek , ben "stash içinde ne olduğunu görmek istiyorum", ben ilk çalıştırmak:

git stash show stash@{0}

Bu, hangi dosyaların değiştirildiğini gösterecektir. Sonra, bir diftoolde güzel bir görsel fark elde etmek için şunu yaparım:

git difftool --dir-diff stash@{0} stash@{0}^

Bu, verilen saklamanın ebeveyne karşı bir kerede tüm farklılıkları gösterecektir.

Fark aracını ~/.gitconfig, örneğin Meld ile yapılandırabilirsiniz. :

...
[diff]
    tool = meld

1

FWIW Bu, diğer tüm cevaplara biraz fazlalık getirebilir ve kabul edilen yanıta çok benzer; ama belki birine yardım eder.

git stash show --helpsize ihtiyacınız olan her şeyi verecek; stash gösterisi bilgileri dahil.

göster [<stash>]

Zulaya kaydedilen değişiklikleri, saklanan durum ile orijinal üst öğesi arasındaki fark olarak gösterin. Hayır verildiğinde, en sonuncusu gösterilir. Varsayılan olarak, komut diffstat'ı gösterir, ancak git diff olarak bilinen herhangi bir biçimi kabul eder (örn. Git stash show -p stash @ {1}, yama biçiminde en son ikinci stash'ı görüntülemek için). Varsayılan davranışı değiştirmek için stash.showStat ve / veya stash.showPatch yapılandırma değişkenlerini kullanabilirsiniz.


1

O saklamak listesi

git stash list 
stash@{0}: WIP on feature/blabla: 830335224fa Name Commit
stash@{1}: WIP on feature/blabla2: 830335224fa Name Commit 2

Bu nedenle saklamak numarasını alın ve yapın:

Yapabilirsin:

 git stash show -p stash@{1}

Ama bir fark istiyorsanız (bu saklamak için farklıdır, bu yüzden bu cevabı yazıyorum. DiffDalınızdaki mevcut kodu düşünün ve showne uygulayacağınızı gösterin )

Kullanabilirsiniz:

git diff stash@{0}

veya

git diff stash@{0} <branch name>

Yapılacak bir başka ilginç şey:

git stash apply
git stash apply stash@{10}

Bu, stash'ı listeden çıkarmadan uygular, git checkout .bu değişikliği kaldırabilir veya git stash drop stash@{10}listeden bir stash kaldırmaktan mutluluk duyarsanız .

Buradan ben kullanmayı tavsiye asla git stash popve bir arada kullanmak git stash applyve git stash dropyanlış dalında zulası uygularsanız ... iyi bazen kodunuzu kurtarmak için zordur.


1

Zulayı neyle karşılaştırmak istediğinize bağlı olarak (yerel çalışma ağacı / ebeveyn taahhüdü / kafa taahhüdü), aslında eski git diffve daha spesifik olan birkaç komut vardır git stash show:

╔══════════════════════╦═══════════════════════════════╦═══════════════════╗
║ Compare stash with ↓ ║ git diff                      ║ git stash show    ║
╠══════════════════════╬═══════════════════════════════╬═══════════════════╣
║ Local working tree   ║ git diff stash@{0}            ║ git stash show -l ║
║----------------------║-------------------------------║-------------------║
║ Parent commit        ║ git diff stash@{0}^ stash@{0} ║ git stash show -p ║
║----------------------║-------------------------------║-------------------║
║ HEAD commit          ║ git diff stash@{0} HEAD       ║   /               ║
╚══════════════════════╩═══════════════════════════════╩═══════════════════╝

İken git stash showilk görüşte görünüyor daha kullanıcı dostu, git diffaslında daha güçlü bir daha odaklanmış fark için dosya belirterek gelinebileceğini içindedir. Şahsen benim zsh git eklentisinde tüm bu komutlar için takma adlar kurdum .

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.