Neden çözülmemiş değişiklikler yapmıyorsunuz?


15

Geleneksel bir VCS'de neden çözülemeyen dosyaları işlemeyeceğinizi anlayabiliyorum çünkü derlemeyi bozabilirsiniz. Ancak, neden bir DVCS'de çözülmemiş dosyaları yürütmemeniz gerektiğini anlamıyorum (bazıları aslında dosyaları işlemenizi engelleyecektir ).

Bunun yerine, deponuzun itme ve çekme işleminden kilitli olması gerektiğini , ancak taahhütte bulunmaması gerektiğini düşünüyorum .

Birleştirme işlemi sırasında işlem yapabilmenin birkaç avantajı vardır (gördüğüm gibi):

  • Gerçek birleştirme değişiklikleri geçmişte.
  • Birleştirme çok büyük olsaydı, periyodik taahhütler verebilirsiniz.
  • Bir hata yaptıysanız, geri almak çok daha kolay olurdu (tüm birleştirmeyi yeniden yapmak zorunda kalmadan).
  • Dosyalar çözümlendi olarak işaretleninceye kadar çözümlenmemiş olarak işaretlenmiş olarak kalabilir. Bu itmeyi / çekmeyi engelleyecektir.

Ayrıca, tek bir küme yerine birleştirme işlevi gören bir dizi değişiklik kümeniz de olabilir . Bu, gibi araçları kullanmaya devam etmenizi sağlar git rerere.

Peki neden çözülemeyen dosyalarla uğraşmak kaşlarını çattı / engellendi? Gelenek dışında bir sebep var mı?


1
Kim tarafından kaşlarını çattı veya engellendi?
pdr

@pdr Üzerinde çalıştığım bazı geliştiriciler kaşlarını çattı. En azından hg 1.6birleştirme işleminden sonra dosyalar çözülmemiş olarak işaretlenir. hgolacak değil çözüldü olarak bunları işaretlediğiniz kadar taahhüt izin (ille aslında bunları çözmek zorunda anlamına gelmez, ama bir fikir olduğunu varsaymak olacaktır).
Patlama Hapları

1
Yani "çözülemeyen dosyalar" ile, aslında "çözülmemiş birleştirmeler" anlamına mı geliyorsunuz?
pdr

@pdr no, hgaslında "çözüldü" olarak işaretlenmiş veya işaretlenmemiş dosyaların bir listesini tutar (kullanarak hg resolve). UBu listede herhangi bir dosya varsa , işlem yapmanıza izin vermez.
Patlama Hapları

1
hg resolveözellikle çatışmalarla birleşmeler için kullanılır; bkz. selenic.com/mercurial/hg.1.html#resolve . Note that Mercurial will not let you commit files with unresolved merge conflicts. You must use hg resolve -m ... before you can commit after a conflicting merge.
Mike Partridge

Yanıtlar:


6

Görebildiğim en büyük sorun, şeylerin yarı birleştirildiği ve (muhtemelen) düzgün çalışmadığı bir taahhütler penceresi oluşturmasıdır. Nihai yerel taahhütler setini zorladığınızda, tüm bu ara taahhütler de herkes için geçerli olacaktır. İdeal dünyada, herhangi bir taahhütte bulunabilmeliyim ve kod çalışmalı. Birleştirme işlemlerinin ortasında işlemeye başlarsanız, kodun durumu iyi tanımlanmamıştır.

Yapabileceğiniz bir şey birleştirme için yerel taahhütler yapmak ve sonra itmek zaman onları büyük bir taahhüt içine demet (gerçi herhangi bir vcs bunu nasıl destekleyecek emin değilim). Bu, bahsettiğiniz faydalardan bazılarını sağlasa da, ekstra karmaşıklığa değdiğinden emin değilim (zaten oldukça kafa karıştırıcı ve karmaşık bir alanla ilgileniyoruz).


5
Herhangi bir taahhütte bulunma ve işe alma yeteneğine katıldığımı bilmiyorum .. Bir DVCS'de taahhüt etmenin bir çok noktası ilerlemenizi taahhüt etmektir , bu yüzden şeyler çoğu zaman kırılmaya veya eksik kalmaya bağlıdır .
Patlama Hapları

2
Her zaman çalışma taahhütlerine sahip olmanın bazı güzel faydaları vardır. Örneğin, bir hatanın ne zaman tanıtıldığını izlemeye çalışıyorsanız, bir şeyin ne zaman kırıldığını görmek için geçmişi geçebilmeniz yararlı olur (vcs, geçmişte ikili arama yapmak için komutlara bile sahiptir). Çalışma taahhüdünüz yoksa, hataları etkili bir şekilde izleyemezsiniz.
Oleksi

1
Git paketlenmiş taahhütleri destekler.
deltree

3

Git'e en çok aşinayım, bu yüzden bu perspektife cevap vereceğim.

Siz veya herhangi bir iyi VCS'nin özellikle kod ise birleştirilmemiş bir dosyaya izin vermek istemesinin bir nedenini görmüyorum . Depoyu tutarlı bir durumda tutmanız gerekir ve önerdiğiniz şey taahhüt atomikliğini ihlal eder. Birçok VCS, çatışmanın nerede olduğunu göstermek için dosyayı fiziksel olarak değiştirir - Git, SVN ve CVS >>>> <<<< tipi işaretleyicileri kullanır. Atomik depo düzeyindeki bir VCS'de işlem yapar ve birleşir, sizden başka kimseye bir anlamı olmayan bir düğüm yaratırdınız. Yazılım geliştirmede projeniz oluşturulamadı. Bir grubun belgesinde hiç kimse hangi değişikliklerin doğru olduğunu bilmiyor.

Git, izin vermeyi düşündüğünüz taahhüt türü olan bunu kolaylaştıracak bazı araçlar sunuyor. Örneğin, birleştirmeden önce birleştirdiğiniz tüm işlemleri ezebilirsiniz. Bu, tipik bir birleştirme taahhüdü ile aynı olmaktan çıkmaktadır.

Avantaj listenizle ilgili özel endişeler:

  1. Gerçek birleştirme değişiklikleri geçmişte. Neden daha fazla bilgiye ihtiyacınız var? DVCS'ler çatışmaları sınırlı alanlarla sınırlamak konusunda çok iyidir. Hangi değişiklik kümesinin saklanacağını seçtikten sonra, birleştirme taahhüdü düğümünün kopyasını önceki kopyayla karşılaştırmanız size tam olarak bunu verecektir.
  2. Birleştirme çok büyük olsaydı, periyodik taahhütler verebilirsiniz. Bu geçerli bir endişe, ama ilk etapta buraya asla gelmemelisiniz. Şubeler sürekli olarak yukarı akış değişikliklerini çekiyor olmalı, böylece bu asla olmayacak. rebaseBir seferde bir taahhüt veya kiraz toplama gibi araçlar da bazı durumlarda burada size yardımcı olabilir.
  3. Bir hata yaptıysanız, geri almak çok daha kolay olurdu (tüm birleştirmeyi yeniden yapmak zorunda kalmadan). Yukarıya bakınız - çatışmalarınız bu kadar yönetilemez hale gelmemelidir.

Bu önerinin işe yarayabileceği tek yol, dalın tüm birleşmenin atomik olmasıydı - bir dizi taahhüt görebiliyordunuz, ancak bunlar yalnızca taahhüt ağacında bir düğüm olarak ele alınması gereken daha büyük bir birleştirme taahhüdünde adımlar olacaktı. . Mevcut VCS'nin bu tür iş akışı için desteğe sahip olduğunu düşünmüyorum ve gerekli olduğunu düşünmüyorum.


Çatışmalar muhtemelen bu yönetilemez olmamalı , ancak çoğu zaman (en azından benim tecrübelerime göre). Bütün birleşmenin atomik olması gerektiğini düşünüyorum; önerdiğim şey bu. Gerekli olmayabilir, sadece neden yapılmadığını merak ediyorum. Ayrıca bir çakışmada mutlaka bir veya diğer seçeneği seçemezsiniz; bazen her iki değişikliğin birleşimidir. Bu özellikle kafa karıştırıcı.
Patlama Hapları

"Depoyu tutarlı bir durumda tutmanız gerekiyor". Bunun doğru olduğunu düşünmüyorum. Yerel bir depo bir tapınak değil , bir çalışma alanıdır. Bir birleşmenin ortasında işlem görmeye yardımcı olursa, IMHO yapın. Bunu daha iyi bilmediğiniz için yaparsanız, yapmamanızı öneririm. Ancak deneyimli bir programcıysanız, sizin için en uygun olanı yapmanız gerekir. Yerel veri havuzunuzu bozulmamış tutmak konusunda dogmatik olmayın.
Bryan Oakley

1

Ana deneyimim Mercurial'da yatıyor, ancak git ara sıra kullanıyorum.

Mercurial, çözülmemiş dosyaları işlemenize izin vermez, sadece sizi cesaretlendirir . Sahip olmadığınız değişiklikleri çekmeden önce itmekle aynı anlaşma.

Mercurial'ta yapmanız gereken tek şey, dosyaları istediğiniz gibi teslim ettikten sonra:

hg resolve --mark --all
hg commit -m "I'm such a rebel"

--mark, dosyaları birleştirme aracıyla sormadan çözülmüş olarak işaretler. --all tüm dosyaları çatışmayla işaretleyerek seçecektir.

Çekmeden itmek istiyorsanız (ve sonuç olarak başkalarının değişikliklerini birleştirmek zorundaysanız ) bir Jedi gibi yapın :

hg push --force

Çeken bir sonraki adam +1 kafa alacak (cezalandırılmadı)

Git ile aynı şeyleri yapmanın bir yolu olduğundan eminim (muhtemelen daha kıvrımlı olmasına rağmen).


1

Git'te birleştiğimde, hemen tüm değişiklikleri (birleştirme çakışmaları dahil) taahhüt ederim. Ardından, bir sonraki taahhütlerimde, birleştirme düzenleyicilerini bir metin düzenleyici aracılığıyla çözüyorum. Çatışmalar çözüldükten sonra, istenirse itiyorum.

Dürüst olmak gerekirse, başkalarının neden bu şekilde yapmadığını anlamıyorum, ya da git zorlamıyor.

  • "Birleştirme taahhüdü" artık birleştirilmesi gereken şeylerin temiz bir tarihidir.
  • Aşağıdaki taahhütler birleştirme çakışmalarını çözmek için ne yaptığınızı gösterir.
  • İttiğinizde, çatışmalar çözülür ve yapı dalın ucunda kırılmaz.
  • Herhangi bir noktada, çakışma çözümünü bozursanız, "birleştirme sonrası" işlemlerinden birine geri dönüp tekrar deneyebilirsiniz.

Taahhüt etmeden önce çakışmaları çözmenin standart iş akışının büyük bir dezavantajı, yerel kopyanızdaki değişikliklerin gizlice girebilmesidir. Eklemeler, büyük birleştirme farkıyla kod incelemesinden gizlenir, bu nedenle yanlışlıkla bir API gerçekleştirdiğinizi fark etmezsiniz. anahtar vb.

Yukarıda açıklanan iş akışım bu yerel kopya sorununu önler ve kod gözden geçirenlerin birleştirme çözünürlüğünüzün ayrıntılarını tam olarak standart bir taahhüt farkına benzeyen bir taahhüt farkında incelemesine (yalnızca) izin verir.


0

Sanırım mümkün olduğunda küçük değişiklikleri itmek ve sık sık itmek en iyisidir (ve elbette her zaman değildir) ve inşa etmeyen veya yarı eksiksiz olan kodları taahhüt etmiyoruz (hepimiz hata yapıyoruz, ama don bilerek yapmayın). Ben de git'ten geliyorum ve bence en iyi şeylerden biri, masaüstünüzde repo'nun uygulanabilir bir kopyasına sahip olabilmeniz ... daha sonra kalplerinizin içeriğinde değiştirebilirsiniz. Büyük değişiklikleriniz tamamlandığında, gönderin.

Git ile açık kaynak bir sürü yapmak benim için en büyük hayal kırıklığı yarı bitmiş kod repo içine plopped ve bir yapı yapmaya çalışıyordu, ama yapamadım, çünkü adam işin yarısı yaptı ve "Şimdi meşgulüm , Bir hafta içinde bitireceğim ". Bu yüzden onu kazımak zorunda kaldım (ki bu adamı rahatsız eder) veya bitirmek ve tamamen entegre etmek için zaman ayırırdım.

Benim bakış açımdan, yarı eşek eşyalarını yerel olarak sakla, iyi şeyleri tel üzerinden gönder.


0

Aletlerinize köle olma.

Bir VCS'nin amacı işinizi yapabilmenizi sağlamaktır. İşiniz bozulmamış bir yerel depo tutmak değil , işiniz kod yazmaktır. Erken ve sık sık yerel olarak işlem yapmak daha iyi çalışmanıza izin veriyorsa, yapın.

Ancak, olmamalıdır itme kod kaynak tarafı kırık.


0

Çünkü temelde bu kötü bir fikir - sizi ağır bir durumda olan bir havuza götürecektir (ve her zaman en az bir kopyaya sahip olmanız gerektiğini iddia etse de, herhangi bir yere iteceğinizi varsaymak için döküntüsü).

Büyük / karmaşık birleştirme durumunda, devam etmekte olan çalışmanızı kaydetmek ve bir referans noktası oluşturmak isteyebileceğinizi ancak sistemi hala çözülmesi gereken dağınık bir durumda bırakacağınızı görebiliyorum.

Ve epik birleşme olmadan (ya da en azından daha kolay anlaşılabilen daha büyük birleşmelerle) değişikliklere uyum sağlama yeteneği kazandırabilecek alternatifler var - başından daha erken birleştirme seçeneğiniz var.

Git'in rebase'inin özellikle yararlı olduğunu görüyorum (yeniden basmaya ilişkin olağan uyarılara tabi), çünkü değişikliklerinizi daha küçük parçalar halinde düzelttiğiniz mevcut durumun üzerinde tekrarlıyorsunuz.

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.