2016-04-13 4 views
1

Anladığım kadarıyla Git Stash, bir diffs koleksiyonudur. Ben tek bir dosya foo.txtGit Stash Diffs'i kaydederse, neden farklı bir dalda uygulanamaz?

ile bir bütün repo varsa

Yani, örneğin, dosyanın 32 satır sadece

Lorem Ipsum 01 
Lorem Ipsum 02 
Lorem Ipsum 03 
... 
Lorem Ipsum 30 
a first line: good 
a second line: bad 

olduğunu Ve herşeyi işledi.

Şimdi yeni bir şube oluşturmak:

git checkout -b feature123 

Ve şimdi bu dal üzerinde olduğumu, ben kelimeyi better için good ve worse için bad değiştirin.

Şimdi, sadece program yöneticimin gelip "Acil! 01 - 011 ve 02 - 022 arasında değişiklik yapmamız gerektiğini" varsayalım.

yüzden değişiklikleri saklamak ve daha sonra master dalına değiştirin:

git stash 
git checkout master 

ve onun istediği gibi 022 için 011 için 01 ve 02 değişti.

Ve ben master dalına daha önce "saklanmış" Değişiklikleri dahil etmek istiyorum ki:

git stash apply 

ama dışarı hata olacaktır: Neden o

error: Your local changes to the following files would be overwritten by merge: 
    foo.txt 
Please, commit your changes or stash them before you can merge. 
Aborting 

mı? Bu sadece diffs koleksiyonunu foo.txt'a uygulayamaz mı?

(PS Ben ilk taahhüt ve ardından git stash apply kullanın ve foo.txt için bu diffs uygulayabilecektir Ama taahhüt neden olmasın önce Yani git stash gerçekten sadece fark dosyaları bir koleksiyon kaydeder olabilir - tam tekrarlamak.? Bir koleksiyon fark dosyaları arasında ve daha sonra yapılacak bir git checkout . (bütün değişiklikleri iptal etmek) gerçek mi)

+0

Stash'd değişikliklerini uygulamadan önce yaptığınız değişiklikleri yaptınız mı? – sisyphus

+0

@sisyphus Sorunun, değişikliklerin ne zaman yapılmasının (veya saklanmasının) ve niçin 'git stash'nın değiştirilemeyen dosyalara neden uygulanamadığıdır. – tobiasvl

+1

Bu bir güvenlik mekanizması, ben bir tanesi için, değişimlerimin üzerine yazmamaya çok sevindim, en azından beni sahneye koymam. – Creynders

cevap

1

man git stash da apply için de geçerlidir pop altında aşağıdakileri,() diyor ki:.?

çalışma dizini aynı olmalıdır İçerik.

Yani onu foo.txt için fark dosyaları toplanmasını uygulayabilir, doğru, ama sen unstaged yerel değişiklikleri içeren değilse. Çalışma dizini ile dizin arasındaki fark konusunda kafa karıştırıyorsanız, belki de this answer yardımcı olabilir.

git add hei.txt'u çalıştırın ve stash'ı uygulayabilirsiniz.

+0

bu yüzden "Çalışma dizini diziyle eşleşmelidir" ifadesinin her şeyin sahnelenmesi gerektiği anlamına mı geliyor? (ya da her izlenen dosya sahnelenmeli mi?) Gerçekten de, sahnelenmesi gereken bir şey var mı? (yani ... insan sayfasının söylediklerinin yanı sıra, bunu yapmak için gerçekten iyi bir neden var mı?) –

+0

@ 太極 者 無極 而 生 git, yerel değişikliklerinizi bilmelidir (örn. dizine eklenmesi gerekir) çatışmaları çözebilmek için. Gitirken, git bir ref ('git reflog'da görebilirsiniz) oluşturur. Stash uyguladığınızda, stash ref indeks ref ile birleştirir. Bu aynı zamanda bir güvenlik ağı olarak da çalışır, çünkü eğer saklanma niyetiniz yapmadıysa, yerel değişikliklerinizi kaybedemezsiniz çünkü git değişikliklerinizi bilir. – tobiasvl

3

Git Stash, diffs koleksiyonudur.

Gerçekten değil. stash, taahhüt nesnelerinin bir koleksiyonudur, her biri projenin tam bir görüntüsünü kaydeder. git stash pop geçerli başlık, stash ve stash'ın dayandığı işlem arasında bir birleştirme yapar.

Yerel olarak değiştirilmiş dosyalar üzerinde Birleştirme işlemi için teoride mümkün olurdu, ama pratikte: "kötü birleştirmeleri yapmak için teşvik çünkü

  • Bu merge için gerçekten kötü bir fikir olur ", yani, aynı taahhütte hem birleştirme ile ilgili manuel değişiklikler var. Sonuç olarak, bir değiştirmenin yerel olarak değiştirilmiş dosyalara dokunması yasaklanmıştır ve stash, merge ile aynı mekanizmayı kullanmaktadır, dolayısıyla aynı şekilde yasaklamaktadır.

  • Bu dizin, şeyleri göründüğünden daha karmaşık hale getirir. Bir dosyada kayıtlı içerik barındıran ve buna bir saklanma uygulamak istediğinizde, saklanma uygulamasının sonunda dizinin içeriği ne olmalıdır diye tanımlamak için uygun bir yol olmaz. Aslında, stash pop dizinin çalışan ağaçla eşleştiği dosyalara dokunmasına izin verilir.

Not: Sorun farklı dallarda olması değil, ancak uncommited/unstaged değişiklikler olduğunu. feature123 şubesinde bu değişiklikleri yaptınız, ancak dalları git checkout master ile değiştirirken korunurlar.

+0

, değişiklikimin yalnızca 1 dosyada 1 karakter olup olmadığını söylerse, bu durumda bu işlem bir taahhüt nesnesi koleksiyonu olur, ancak bu durumda yalnızca 1 işlem nesnesi olur mu? Yani 2 dosya değiştirdiysem, o zaman 2 işlem nesnesi mi? 1 dosyaya ne dersiniz ama 1 ve 1 satırında 1 değişiklik 30 no'lu satırda değişiyor ... o zaman 1 commit nesnesi mi? Ya da sanırım, şu an elde etmeye çalışıyorum, sadece ... isimlendirilmemiş bir dalı kapalı olarak, tüm dosyalar işlendiğinde ... bu değişiklikleri başka herhangi bir duruma uygulayabilmek için "kiraz-çekme" yapabiliriz. ? –

+0

taahhütlü nesneler ile tam bir taahhüt anlamına gelmez mi? Bu yüzden, gidip geldiğinizde tamamen yeni bir dosya kaydedeceğimi bildiğim için, 15MB'lık bir metin dosyası oluşturduğumda, her satırda bir satır numarasıyla sadece 80 karakter uzunluğundaysa, dosyayı sadece 1 satır için düzenlerseniz ve taahhüt, tüm dizin şimdi 15MB. 1 satırı tekrar değiştirin ve şimdi tüm dizinin 30MB olduğunu unutmayın. Şimdi yeni bir özellik dalı oluşturup değiştirirseniz, 1 satırı düzenler ve 'git stash' yaparsanız, tüm dizin biraz daha büyüktür (1MB veya daha az). –

+0

(eğer ana bölüme geri dönersem, başka bir satırı değiştirir ve işlediysem, tüm dizin sadece boyut olarak artar. Belki de sıkıştırmadan kaynaklanır.) –