Devam eden refactoring nasıl yapılır?


23

Bu yüzden, benim tarafımdan tahakkuk etme sürecinde olan bu büyük projem var. Çok fazla şey değiştiriyorum, bu yüzden yakında bir süre derleme şansım yok. Adını verdiğim özel bir git dalında yaşıyorum cleanup( masterelbette sonunda birleşecek olan).

Sorun şu ki, derleyici olmayan kodları asla işleme koyma politikamın olmaması / benimsenmesi (ideal olarak da çalışması gerekir, ama en azından derlenmesi ve bağlanması gerekir). Bu yüzden, bu büyük görevi bitirene kadar hiçbir şey yapamıyorum (inceleme veya defter tutma için).
Çalışmayı sevdiğim şekilde değil (çoğu insanın günde en az bir kere işlediğine inanıyorum).

Ne düşünüyorsun? Gözden kaçtığım bir çözüm var mı?
Daha sonra git'e toplu komisyon veya başka bir şey yapmasını söyleyebilir miyim? Ben sigara derleme sürece kadar taahhüt yaşayabilir kalmak içinde cleanupşube.

Düzenle

İtme / taahhüt etme konusuna gelince: Bunun çok büyük bir fark olduğunun farkındayım, ancak daha sonra eşyalarımı birleştirdiğimde kırılmış revizyonlar olacak master. Öyleyse tarihe göz atarsanız (veya git bisect...) o zaman “yerel” revizyonlar dünyaya erişilebilir olacaktır. Bu nedenle, yalnızca yerel olarak iş yapmak ve itmemek en iyi çözüm değildir, çünkü daha sonra başınıza belaya girmenize neden olur (konu kapalıyken ve bir süre unutulduğunda).

Kısacası: Yerel taahhütler sonunda itilecek. Küresel tarih, derleyici olmayan taahhütler göstermemelidir.


1
Tek bir global taahhütte birden fazla yerel komisyon toplayabilirsiniz.

@ Thorbjørn, Jim'in aşağıdaki önerisini mi, yoksa Git'teki farklı bir mekanizmayı mı?
Brian,

Buna inanıyorum - tam komutu hatırlayamıyorum.

5
Yeniden canlandırmıyorsun, daha büyük bir şey yapıyorsun. Kod tabanındaki her refactorden sonra, kodunuz derlenmeli ve aynı gözlemlenebilir davranışa sahip olmalıdır. Asıl tepkim "Her ne zaman, her şeyin işe yaraması gerektiğine karar verin" derken, soru başlığınızı yansıtmak isteyebilirsiniz.
David Thornley

1
@bitmask Yeniden yazma nasıl?
Dave Hillier

Yanıtlar:


21

Bu git merge --squashkomut, etkisi başka bir şubeyi birleştirmekle aynı olan geçerli dalın üzerinde tek bir işlem oluşturmanıza olanak sağlar. Komut, çalışma ağacını günceller ve dizindeki değişiklikleri uygular, bundan sonra tek yapmanız gereken şey şu şekildedir:

git checkout master
git merge --squash cleanup
git commit -m "Merge cleanup branch"

git rebase -iKomut ayrıca kaydedilmesini kabak ancak daha fazla çalışma gerektirir.


14

Bir yeniden yazma yeniden yapılanma değildir

Git'i nasıl kullanacağınızla ilgilendiğinizin farkındayım, ancak yeniden yapılanma yönteminizi Git'i kullanma şeklinizden daha fazla değiştirmeyi düşünmelisiniz (Git'in size yardımcı olabileceğini düşünmeme rağmen).

Martin Fowler, refactoring'i şu şekilde tanımlamaktadır :

Mevcut davranış kodunu yeniden yapılandırmak, dış yapısını değiştirmeksizin iç yapısını değiştiren disiplinli bir teknik.

Kalbi, dönüşümleri koruyan bir dizi küçük davranış. Her dönüşüm (“yeniden düzenleme” olarak adlandırılır) çok az şey yapar, ancak bir dizi dönüşüm önemli bir yeniden yapılanma sağlayabilir. Her yeniden düzenleme küçük olduğundan, yanlış gitme olasılığı daha düşüktür. Her küçük yeniden yapılandırma işleminden sonra sistem tamamen çalışır durumda tutulur, yeniden yapılandırma sırasında bir sistemin ciddi şekilde kırılma olasılığı azalır.

Bu yöntemi uygularsanız, düzenli olarak işlem yapabilir (ve zorlayabilir).

Bunun pratik olmadığını ve büyük ölçekli bir şey için çalışmadığını iddia edebilirsiniz. Mikado yönteminin yardımcı olabileceği yer burasıdır . Bir bağımlılık grafiği oluşturarak büyük bir yeniden düzenlemeyi bir dizi küçük yeniden düzenlemeye ayırırsınız. Yöntem özyinelemelidir, değişikliklerinizi yapmayı deneyin, kontrol ettiğinizde hiçbir şeyi bozmaz, aksi halde değişikliklerinizi geri alın ve önkoşulları not edin. Ana refactoring hedefinize ulaşana kadar, birer birer zorunlu yeniden düzenlemeleri düzeltin.

Git bu yönteme gerçekten yardımcı olabilir. Yerel (kırık) şubenizi tutabilirsiniz. Alt hedefleri belirlediğinizde (ve zorladığınızda), rebaseana hedef dalınız, artık bozulmayana kadar, yaptığınız taahhütlerin üstüne çıkabilirsiniz .


5

git rebaseÖzellikle git rebase -ideğişken için kılavuz sayfasına göz atın . Geçmişinizde aradığınız şey gibi görünen birçok siparişi yeniden sipariş etmenize, silmenize veya ezmenize olanak tanır. Her zaman tam olarak tarif ettiğiniz durumda kullanırım: kamu tüketimine uygun olmayan birçok küçük komisyon yapmak, daha sonra ortak depoya itilmeden önce bunları tek bir "yeniden düzenleme" taahhüdünde ezmek.


3

Git'i kullanıyorsunuz, bu nedenle taahhüt etmek mutlaka değişikliklerinizi zorlamak anlamına gelmez .

IMHO ve Git'le çalışmak, derleme yapmasanız bile çalışmanızı yapmak için mükemmeldir ... çünkü sonuçta, değişikliklerinizi yaptığınızda, kodunuzda hiç kimse (itene kadar) bulunmayacaktır. Elbette, zorlamadan önce, iyi çalışmasını ve derlenmesini sağlamalısınız, böylece başkaları da değişikliklerinizi sorunsuzca alabilir ve birleştirebilir.

Ayrıca, ana daldan farklı bir dalda çalışıyorsunuz. Yani, eğer istersen (ve bunu tavsiye edersem), şubeni asla zorlamazsın. Yeniden düzenlemeyi tamamladığınızda ana şubeyi kontrol edin, değişikliklerinizi birleştirin ve ana şubeyi itin.

Düzenle

Bu durumda kullanabilir git cherry-pickveya oynayabilirsinizgit rebase


Önemli bir not, ama bunu düşündüm. Lütfen düzenlememe bakın. Teşekkür ederim.
Kaltak

Yukarıdaki düzenlememe bakın.
Cristian,

Yapabilseydim -1; taahhütler mevcut olacak! Yerel devam eden çalışma taahhütleri mükemmeldir, ancak onları asla zorlamayın; kodun anlaşılmasını zorlaştırır, git bisect'i kesintiye uğratır ve tarihi zorlaştırır. Bunun yerine yeniden açın veya squash yapın.
RJFalconer 14:12
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.