Git özelliği dalını silmek için doğru zaman ne zaman?


90

Sonunda 82 özellik dalı asılı kalmak istemiyorum , bu yüzden, uzmanlık için birleştirir birleştirmez özellik dalını basitçe silmenin olası dezavantajlarının ne olduğunu merak ediyorum.

İş akışı:

git co -b feat-xyz
hack hack
git ci
hack some more
git ci
git co master
git merge feat-xyz
smoke test
git br -d feat-xyz

Burada herhangi bir sorun var mı?


1
Sorun yok diyebilirim çünkü onlara gerçekten ihtiyacınız olursa, silinen şubeyi daha sonra her zaman yeniden canlandırabilirsiniz.
slebetman

@slebetman Bildiğim kadarıyla silinmiş bir şube diriltilemez. Bununla birlikte, şube silinmeden önce tamamen ana olarak birleştirildiyse, artık şubeye ihtiyaç duyulmamalıdır.
Simeon

1
@Simeon Evet yapabilirsiniz. Git taahhütleri asla silmez, bu yüzden şubenizi sildiğinizde sadece adını silmiş olursunuz. Silinen bir şubeyi yeniden canlandırmak için, o şubeye taahhüt ettiğiniz son şeyi hatırlamanız yeterlidir ve onu arayabilirsiniz git reflog. Ardından
hash'e göz atın

@slebetman bu, yalnızca dalın sonunda birleştirilmesi durumunda geçerli olacaktır. taahhütler geride bırakılırsa, sonunda ulaşılamaz hale gelecek ve belirli bir süre sonra çöp toplamaya tabi tutulacaktır. reflog'daki girişler bile sonunda silinecek, varsayılan olarak yaklaşık 90 gününüz var.
goldenratio

@goldenratio: Bunun için herhangi bir referans var mı?
slebetman

Yanıtlar:


63

Birleştirmeden sonra silme olağan yoldur. Bu nedenle git branch -d yourbranchname, şubenin silinmeden önce tamamen birleştirildiğinden emin olmak için kontroller yapılır.

Etrafta bir dalı tutmak için düşünebileceğim birkaç neden var: Üretime girdiğinde hataların geri gelmesi durumunda ona tutunmak isteyebilir veya tarihi bir kayıt isteyebilirsiniz.

Her iki durumda da, silmeden önce şubenin başını etiketleme seçeneğiniz vardır. Bir etiket, birkaç küçük farklılık dışında bir commit için bir gösterici olması açısından bir dal gibidir: 1) porselen genellikle kasada git show-branch veya tab-auto complete gibi keşif komutlarındaki etiketleri göstermez, 2) birini kontrol etmek sizi ayrılmış (ref olmayan) BAŞLIK 3'e koyar) bir " etiketleme mesajı " bırakabilirsiniz , bu da etiketin bir kayıt gibi nesne deposunda bir nesne olarak kaydedilmesine neden olur.

Bu şekilde geçmişi korursunuz ve herhangi bir hata düzeltmeye ihtiyacınız olursa, düzeltme için ana dışında yeni bir dal oluşturmanızı öneririm.


1
Bir etiketi kontrol etmek HEAD'i ayarlar, ancak otomatik olarak bir dal oluşturmaz. Dallanmayan bir işlemedeki HEAD, onu bağımsız kılan şeydir.
Binarian

1
Haklısın, HEAD'i bir referans yerine bir kaydetme kimliğine ayarlıyor. OP'min bu kısmı yanlış. Onu güncellemeliyim.
masonk

97

Birleştirmeden sonra siliyorum, ancak git merge --no-ffdal geçmişinin grafikte görünmesi için hızlı ilerlemeden kaçınmak için her zaman a yapıyorum . Özellik dalının geliştirme dalından nereden ayrıldığına ve nereden geri katıldığına dair geçmişe sahip olmayı seviyorum:

Hızlı ileri ile veya olmadan birleştirme

Bu, Vincent Driessen'in başarılı bir Git dallanma modelinden alınmıştır, git ile kullanmak için çok güzel bir iş akışı ve projelerimin çoğunda uyguluyorum.


Bu, geçmişi korumanın başka bir güzel yoludur, çünkü özellikten erişilebilen ancak master: rev ^ 1..rev ^ 2'den erişilemeyen işlemleri seçebilirsiniz. Olumsuz tarafı, ana dalınızdan yapmak isteyebileceğiniz herhangi bir yeniden düzenlemeyi mahvetmesidir (örneğin, ana birimin yukarı akış uzaktan kumandasına yeniden bağlanmasını istiyorsanız, bu çok yaygındır).
masonk

1
Ben o problemi yaşamadım. Ekibimiz github üzerinden senkronize oluyor ve genellikle yeniden baz almaya ihtiyacım yok, ancak burada bir dezavantaj olduğunu düşünmüyorum. Geliştirme ve özellik dalınızı yeniden oluştursanız bile, dallanma grafikte görünür kalır ve önemli olan, o dalı oluşturduğunuzda başlangıçta ayrıldığınız taahhüt değil, geliştirmeye göre özellik dalında ne olduğudur.
lkraider

@Ikraider, hatırlatma için teşekkürler. O makaleyi git'i ilk öğrenirken görmüştüm, şimdi bana daha mantıklı geliyor. Uzun metrajlı dallarımı merge --no-ffyeniden oluşturuyorum , ancak ustaya geri dönüyorum çünkü sizin de söylediğiniz gibi tarihi görebiliyorsunuz.
bstpierre

7

Bir özellik dalını biraz daha etrafta tutmak isteyebileceğiniz iki neden düşünebilirim:

  • Yukarı yönde daha fazla iş için size geri atılma şansı var.
  • Diğer geliştiriciler muhtemelen her şeyi ana olarak istemeden bu özelliği istiyorlar.

Pratikte, çoğu zaman birleştirme işleminden sonra silme işlemi yeterlidir.


6

Tipik iş akışı olacak

 // Create new branch
 $ git checkout -b myfeature
 // and then do some changes and commit them

 // Switch to master branch
 $ git checkout master

 // Merge myfeature to master. --no-ff will always keep branch information.
 $ git merge --no-ff myfeature

 // Delete myfeature branch
 $ git branch -d myfeature

 // Push the changes
 $ git push origin master

1

bence bu tipik iş akışı (birleştirmeden sonra silme)

DÜZENLE Yani, en azından kısa ömürlü dallar için birleştirmek yerine, bence ana fikir onları ustaya yeniden sunmaktır. daha sonra doğrusal bir değişim geçmişiyle sonuçlanırsınız ve tüm dal ana gövdenin bir parçası olur. bu durumda, orada tüm değişiklikleri yaparsınız, bu nedenle açıkça bir kopyasına ihtiyacınız olmaz.


Yani dalı etrafta tutmanın gerçekten bir anlamı yok, değil mi?
bstpierre

1
"Rebase" ten kaçınmanızı şiddetle tavsiye ederim. Yeniden adlandırma genellikle zararlıdır, yalnızca bazı durumlarda yararlıdır.
Dietrich Epp

9
Yeniden yükleme, yerel, özel şubeleriniz için tamamen makul bir iş akışıdır. Örneğin, yeniden ödeme yaparak ("yeniden aşağıya indirerek ") yukarı akış çalışmalarıyla uyumlu tutmak çok yaygındır . Yeniden yükseltmek çok daha az yaygındır ve genellikle zararlıdır *. second'ın cevabı gerçekten mantıklı değil, çünkü ister yeniden satış yapıyor olun ister yukarı akış değişikliklerinde birleşiyor olun, yine de bu şeyleri bir şekilde "yukarı" itmek zorundasınız. Yerel şubenizde bile, bir noktada uzmanlaşmak için özelliğinizi birleştirmeniz gerekecek. Özelliklerinize bağlı kalmanın avantajı, bu birleştirmenin hızlı ileriye doğru gitmesidir.
masonk

1
Yine de, son zamanlarda beni ısırtan, şubeleri yeniden finanse ederken dikkat edilmesi gereken bir şey var. Şimdi apaçık ortada, ama aylarca uzun ömürlü bir dalda gittim, her şeyi ustaya karşı her zaman yeniden öne sürdüm. Yaklaşık 600 güzel, parçacıklı taahhütle sonuçlandı, ancak usta çılgınca yeniden yapılandırıldı ve birçok kez tamamen değiştirildi. Her seferinde tüm şubeyi yeniden sıralayarak, eski taahhütlerini, onlara anlamlı gelen ana taahhütlerle olan bağlantılarından kesiyordum. Şimdi ihtiyaç duyulduğunda ustada birleşmeyi çok tercih ediyorum. Yalnızca şubenin geçmişi kesinlikle etkilenmeyecekse yeniden tabanlarız.
Gary Fixler
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.