Neden DVCS'lerin akılsızca taahhüt edilmemiş değişiklik fobisi var gibi görünüyor?


10

Bir SVN geçmişinden gelmek, DVCS sistemleri ile çalışırken alışılması en zor şeylerden biri, hepsinin bir saatli bomba gibi herhangi bir taahhüt edilmemiş değişikliği dikkate alma biçimidir .

Mercurial'ta, değişiklikleri almaya çalışırsanız ve çalışma kopyanızda herhangi bir taahhüt edilmemiş değişiklik varsa, gelen değişiklikleri birleştirmek için çembere atlamanız gerekir. Dalları değiştirmeye çalışın mı? Seni her şeyi rafa atmaya zorlayacak ve sonra diğer tarafta hemen raftan çıkarmalısın. (SVN'nin bu senaryolardan hiçbiriyle sorunu yoktur.)

Git de aynı şekilde. Bir projede başka bir geliştiriciyle yan yana çalışıyorum ve taahhütlerinden birini kirazımdan almaya çalıştım. Bana izin vermeyi reddetti çünkü çalışma kopyamda taahhüdünde değiştirilenden tamamen farklı dosyalarda taahhüt edilmemiş değişiklikler var . Birleştirme seçeneği bile yoktur; Görünüşe göre önce değişiklikleri saklamak zorundayım!

Bir kişi bu kadar aşırı dikkatle tamamen zararsız bir şeyi tedavi edecek olsaydı, buna "fobi", zihinsel bir bozukluk olarak görülmesi gereken irrasyonel bir korku derdim. Ancak Git ve Mercurial, iki farklı akıllı, rasyonel geliştirici ekibi tarafından tasarlandı, bu yüzden farkında olmadığım bir şey biliyorlar mı diye merak etmeliyim.

Taahhüt edilmemiş değişikliklere karşı bu tutumu haklı çıkaran teknik bir neden var mı? Ve eğer öyleyse, söz konusu sorun neden sadece DVCS'lerde var gibi görünüyor?


7
Bunların hepsi yerel şubenize önemsiz bir şekilde bakabileceğiniz bir şey değil mi? Diğer geliştiriciden birleştirme, üç kaynağı (sürümünüz, değişiklikleriniz, sürümleri) çözmeye çalışmak yerine gerçek bir birleştirme haline gelir. Ben bu alanda hiçbir uzman olsa da, bu yüzden temel dışı olabilir.
Telastyn

3
Telastyn'e katılıyorum. Sanırım görünüşte mantıksız kısıtlamalarla karşılaşmanızın nedeni Git'i deyimsel bir şekilde kullanmamanızdır. Git'in en güçlü yanlarından biri yerel olarak çalışabilmenizdir. Başka birinin kodunu çalışma kopyamda birleştirmek zorunda kalsaydım, önce cehennemin yerel olarak işlediğinden emin olurdum. Yerel taahhütler ucuz, temizlenmesi kolay ve inanılmaz bir güvenlik ağıdır. Git iş akışları bunun etrafında dönüyor (ve dolayısıyla uyarılar ve kısıtlamalar, sıralanmamış dosyalar üzerinde çalışmaktan ziyade taahhüt edeceğinizi varsayıyor) sürpriz değil.
MetaFight

3
@Telastyn: Hayır, yapamazsınız, çünkü yerel bir şubeniz için bile bir iade işlemi kesin bir neden gerektirir ve tarihte bir kayıt oluşturur. Dolayısıyla, henüz taahhüt edilmeye hazır olmayan bir şeyi kontrol ederseniz, sonunda uzak depodaki değişiklikleri zorlamaya hazır olduğunuzda, geçmişi yeniden yazmak için ek işlemlerden geçmediğiniz sürece bu tarih orada olacaktır. Bu benim bildiğim "önemsiz" tanımına uymuyor ve bana herhangi bir majör yararı olmadan fazladan karmaşıklık gibi geliyor.
Mason Wheeler

Gerçekten mi? "Anadan birleşme için stabilize XYZ" biraz yük mü, yoksa aşırı kibar bir tarihe mi gidiyor?
Telastyn

1
En azından anlaşılır olması için düzenleme yapmadan yayın için bir makale gönderir misiniz? O halde ilk taslak taahhüt dizinizi yayınlanmak üzere göndermeyin. Kodunuzu okuyacak herkesi büyük bir iyilik yapın: geri dönün ve ilk etapta bunu yapmak için öngörüye sahip olsaydınız yazdığınız taahhüt dizisini üretin. Etkileşimli rebase zor değil ..
jthill

Yanıtlar:


4
  1. DVCS-dünyasında taahhütler ucuzdur ve tarih değişkendir. WIP istediğiniz kadar "kirli" olabilir: ve "mevcut durumumu depolama için değişiklik kümesine bırak" a karşı hiçbir neden göremiyorum
  2. SVN geçmişi doğrusaldır, bu nedenle taslakları yeni revizyonlardaki değişikliklerle birleştirmeniz gerekir . DVCS (doğal olarak) DAG kullanır ve ayrıştırılmış geçmiş için ek kafa (kesinleştirme + çekme + yukarı çekme), getirilen harici değişikliklerle anında modifiye edilmiş çalışma dizininde birleştirmekten daha güvenlidir
  3. Subversion'da değiştirilmiş WC'ye geçiş yaptığınızda ( bazı düğüme ), bir potansiyel ek birleştirme işleminden ("eski haline getir" - "geçiş" - "birleştirme 1 devir aralığı" nın aksine) kurtulursunuz ve biliyoruz: birleşmeler SVN'de, DVCS'ler için hiç sorun olmasa da, aracın mükemmel tarafı değildir

Devam et

Bu bir fobi değildir, "sık sık taahhüt" görgü kurallarını takip etmek için (bazen sert) bir yaptırımdır (SVN kullanıcıları bazen bu tarzdan korkarlar)

Ve nihayet, hg qnew|qpop|qpushdüzgünlük ve düzen için küçük adil bir fiyat


1

Birleştirdiğinizde veya kiraz gittopladığınızda, hemen bir taahhüt oluşturursunuz. Bu taahhüt tamamlanana ve tarihin bir parçası oluncaya kadar işlem tamamlanmamıştır.

Şimdi, gitçalışma dizininizdeki taahhüt edilmemiş değişikliklerinizi gözden geçirmenize izin verilirse ne olur ? Birleştirme / kiraz toplama için dikkat etmeniz gereken değişiklikler / birleştirme çakışmaları ile kendinize tanıttığınız değişiklikler arasında ayrım yapmak için (az ya da çok) zor bir zamanınız olacaktır. Ayrıca, gerçekte ne yaptığınızı test etmeniz neredeyse imkansız olacaktır.

Böylece, birleştirme durumları için temiz bir çalışma dizinini zorlamak işleri basit ve yönetilebilir tutmaya yardımcı olur. Sonuçta, yapmanız gereken tek şey, birleştirmeden önce taahhüt edilmeyen değişikliklerinizi saklamak ve daha sonra bunları kaldırmaktır. İş akışında olduğunu unutmayın

git stash
git pull
git stash pop

iki (!) birleştirme işleminiz var. Son taahhüdünüzü gelen değişikliklerle birleştiren ve taahhüt edilmeyen değişikliklerinizi sonuçta elde edilen birleştirme taahhüdü ile birleştiren biri. Bu şekilde, sadece iki şeyi bir araya getirmeniz ve bu üç şeyi göz ardı etmeye çalışırken üç şeyi tek bir işlemde birleştirmekten kaynaklanan karışıklıklardan kaçınmanız gerekir. git stash/ git stash popKolay ve birleştirmede için kaydedilmemiş değişiklikleri görmezden olduğunu açıkça yapar.

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.