Bir etiketin Git'teki bir şubeden farkı nedir? Burada hangisini kullanmalıyım?


616

Ben nasıl kullanılacağını anlamaya bazı zorluk yaşıyorum etiketleri karşı dalları içinde.

Kodumuzun şu anki sürümünü için ve şimdi belirli bir özellik için bu kodun bir alt kümesi üzerinde çalışacağım. Birkaç geliştirici de bunun üzerinde çalışacak, ancak grubumuzdaki tüm geliştiriciler bu özelliğe önem vermeyecek. Bir şube veya etiket oluşturmalı mıyım? Hangi durumlarda birini diğerine karşı kullanmalıyım?


4
Git etiketinin nasıl kullanılacağına dair web araması ilk önce beni bu bağlantıya getirdiğinden, burada bir etiket hakkında daha iyi (IMHO) bir cevap olduğunu
ekliyorum

Yanıtlar:


520

Bir etiket zamanında bir anda belirli bir dalı bir sürümünü temsil eder. Bir dal , aynı kod tabanındaki diğer geliştirme çabalarıyla aynı anda çalışabilecek ayrı bir geliştirme iş parçacığını temsil eder. Bir dalda yapılan değişiklikler sonunda onları birleştirmek için başka bir dalda birleştirilebilir.

Genellikle belirli bir sürümü etiketleyebilirsiniz , böylece yeniden oluşturabilirsiniz, örneğin, bu XYZ Corp'a gönderdiğimiz sürümdür . Bir şubekodun üzerinde belirli bir sürüm üzerinde sürekli güncellemeler sağlamak için daha çok bir stratejidir. Teslim edilen sürümün bir dalını oluşturacak, ana hatta geliştirmeye devam edecek, ancak teslim edilen sürümü temsil eden dalda hata düzeltmeleri yapacaksınız. Sonunda, bu hata düzeltmelerini tekrar ana hatta birleştireceksiniz. Genellikle hem dallanmayı hem de etiketlemeyi birlikte kullanırsınız. Yeniden oluşturmak isteyebileceğiniz her şube boyunca belirli sürümleri (örneğin, müşterilere teslim edilenler) işaretleyen hem ana hatta hem de şubelerine uygulanabilecek çeşitli etiketleriniz olacaktır - dağıtım, hata teşhisi vb.

Aslında bundan daha karmaşık - ya da yapmak istediğiniz kadar karmaşık - ama bu örnekler size farklılıklar hakkında bir fikir vermelidir.


40
onun durumunda dalları kullanmak istiyor, belki de cevabınızda bunu not etmelisiniz;)
knittl

13
AFAIK, etiketler her şube için benzersiz değildir. Yani ayrı dallarda farklı taahhütler için aynı isimleri veremezsiniz.
MY

5
@MY Kesinlikle kötü bir şey değil, IMHO. Özellikle tvanfosson tarafından tarif edilen şekilde, farklı dallarda aynı ada sahip birden fazla etikete sahip olmak zor olabilir. Örnek göz önüne alındığında, eğer düşünürdüm olabilir farklı branşlarda genelinde aynı isimde etiketleri var, çabucak kötü uygulama olarak kurulacak. Yine de yapamayacağınızı bilmek güzel. Teşekkürler BENİM!
Döner

28
Etiket, yalnızca bir kesin karmanın takma adıdır. Sizinle bir taahhüdü kontrol git checkout 88c9f229fedebilirsiniz gibi bir şey yapabilirsiniz git checkout your_tagve etiket tarafından takma taahhüdü ödeme olacak.
jterm

6
@jterm, şube takma adları da değil mi? Tek fark, bir dal takma adının kendisini otomatik olarak zincirdeki en son taahhüde yeniden sunmasıdır.
Viktor Molokostov

529

Gönderen teorik bakış açısından:

  • etiketleri , belirli bir düzeltme için sembolik adlardır . Her zaman aynı nesneye işaret ederler (genellikle: aynı revizyona); değişmezler.
  • dallar gelişim çizgisinin sembolik isimleridir . Şube üstünde yeni taahhütler yaratılır. Şube işaretçisi doğal olarak ilerler ve daha yeni ve daha yeni taahhütlere işaret eder.

Gönderen teknik açıdan:

  • etiketlerrefs/tags/ ad alanında bulunur ve nesneleri (açıklamalı ve isteğe bağlı olarak GPG imzalı etiketler) veya doğrudan nesneyi (yerel adlar için daha az kullanılan hafif etiket) veya ağaç nesnesine veya blob nesnesine (örneğin GPG imzası) yönlendirmeyi işaret edebilir ).
  • dallarırefs/heads/ ad alanında bulunur ve yalnızca nesnelere işaret edebilir . HEADİşaretçi bir kolu (sembolik referans) ya da doğrudan bir tamamlama (müstakil BAŞ veya isimsiz dalı) öğrenmek için, olmalıdır.
  • uzaktan izleme dallarırefs/remotes/<remote>/ ad alanında bulunur ve uzak depodaki normal dalları takip eder <remote>.

Ayrıca bakınız gitglossary manpage:

şube

Bir "dal" aktif bir gelişim çizgisidir. Bir daldaki en son taahhüt, o dalın ucu olarak adlandırılır. Dalın ucuna, dal üzerinde ek geliştirme yapıldıkça ilerleyen bir dal başı tarafından başvurulur. Tek bir git deposu rasgele sayıda dalı izleyebilir, ancak çalışma ağacınız bunlardan yalnızca biri ("geçerli" veya "kullanıma alınmış" dalı) ile ilişkilendirilir ve HEAD bu dalı işaret eder.

etiket

Bir etikete veya tamamlama nesnesine işaret eden ref. Bir kafanın aksine, etiket bir taahhüt tarafından değiştirilmez. Etiketler (etiket nesneleri değil) içinde saklanır $GIT_DIR/refs/tags/. [...]. Bir etiket en tipik olarak, bağlı soy zincirindeki belirli bir noktayı işaretlemek için kullanılır.

etiket nesnesi

Başka bir nesneye işaret eden, tıpkı bir taahhüt nesnesi gibi bir mesaj içerebilen ref içeren bir nesne. Ayrıca bir (PGP) imzası içerebilir, bu durumda buna "imzalı etiket nesnesi" denir.


36
Soru: bir şubeye etiket gibi davranırsanız (yani, oluşturursanız, asla güncellemezseniz), gerçek bir fark var mı?
Steve Bennett

30
@SteveBennett kesinlikle. Farklı bilgiler var (bir etiketi imzalayabilir, bir şubeye açıklama ekleyebilirsiniz). Bir dalı taşıyabilirsiniz (böylece hiç güncellemeseniz bile yine de yeniden temellendirebilirsiniz.). Bir etiketi taşıyamazsınız (belirli bir işleme bağlı). Bir kolu itmeyi seçebilirsiniz. Etiketler varsayılan olarak aktarılmaz. Birini diğeri için asla kullanmamalısınız (gerçekten bir SVN zihniyetinde değilseniz, bu durumda git ile devam etmek istiyorsanız o kadar hızlı "öğrenmemeniz" gerekir).
VonC

19
@SteveBennett: Git'in şubeleri nasıl ele aldığına ve etiketlere nasıl davrandığına dair bir fark var. VonC'nin söylediklerinin yanı sıra, etiketi yanlışlıkla ilerletemezsiniz: " git checkout <tag>" anonim isimsiz dal ('müstakil HEAD' olarak adlandırılır) oluşturur ve etiketin durumunu seçer . Yeni bir taahhüt oluşturmak, bu adlandırılmamış dalda bunu yapar ve etiketin neyi işaret ettiğini değiştirmez.
Jakub Narębski

60
IMO, dallar ayrı zaman çizelgeleri (paralel dünya) ve etiketler zaman çizelgesindeki belirli anlardır.
Eonil

25
Burada hiç kimse henüz bahsetmedi ama bir şube başlatmak için nokta olarak bir etiket kullanabilirsiniz:git checkout -b <branch name> <tag name>

143

Deponuzu projenizde ilerleyen bir kitap olarak düşünüyorsanız ...

Dallar

Bir dalı şu yapışkan yer işaretlerinden biri olarak düşünebilirsiniz :

resim açıklamasını buraya girin

Yepyeni bir havuzda masterotomatik olarak yazdığınız en son sayfaya (düşünme taahhüdü ) geçen (bunlardan biri) bunlardan yalnızca biri bulunur . Ancak, kitaptaki diğer ilgi noktalarını işaretlemek için daha fazla yer işareti oluşturmak ve kullanmakta özgürsünüz, böylece hızlı bir şekilde geri dönebilirsiniz.

Ayrıca, belirli bir yer işaretini her zaman kitabın başka bir sayfasına taşıyabilirsiniz ( git-resetörneğin,); ilgi çekici noktalar genellikle zaman içinde değişir.

Etiketler

Etiketleri bölüm başlıkları olarak düşünebilirsiniz .

yer imleri

Bir başlık ( açıklamalı etiketleri düşün ) içerebilir veya içermeyebilir. Bir etiket, kitaba tarihsel ilgi gösteren bir noktaya işaret ettiği için bir şubeye benzer ancak farklıdır . Tarihsel yönünü korumak için, bir etiketi paylaştıktan sonra (yani paylaşılan bir uzaktan kumandaya ittiğinizde) etiketi kitaptaki başka bir yere taşımanız gerekmez .


16
Bir dalın kitap olacağını ve yer işaretlerinin etiketler olduğunu düşünürdüm. Bir kitap yazmaya devam edebilirsiniz, ancak kitabı düzenleyemezsiniz. Etiket kitaptaki sabit bir andır.
Mārtiņš Briedis

5
@Jubobs Şube açıklamasını bir gelişim çizgisi olarak beğendim. Bir kitap bir şube olurdu. Ana şubeden ayrılan yere göre yeni bir kitap başlatabilirsiniz. Bunları paralel olarak yazıp bir kitap / dalla birleştirmeyi deneyebilirsiniz.
Mārtiņš Briedis

2
@ MārtiņšBriedis Bir dalı nasıl düşündüğünüzü anlıyorum, ama Git'te bunun aslında yanıltıcı olduğunu görüyorum. Bkz. Stackoverflow.com/questions/25068543/…
jub0bs

2
Bu gerçekten zaman tasarrufu sağlayan bir cevaptır
Ali Foroughi

2
Bir kitap yazmaya başlarsanız ve ilk 50 sayfanız varsa, onu kopyalayabilir (kitaptan yeni bir şube oluşturabilir) ve aynı anda iki kitap yazmaya devam edebilirsiniz (veya kitap kopyasını başka bir yazara - geliştiriciye verebilirsiniz) ve son olarak diğer kitaptan kitabınıza değişir.
barell

42

CVS'den gelen, farkına varmanız gereken şey, bir şube kurarken artık dizin oluşturmamanızdır .
Artık "tek bir dosyaya uygulanabilen" yapışkan etiket veya "dal etiketi" yok.
Şube ve etiketler Git'teki iki farklı nesnedir ve her zaman tüm repo için geçerlidir .

Artık (bu sefer SVN ile) deponuzu aşağıdakilerle açıkça yapılandırmak zorunda kalmayacaksınız:

branches
   myFirstBranch
     myProject
       mySubDirs
   mySecondBranch
     ...
tags
   myFirstTag
     myProject
       mySubDirs
   mySecondTag
   ...

Bu yapı, CVS'nin bir sürüm sistemi değil , bir revizyon sistemi olmasından kaynaklanmaktadır (bkz. Kaynak kontrolü ve Revizyon Kontrolü? ).
Bu, dalların CVS etiketleri, SVN dizinleri aracılığıyla taklit edildiği anlamına gelir.

Bir etiketi kullanıma alıp bu etiket üzerinde çalışmaya alışkınsanız, sorunuz mantıklı geliyor .
Hangi yapmamalısınız;)
Bir etiketin, her seferinde aynı içeriği alma garantisi ile erişmek için kullanılan değişmez bir içeriği temsil etmesi gerekir .

Git'te, revizyonların tarihi bir grafik oluşturan bir dizi taahhüttür.
Dal, bu grafiğin bir yoludur

x--x--x--x--x # one branch
    \ 
     --y----y # another branch
       1.1
        ^
        |
        # a tag pointing to a commit
  • Bir etiketi teslim alırsanız, etiketten çalışmaya başlamak için bir şube oluşturmanız gerekir.
  • Bir şubeye ödeme yaparsanız, o şubenin en son taahhütünü ('HEAD') doğrudan görürsünüz.

Jakub Narębski'nin tüm teknik özellikler için cevabına bakın , ancak açıkçası, bu noktada (henüz) tüm detaylara ihtiyacınız yok;)

Ana nokta: bir etiket, bir taahhüdün basit bir göstergesidir, içeriğini asla değiştiremezsiniz. Bir şubeye ihtiyacınız var.


Sizin durumunuzda, her geliştirici belirli bir özellik üzerinde çalışır:

  • kendi depolarında kendi dallarını oluşturmalılar
  • meslektaşlarının depolarındaki şubeleri takip edin (aynı özellik üzerinde çalışan)
  • çalışmalarınızı akranlarınızla paylaşmak için çekin / itin.

Doğrudan meslektaşlarınızın kollarını izlemek yerine, herkesin bu özel özellik için çalışmalarını entegre etmek ve paylaşmak için herkesin işini zorladığı bir "resmi" merkezi deponun kolunu takip edebilirsiniz.


1
şube ve etiketlerin nasıl çalıştığını açıklığa kavuşturduğunuz için teşekkürler :) örneğiniz olmadan tam olarak anlayamayacağım.
ufk

3
@VonC: Sanırım cevabınızda "CVS" değil, "SVN" demek istediniz. CVS dizin yapısına sahip değildir; SVN yapar. Aslında git'te etiketleme, RCN / CVS'de etiketlemenin SVN'de etiketlemekten çok daha fazla olduğunu hatırlatıyor (burada tag == degenerate branch).
Chris Cleeland

1
@ChrisCleeland iyi bir nokta. (Düzenlenmiş) cevapta biraz daha CVS ve SVN puanları ayırmaya çalıştım.
VonC

37

Dallar tahtadan yapılır ve ağacın gövdesinden büyür. Etiketler kağıttan (ahşap türevi) yapılır ve ağacın çeşitli yerlerinden Noel Süsleri gibi asılır.

Projeniz ağaçtır ve projeye eklenecek özelliğiniz bir dalda büyüyecektir. Cevap şube.


3
benzetmeye aşk
doz87

16

Açıklamanın en iyi yolu, etiketlerin salt okunur dallar gibi davranmasıdır. Bir dalı etiket olarak kullanabilirsiniz, ancak yanlışlıkla yeni taahhütlerle güncelleyebilirsiniz. Etiketlerin, var oldukları sürece aynı taahhüdü göstermesi garanti edilir.


11
Etiketlerin, var oldukları sürece aynı taahhüdü göstermesi garanti edilir. Tamamen doğru değil. Aslında bir etiketi taşıyabilirsiniz git tag -f.
jub0bs

14

Etiketler imzalanmış veya imzalanmamış olabilir ; şubeler asla imzalanmaz.

İmzalı etiketler hiçbir zaman taşınamaz çünkü belirli bir işleme kriptografik olarak (imzayla) bağlıdır. İmzasız etiketler bağlı değildir ve bunları taşımak mümkündür (ancak etiketleri taşımak normal bir kullanım durumu değildir).

Şubeler sadece farklı bir taahhütte bulunmakla kalmaz, aynı zamanda bunu yapmaları beklenir . Yerel kalkınma projeniz için bir şube kullanmalısınız. Git etiketindeki "bir etikette" çalışma yapmak pek mantıklı değil.


12

Ben düşünmek istiyorum dalları olarak nereye gittiğini , etiketler olarak orada yoktun .

Bir etiket, sürüm sürümü gibi geçmişte belirli bir önemli noktanın yer işareti gibi hissedilir.

Bir dal, projenin aşağıya ineceği özel bir yoldur ve bu nedenle şube işaretçisi sizinle birlikte ilerler. İşiniz bittiğinde dalı birleştiriyor / siliyorsunuz (yani işaretleyici). Tabii ki, bu noktada bu taahhüdü etiketlemeyi seçebilirsiniz.



6

Bir etiketi bir sürümü işaretlemek için kullanılır, daha spesifik olarak bir dalda zaman içinde bir noktayı ifade eder. Bir dal, genellikle bir projeye özellik eklemek için kullanılır.



4

basit cevap:

branch: geçerli şube işaretçisi depoya her taahhütte hareket eder

fakat

tag: bir etiketin işaret ettiği taahhüt değişmez, aslında etiket bu taahhüdün bir anlık görüntüsüdür.

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.