Git'teki şubeler ne zaman silinir?


284

Diyelim ki kararlı bir uygulamamız var.

Yarın, birisi hemen düzeltmeye karar verdiğimiz büyük bir hata bildiriyor. Bu nedenle "master" için bu düzeltme için bir şube oluşturuyoruz, buna "2011_Hotfix" adını veriyoruz ve tüm geliştiricilerin bunu düzeltmek için işbirliği yapabilmesi için yukarı doğru itiyoruz.

Hatayı düzeltiriz ve "2011_Hotfix" i "master" ve güncel geliştirme dalında birleştiririz. Ve "efendi" yi itin.

Şimdi "2011_Hotfix" ile ne yapacağız? Sadece zamanın sonuna kadar sonsuza dek orada bir şube olarak mı oturmalı yoksa amacına hizmet ettiği için şimdi silmeli miyiz? Şube listesi muhtemelen çok uzun olacağından, çoğu artık gerekli olmayan şubeleri her yerde yatarken bırakmak kirli görünüyor.

Silinmesi durumunda, tarihine ne olacak? Asıl şube artık mevcut olmasa da bu korunacak mı? Ayrıca, uzak bir dalı nasıl kaldırabilirim?


33
Genellikle şubeleri fikir olarak düşünmeye yardımcı olur. Oldukça iyi bir kural, şubenin temsil ettiği fikirler üzerinde çalışmayı bitirdiyseniz - bu değişiklikleri test etmek ve bu değişiklikleri dahil etmek (bunları master ile birleştirmek dahil) - şubenin kendisiyle bitirmiş olmanızdır.
Cascabel

3
Ne bilmek istiyorum: Uzaktan düzeltme kaldırılıyorsa, işbirliği yapan tüm geliştiriciler için yerel olarak kaldırılacak mı? Değilse; bunu nasıl başarabilirim? Bir kişinin düzeltmeyi master'a geçirdiğini düşünürüm, ancak bundan sonra bu şubeye taahhüt eklemelerini önlemek için tüm ortak çalışanlar için de temizlenmelidir.
rolandow

1
İş arkadaşlarınızın bilgisayarlarının yerel depolarını etkileyemezsiniz. Ya şubeyi yerel olarak silmesini söylemeniz ya da
şubenizden silmeyi

Yanıtlar:


183

İle bir şubeyi güvenle kaldırabilirsiniz git branch -d yourbranch. Birleştirilmemiş değişiklikler içeriyorsa (yani, şubeyi silerek taahhütleri kaybedersiniz), git size söyler ve silmez.

Bu nedenle, birleştirilmiş bir dalı silmek ucuzdur ve hiçbir geçmişi kaybetmenize neden olmaz.

Uzak bir dalı silmek için git push origin :mybranch, uzak adınızın kaynak olduğunu ve silmek istediğiniz uzak dalın mybranch olduğunu varsayarak kullanın.


35
"birleştirilmiş bir şubeyi silmek ucuzdur" ama aynı zamanda buralarda saklar. Git'i kullanırsanız, zamanın veya alanın kullandığı zaman açısından önemli bir performans isabeti yoktur. Bununla birlikte, şubeyi sileceğim çünkü tüm taahhütler tarihte zaten var master, bu yüzden işleri daha temiz hale getiriyor.
MatrixFrog

22
Dalları silmek istememin nedenlerinden biri: Dallarda çok fazla değişiklik yapıyoruz (aslında tüm değişiklikler), bu yüzden sonunda 'git branch' komutunu kullanırken uzun bir liste alırsınız. Genel bakış için bu listeyi kısaltmak istiyorum. Böylece eski şubeler silinecek. Reale sürümleri etiketlendi, bu yüzden benim için bu tartışmada değil.
michel.iamit

7
Daha önce birleştirilen şubeleri silmeyi kabul ederken, mevcut şubenize birleştirilmemiş dalların bir listesini görmek istiyorsanız şunu kullanabilirsiniz: git branch --no-merged
lsklyut

51
@MatrixFrog Git açısından etrafta dolaşmak ucuzdur, ancak insan maliyeti pahalı olabilir. Az önce 40'a yakın şubesi olan, hepsi de sayısal şubesi olan bir projeye girdim. Ne olduğu hakkında hiçbir fikrim yok ve bu dalların neredeyse her biri bayat. Bu dalları aramanın ve yorucu ve zaman alan şeyin ne olduğunu bulmanın yükü. Yani evet, teknik olarak ucuz, ama gerçekten değil. Git repo gemi şeklimi korumak istiyorum. Etkin geliştiricide değilse ve birleştirildiyse silin. Ama bu sadece benim MO'm ve başkalarının farklı bir şeyler yapabileceğine saygı duyuyorum.
dudewad

1
--no-mergedVarsayılanı yapma komutu nedir ? Denedim git config --global --add branch.noMerged trueve eklendi ama herhangi bir fark yaratmadı.
Craig Silver

55

Yapmanız gereken, bıraktığınız her şeyi etiketlemektir. Aktif olarak geliştiğiniz zamanlar için dalları tutun.

İle eski dalları sil

git branch -d branch_name

Bunları sunucudan silin

git push origin --delete branch_name

ya da eski sözdizimi

git push origin :branch_name

"hiçbir şeyi başlangıçta dal_adı'na aktar" şeklinde okunur.

Bununla birlikte, DAG (yönlendirilmiş asiklik grafik) ona işaret edebildiği sürece, taahhütler tarihte orada olacaktır.

Google "git-flow" ve yayın yönetimi, dallanma ve etiketleme hakkında daha fazla bilgi verebilir.


31

Soru "github" etiketine sahip olduğundan, bunu da ekleyeceğim: özellikle Github'da , bir dalı çekip talep ederseniz ve birleştirilirse (kullanıcı arayüzü üzerinden veya çekme isteğinin dalını birleştirerek), şubeyi kaldırsanız bile çekme isteği verilerini (yorumlar dahil) kaybetmek .

Bunun bir sonucu: Çekme isteklerini iş akışınızın bir parçası olarak (kod incelemeleriyle tatlı bir şekilde karışan) dahil ederseniz, şubeler birleşir birleşmez güvenli bir şekilde silebilirsiniz. Bu o kadar yaygın ki, son zamanlarda Github bir çekme isteğini birleştirdikten hemen sonra bir "dalı sil" düğmesi açan (tatlı) bir özellik ekledi.

Ancak, her grubun kendisine en uygun iş akışını benimsemesi gerektiğine dikkat etmek gerekir (ve bu şubelerin silinmesine yol açabilir veya açmayabilir). Örneğin, şu andaki çalışma ekibim, çekme istekleri birleştirilir birleştirilmez, ana veya dağıtımla ilgili olmayan tüm dalları (örneğin, üretim, aşamalandırma, vb.) her bir ürünün her kademeli iyileştirmesi.

Elbette, hiçbir geçmiş yönetimi (çekme istekleri veya başka türlü) sürümlerin uygun şekilde etiketlenmesinin yerini almaz (tercihen bir sürümü dağıtan / paketleyen aynı araç / komut dosyasıyla otomatikleştirirsiniz), böylece kullanıcılarınızın ne olursa olsun her zaman hızlı geçiş yapabilirsiniz belirli bir anda. Etiketleme, orijinal sorununuzu çözmenin de anahtarıdır: "iş" dallarıyla birleştirilen herhangi bir dalın silinebileceğini ve silinebileceğini ve sürüm etiketi, "üretim" vb. İle birleştirilen herhangi bir dalın , düzeltmeleri gelecekteki bir sürümle tümleştirilinceye kadar her zaman canlı tutabilirsiniz.


2
Github'ın bana neden bir "Şubeyi sil" düğmesi gösterdiğini açıkladığınız için teşekkür ederiz.
Todd Owen

Sourcetree kullanıyoruz ve yerel düzeltme dalı ve uzak düzeltme dalı açık tutma seçeneği sunuyor. Bir düzeltme dalını kapatmanın onu silmek anlamına geldiğini ve yeniden kullanamayacağınızı düşündüm. Örneğin, önümüzdeki 5 gün boyunca her gün düzeltmeleri zorlamamız gerekiyor. Sonra kapatıyoruz. Ama diyelim ki 6. gün, başka bir düzeltmeye ihtiyacımız var. Yeni bir düzeltme dalı oluşturuyor muyuz?
Danger14

İnsanlar genellikle bunu yapar. Bunları tek tek adlandırmak mümkün değilse, güne veya onları yöneten bilet sistemi referansına (varsa) göre adlandırabilirsiniz. Tabii ki, git iş akışlarının "ekibiniz için en uygun olanı" temelinde uygulanması gerekiyor, bu yüzden farklı çalışmaya karar verirseniz endişelenmeyin.
chesterbr

7

Dalları silmenin dezavantajının GitHub'daki bu dallara herhangi bir köprü kopmasıdır (bu soru github olarak etiketlenmiştir). Bu 404 Not Foundbağlantılar için bir hata mesajı alırsınız . Bu yüzden GitHub'da bir dalı sildikten sonra bağlarımı bir taahhüt veya etikete işaret edecek şekilde değiştiriyorum.

E-postada olduğu gibi bazı bağlantılar değiştirilemediğinden, artık GitHub dallarına tamamen köprülemekten ve ilk günden itibaren bir taahhüt veya etikete bağlanmaktan kaçınıyorum.

Şubeleri birleştirildikten sonra silmeyi tercih ederim. Bu, deponuzdaki uzun bir dal listesinin görsel karmaşasını önler. Bu dallar aynı zamanda deponun tüm çatallarına da yayılır.

Önce yerel şubemi silerim. Bu, daha sonra yanlışlıkla itilmesini önler.

git branch -d branchName

Sonra uzaktan izleme şubesini siliyorum

git branch -dr remoteName\branchName

Sonra GitHub'daki dalı siliyorum. Web arayüzünü kullanıyorum, ancak eşdeğer komut aşağıda.

git push remoteName :branchName

Şube asla birleştirilmese bile, genellikle taahhütleri gelecek nesiller için tutmak istiyorum. Ancak yine de şubeyi silmek istiyorum. Taahhütleri yaymak ve çöp toplayıcı tarafından yenilmelerini önlemek için, silinen şubeyle aynı taahhüde işaret eden açıklamalı bir etiket yapıyorum.

git tag -a tagName commitOrBranchName

Sonra etiketi github'a itiyorum

git push remoteName tagName

Çöp toplayıcı şubenin taahhütlerini ne zaman yer? Şubeyi silmeden önce etiketi etiketlemeniz ve aktarmanız gerekiyor mu?
Jared Thirsk


4

2011_HotfixŞubeyi geçmişini kaybetmeden silmek istediğiniz anlaşılıyor . Önce silme ve sonra tarih tartışacağım.

Genel gitdal silme yöntemleri yukarıda tarif edilmiştir ve beklendiği gibi çalışırlar. git"Hey git, hem yerel hem de uzak dalı sil " anlamına gelen bir veya iki sözcük komutu yok . Ancak bu davranış kabuk betiği ile taklit edilebilir. Örneğin, Zach Holman'ın 'git-nuke' kabuk komut dosyasını ele alalım . O çok basit:

#!/bin/sh
git branch -D $1
git push origin :$1

Bunu git-nuke, $PATHdizinlerinizden birine yürütülebilir bir dosyaya (örn. ) Koyun . Eğer değilseniz 2011_Hotfixdalı, sadece çalışan git-nuke 2011_Hotfixyerel ve uzak dalları hem silecektir. Bu, standart gitkomutlardan çok daha hızlı ve daha basit - belki de daha tehlikeli olsa da - .

Tarihi koruma konusundaki kaygınız iyi. Bu durumda endişelenmenize gerek yok. Birleştirmek kez 2011_Hotfixüzerine master, tüm kaydedilmesini 2011_Hotfixeklenecektir master'ın tarihini işlemek. Kısacası, basit bir birleşmeden geçmişi kaybetmeyeceksiniz.

Eklemek için bir kelime daha var, belki de sorunuzun kapsamı dışındadır, ancak yine de konuyla ilgilidir. Diyelim ki 20 küçük, "devam etmekte olan çalışma" taahhüdü var 2011_Hotfix; ancak, geçmişine yalnızca bir tam taahhüt 2011_Hotfixeklenmesini istiyorsunuz master. 20 küçük taahhüdü tek bir büyük taahhütte nasıl birleştiriyorsunuz? Neyse ki, gitbirden fazla taahhüdü kullanarak tek bir taahhütte birleştirmenize izin verir git-rebase. Burada bunun nasıl çalıştığını açıklamayacağım; Ancak, ilgileniyorsanız, için belgelergit-rebase mükemmel. git rebaseTarihin yeniden yazıldığını unutmayın , bu yüzden özellikle yeni iseniz, makul bir şekilde kullanılmalıdır. Son olarak, 2011_Hotfixsenaryonuz yalnız bir geliştirici değil, bir geliştirme ekibi ile ilgilidir. Proje ekibi üyeleri aşağıdakileri kullanırsagit rebase, takımdaki git rebasebazı kovboy geliştiricilerin farkında olmadan bir projenin gitgeçmişine zarar vermemesi için takımın kullanımı konusunda açık kurallara sahip olması akıllıca olacaktır .


3

Başarıyla geri birleştirilirse ve hatta etiketlenmişse, artık faydası olmadığını söyleyebilirim. Böylece güvenle yapabilirsiniz git branch -d branchname.


2

Kökeni kaldırılmış yerel dalları budamak istiyorsanız, kullanırken budama da yapabilirsiniz. git fetch

git fetch --prune

0

Github, BitBucket gibi tüm büyük web kullanıcı arayüzlerindeki dalları silebilirsiniz. Şubeyi çevrimiçi sildikten sonra, yerel şubeyi silebilirsiniz.

git remote prune origin
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.