Başka bir şey üzerinde çalışırken bir dizi taahhüt edilmemiş değişikliği nasıl bir kenara bırakırım?


98

Bir dizi taahhüt edilmemiş değişikliğim varsa ve bunun yerine başka bir şey üzerinde çalışırken bunu bir kenara bırakmak istersem ve daha sonra (birkaç gün sonra fi) geri dönüp çalışmaya devam edin. Bunu başarmanın en kolay iş akışı ne olurdu? (Şimdiye kadar sadece Mercurial'in temel işlevleriyle ilgili deneyime sahibim). Her zamanki yöntemim klon kullanarak yeni bir dal oluşturmaktı, ancak daha iyi yollar da olabilir.

Yanıtlar:


133

Bir avuç seçeneğiniz var:

  1. Eşyaları rafa koyun . Bu, değişiklikleri kaydeder ve şubenin devam edebilmesi için çalışma dizininden kaldırır. Bir değişim seti yaratmaz.

    hg shelve --all --name "UnfinishedChanges"
    
    hg unshelve --name "UnfinishedChanges"
    

    Güncelleme / Düzenleme : Daha yeni mercurial sürümlerinin kullanılması gerekebilir

    hg shelve -n "UnfinishedChanges"
    hg unshelve "UnfinishedChanges"
    

    Yine --namede alternatif olarak kullanabilirsiniz -n, ancak mercurial --nameartık beğenmiyor gibi görünüyor . Ek olarak, --allartık gerekli değildir ve cıva aslında bu konuda çıldıracaktır.

  2. Yama kullanarak öğeleri sıraya koyunmq . Bu, bazı açılardan rafa kaldırılamayacak kadar farklı değil, ancak farklı davranıyor. Sonuç aynıdır, değişiklikler kaldırılır ve daha sonra isteğe bağlı olarak yeniden uygulanabilir. Basıldıklarında, yamalar mantıksal değişiklik kümeleridir, açıldığında başka bir yere kaydedilirler ve değişiklik kümesi geçmişinin bir parçası değildirler.

    hg qnew "UnfinishedWork"
    hg qrefresh
    hg qpop
    
    hg qpush "UnfinishedWork"
    
  3. Bunları yerel olarak işleyin, önceki değişiklik setine güncelleyin ve çalışmaya devam edin ve anonim şubeleri (veya birden çok başlığı) kullanın. Daha sonra değişiklikleri istiyorsanız, kafaları birleştirebilirsiniz. Değişiklikleri istemiyorsanız şunları yapabilirsiniz şerit değiştirme-set.

    hg commit -m"Commiting unfinished work in-line."
    hg update -r<previous revision>
    
    hg strip -r<revision of temporary commit>
    
  4. Onları adlandırılmış bir şubeye teslim edin. İş akışı daha sonra 3. seçenekle aynı hale gelir - hazır olduğunuzda birleştir veya ayır.

    hg branch "NewBranch"
    hg commit -m"Commiting unfinished work to temporary named branch."
    hg update <previous branch name>
    

Şahsen ben 3. veya 4. seçeneği kullanıyorum çünkü değişiklik setlerini çıkarmayı veya kısmi kodu iade etmeyi umursamıyorum (sonunda itilmediği sürece). Bu, gerekirse yerel değişiklik setlerinizi diğer kullanıcılardan gizlemek için yeni Aşama öğeleriyle birlikte kullanılabilir .

Ayrıca, rebasebir birleştirmenin kodun geçmişine herhangi bir şey eklemeyeceği durumlarda, değişim kümelerini hareket ettirmek için komutu kullanıyorum . Birleşmeler Önemli dallar arasındaki etkinlik (serbest bırakma dalları gibi) veya daha uzun ömürlü bir özellik dalındaki etkinlik için tasarruf etme eğilimindeyim. Bir de histeditdeğişim setlerini sıkıştırmak için kullandığım komut var, buradaki "gevezelik" değeri düşürüyor.

Yama kuyrukları da bunu yapmak için ortak bir mekanizmadır ancak yığın anlamlarına sahiptirler. Yamaları itip patlatırsınız, ancak yığındaki başka bir yamanın "altında" olan bir yama, üstündeki yamanın da itilmesini gerektirir.

Uyarı , tüm bu seçeneklerde olduğu gibi, rafa kaldırdığınız / sıraya koyduğunuz / dallara ayırdığınız geçici değişikliklerden bu yana dosyalarda daha fazla değişiklik varsa, ayırma / itme / birleştirme sırasında gereken birleştirme çözümlemesi olacaktır.


Harika cevap ve faydalı örnekler için teşekkürler. Hg yer imlerini kullanmanın da bir seçenek olup olmadığını biliyor musunuz?
Erik

@Erik Muhtemelen, ama kullanma deneyimim yok.
Adam Houldsworth

2
3. seçenekle ilgili yardımcı olmak için yer imleri kullanılabilir - değişikliğinizi saklamak için oluşturduğunuz revizyonu etiketlemek için birini kullanabilirsiniz. Görevi kendi başlarına yapamazlar.
Steve Kaye

seçeneği --alltanınmadı. yine de tüm değişiklikleri rafa kaldırmak varsayılan bir davranıştır.
naXa

@naXa Merhaba dostum, komutlarımdan biri biraz yanlışsa (belki sürüm değiştiği için), lütfen çekinmeden cevabı düzenleyin ve gerekirse onaylayacağım :-)
Adam Houldsworth

23

Şahsen, şu ana kadar gönderilen cevapların hiçbirini beğenmedim:

  1. Dallanmayı klonlamayı sevmiyorum çünkü her projenin sadece bir dizini olmasını seviyorum . Aynı anda farklı dizinler üzerinde çalışmak, editörlerimin son dosyalarının geçmişini tamamen karıştırıyor. Her zaman yanlış dosyayı değiştiririm. Yani artık bunu yapmıyorum.
  2. shelveHızlı düzeltmeler için kullanıyorum (yalnızca, yanlış dalda olduğumu fark edersem, beklenmedik değişikliklerimi başka bir şubeye taşımak için). Günlerden bahsediyorsun, bir şeyi günlerce rafa kaldırmam mümkün değil.
  3. Bence mqbu kadar sıradan bir durum için çok karmaşık

Bence en iyi yol, bu değişikliklere başlamadan ve oradan çalışmaya başlamadan önce değişiklik setine geri dönmekten daha basit bir şekilde değişikliklerinizi uygulamaktır. Bazı küçük sorunlar var, açıklamama izin verin:

Diyelim ki A değişiklik kümesine sahipsiniz. Sonra değişikliklerinize başlayın. Bu noktada bir süreliğine kenara koymak istersiniz. Her şeyden önce işinizi yapın:

hg ci -m "Working on new stuff"

İsterseniz, daha sonra tekrar gelmeyi kolaylaştırmak için bir yer imi ekleyebilirsiniz. Anonim şubelerim için her zaman yer imleri oluştururum.

hg bookmark new-stuff

Bu değişikliklerden önce değişiklik setine geri dönün

hg update A

Buradan, çalışır ve C değişikliklerini oluşturursunuz. Artık 2 kafanız (B ve C) var, itmeye çalıştığınızda uyarılacaksınız. O dalın başını belirterek yalnızca bir dalı itebilirsiniz:

hg push -r C

Veya new-stuffşubenin aşamasını gizli olarak değiştirebilirsiniz. Gizli değişiklik kümeleri aktarılmayacaktır.

hg phase -r new-stuff --secret --force

Detaylı cevap için teşekkürler! İnsanların bu (sıradan?) Sorunlar için iş akışlarını okumayı gerçekten seviyorum.
Erik

Bunun sadece bu durum mqiçin biraz fazla karmaşık olduğunu düşünüyorum , ancak bu da dahil olmak üzere yeterince geniş bir kullanım yelpazesine sahip, akıcı hale gelmek için zaman ayırmaya değer.
Norman Gray

12

Yerel taahhüt edilmemiş değişiklikleri korumak için benim için en kolay yol onları bir yama dosyası olarak kaydetmektir.

hg diff > /tmp/`hg id -i`.patch

ve önceki duruma dönmeniz gerektiğinde:

hg up <REV_WHERE_SAVED>
hg patch --no-commit /tmp/<REV_WHERE_SAVED>.patch

Ben şerit ediyorum /tmpve hg id -ive çok Windows'un üzerinde çalışacak.
anatoly techtonik

Ve hg uporada gerekli değildir.
anatoly techtonik

1
@techtonik Yamayı başka bir revizyona uygularsam ne olur? Özellikle yamalı dosyalar değiştirilirse.
mapcuk

Mercurial onu birleştirmeye çalışacak ve yine de çatışmayla uğraşmanız gerekecek.
anatoly techtonik

6

Deponuzu birden çok kez klonlayabilirsiniz. Bir kök klona sahip olma eğilimindeyim, sonra oradan birden fazla çocuk. Misal:

  • MyProject.Root
  • MyProject.BugFix1
  • MyProject.BugFix2
  • MyProject.FeatureChange1
  • MyProject.FeatureChange2

4 çocuğun tümü kökten klonlanır ve köke / kökten itin / çekin. Kök, daha sonra ağ / internet üzerindeki ana depodan bir yere iter / çeker. Kök, kişisel evreleme alanınız gibi davranır.

Yani sizin durumunuzda, yeni bir repo klonlayıp çalışmaya başlayacaksınız. Diğer depoda 'raflı' çalışmanızı yalnız bırakın. Bu kadar basit.

Tek dezavantajı, disk alanı kullanımıdır, ancak bu bir endişe olsaydı, DVCS'yi hiç kullanmayacaksınız;) Oh ve bu, Visual Studio "son projeler" listenizi kirletiyor, ama ne var.

[Aşağıdaki yorumları düzenleyin]: -

Sonuç olarak ... yaptığınız şey tamamen iyi ve normal. Aşağıdakiler doğru olduğunda çalışmanın mümkün olan en iyi yolu olduğunu iddia ediyorum: 1) kısa ömürlü 2) diğer geliştiricilerle işbirliği yapmanıza gerek yok 3) değişikliklerin tamamlanana kadar bilgisayarınızı terk etmesine gerek yok / itme süresi.


Şubeleri kullanmamanın bir nedeni var mı? Bunun için varlar ve repo-klonlamadan çok daha hızlılar.
Adam Houldsworth

Sorumda şunu belirttim: Her zamanki yöntemim klon kullanarak yeni bir dal oluşturmaktı, ancak daha iyi yollar olabilir.
Erik

1
@AdamHouldsworth, teknik olarak bunlar dallar ... sadece kısa ömürlü olanlar. Kısa ömürlü bir iş için adlandırılmış bir şube yapmak tamamen aptalca. Uzun ömürlü çalışma hikayeleri olan dallar adı verilen amacı kötüye kullanıyor.
nbevans

@NathanE Kısa ömürlü işler için adlandırılmış dalların "tamamen aptalca" olduğunu düşünüyorsanız, diğer hafif seçenekler gibi anonim dallanma, raflar veya yama kuyruğu da vardır. Bence yeniden klonlama, diğer seçenekler karşısında da aynı derecede aptalca - bu potansiyel bir fayda, iki VS örneğinde iki kod setinin açık olmasıdır, ancak bunu nadiren yapmak zorundayım, bu nedenle tabii ki klonları kullanmak olmaz Bana hizmet et. Sadece açıklama için, olumsuz seçen ben değildim.
Adam Houldsworth

@NathanE Ayrıca "uzun süreli iş hikayelerine" özel değiller, bu sadece sürekli entegrasyonu takip ederseniz iyi oldukları bir şey. Düz gelen docs : Başka bir şey üzerinde çalışmaya işin bir öğe raf yerse, bana bu bakılmaksızın öyle uzun ömürlü nasıl, sapma gibi geliyor "geliştirme sapmak satırları eğer Dallar meydana".
Adam Houldsworth
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.