Чим тег відрізняється від гілки в Git? Що мені тут використовувати?


615

У мене виникають труднощі з розумінням того, як використовувати теги та гілки в.

Я щойно перемістив поточну версію нашого коду з до , і зараз я буду працювати над підмножиною цього коду для певної функції. Ще кілька розробників працюватимуть над цим, але не всі розробники в нашій групі будуть піклуватися про цю функцію. Чи слід створювати гілку чи тег? У яких ситуаціях я повинен використовувати один проти іншого?


4
Оскільки веб-пошук того, як використовувати тег git, спочатку привів мене до цього посилання, я додаю, що тут є краща відповідь (IMHO) про тег: stackoverflow.com/questions/35979642/…
Олексій Мартьянов

Відповіді:


519

Тег є версією тієї чи іншої галузі в момент часу. Гілка є окремий потік розвитку , які можуть працювати одночасно з іншими зусиллями в області розвитку на тій же кодової базі. Зміни до гілки можуть врешті бути об'єднані назад в іншу гілку для їх уніфікації.

Зазвичай ви будете позначати певну версію , так що ви можете відтворити його, наприклад, це версія , яку ми занурені в XYZ Corp . філіяце скоріше стратегія надання постійних оновлень для певної версії коду, продовжуючи розробляти його. Ви зробите гілку доставленої версії, продовжите розробку на головній лінії, але вкажете виправлення помилок у гілку, яка представляє доставлену версію. Врешті-решт ви з’єднаєте ці виправлення помилок назад у основну лінію. Часто ви використовуєте як розгалуження, так і теги разом. У вас будуть різні теги, які можуть застосовуватися як до основної лінії, так і до її гілок, що позначають окремі версії (наприклад, доставлені клієнтам) уздовж кожної гілки, яку ви можете відтворити - для доставки, діагностики помилок тощо.

Насправді це складніше, ніж це - або настільки складно, як ви хочете зробити це - але ці приклади повинні дати вам уявлення про відмінності.


40
у його випадку він хоче використовувати гілки, можливо, ви також повинні це зазначити у своїй відповіді;)
knittl

13
AFAIK, теги не є унікальними для кожної галузі. Отже, ви не можете давати однакові імена для різних команд в окремих галузях.
МІЙ

5
@MY Звичайно, це не погано, ІМХО. Особливо у способі, описаному tvanfosson, наявність декількох тегів з однаковою назвою на різних гілках може стати важкою для догляду. З огляду на приклад, я думаю, що якщо у вас можуть бути теги з однаковою назвою у різних галузях, це швидко визнається поганою практикою. Приємно знати, що ти не можеш. Дякую МОЙ!
Поворот

28
Тег - це лише псевдонім для хеша фіксації. Так само, як ви можете взяти на себе зобов’язання, git checkout 88c9f229fви можете зробити щось на кшталт, git checkout your_tagі ви будете перевіряти комісію, яка була відчужена тегом.
jterm

6
@jterm, чи не псевдоніми гілок? Єдина відмінність полягає в тому, що псевдонім гілки автоматично повертається до останнього комітету ланцюга.
Віктор Молокостов

529

З теоретичної точки зору:

  • теги - символічні назви для даної редакції . Вони завжди вказують на один і той же об’єкт (як правило: на одну і ту ж ревізію); вони не змінюються.
  • гілки - символічні назви для лінії розвитку . Нові комісії створюються вгорі відділення. Вказівник гілки природно просувається, вказуючи на новіші та новіші коміти.

З технічної точки зору:

  • теги знаходяться в refs/tags/просторі імен і можуть вказувати на теги об'єктів (анотовані та необов'язково теги, підписані GPG) або безпосередньо на об'єкт (менш використовуваний легкий тег для локальних імен), або в дуже рідкісних випадках навіть на об'єкт дерева або об'єкт blob (наприклад, підпис GPG ).
  • гілки розташовані в refs/heads/просторі імен і можуть вказувати лише на об'єкти . HEADПокажчик повинен ставитися до гілки (символічний відлік) або безпосередньо до фіксації (окремо ГОЛОВКА або неіменованого філія).
  • Гілки віддаленого відстеження проживають у refs/remotes/<remote>/просторі імен та дотримуються звичайних гілок у віддаленому сховищі <remote>.

Дивіться також маніпуляцію з гітглосарію :

відділення

"Гілка" - це активна лінія розвитку. Остання фіксація гілки називається підказкою цієї гілки. На кінчик гілки посилається головка гілки, яка рухається вперед, оскільки додаткова розробка робиться на гілці. Одне сховище git може відслідковувати довільну кількість гілок, але ваше робоче дерево пов'язане лише з однією з них ("поточна" або "перевірена" гілка), і HEAD вказує на цю гілку.

тег

Посилання, що вказує на тег чи об’єкт фіксації. На відміну від заголовка, тег не змінюється. Теги (не об’єкти тегів) зберігаються в $GIT_DIR/refs/tags/. [...]. Тег, як правило, використовується для позначення певної точки в ланцюжку породження.

об'єкт тегів

Об'єкт, що містить посилання, що вказує на інший об'єкт, який може містити повідомлення так само, як об’єкт фіксації. Він також може містити підпис (PGP), і в цьому випадку він називається "об'єктом підписаного тегу".


36
Питання: якщо ви ставитесь до гілки як до тегу (тобто ви створюєте її, то ніколи не оновлюйте її), чи є реальна різниця?
Стів Беннетт

30
@SteveBennett абсолютно. Там міститься різна інформація (ви можете підписати тег, ви можете додати опис до гілки). Ви можете перемістити гілку (тому навіть якщо ви її ніколи не оновлюєте, ви все одно можете її відновити.) Ви не можете перемістити тег (він пов'язаний з певним коміксом). Ви можете натиснути гілку. Теги не висуваються за замовчуванням. Ніколи не слід використовувати одне для іншого (якщо ви справді не в SVN-настрої; в цьому випадку вам потрібно «швидко вчитися», якщо ви хочете продовжувати з git).
VonC

19
@SteveBennett: Існує різниця в тому, як Git поводиться з гілками порівняно з тим, як він обробляє теги. Окрім того, що сказав VonC, ви не можете просунути тег помилково: " git checkout <tag>" генерує анонімну неназвану гілку (так звана "відокремлена HEAD") та вибере стан тегу. Створення нового комітету робить це в цій неназваній гілці і не змінює тег, на який вказує тег.
Якуб Нарбський

60
IMO, гілки розділені часовими рамками (паралельний світ), а теги - це конкретні моменти на часовій шкалі.
Еоніл

25
Ніхто тут ще не згадував про це, але ви можете використовувати тег як точку, щоб запустити відділення:git checkout -b <branch name> <tag name>

143

Якщо ви думаєте про своє сховище як про книгу, яка хроніки просувається у вашому проекті ...

Гілки

Ви можете вважати гілку як одну з таких клейких закладок :

введіть тут опис зображення

Абсолютно новий репозиторій має тільки один з них (називається master), який автоматично переміщається до останньої сторінки (думає , робить ) ви написали. Однак ви можете створювати та використовувати більше закладок, щоб позначити інші цікаві місця в книзі, щоб ви могли швидко повернутися до них.

Також ви завжди можете перемістити певну закладку на якусь іншу сторінку книги (використовуючи git-reset, наприклад); цікаві місця зазвичай змінюються з часом.

Теги

Ви можете вважати теги як заголовки глав .

закладки

Він може містити заголовок (подумайте, анотовані теги ) чи ні. Тег схожий на галузь, але відрізняється тим, що він позначає точку історичного інтересу до книги. Щоб зберегти його історичний аспект, після того, як ви поділилися тегом (тобто пересунули його на загальний пульт дистанційного керування), ви не повинні переміщувати його в якесь інше місце в книзі.


16
Я б уявив, що гілка буде книгою, а закладки - тегами. Ви можете продовжувати писати книгу, але ви не можете її редагувати. Тег - це лише фіксований момент у книзі.
Mārtiņš Briedis

5
@Jubobs Мені сподобалось пояснення галузі як напрямок розвитку. Книга була б галуззю. Ви можете почати нову книгу на основі місця, де виїхали основні гілки. Ви можете записати їх паралельно, а потім спробувати об'єднатись в одну книгу / гілку.
Mārtiņš Briedis

2
@ MārtiņšBriedis Я розумію те, як ти любиш думати про гілку, але я вважаю, що в Git це насправді оману. Див stackoverflow.com/questions/25068543 / ...
jub0bs

2
це справді відповідь на
економію

2
Якщо ви почнете писати книгу і маєте перші 50 сторінок, ви можете скопіювати її (створити з неї нову гілку) і продовжувати писати дві книги одночасно (або надати копію книги іншому письменнику - розробнику) і, нарешті, ви можете об'єднати зміни від іншої до вашої книги.
barell

42

Що вам потрібно зрозуміти, виходячи з CVS, це те, що ви більше не створюєте каталогів під час створення філії.
Немає більше "липкого тегу" (який можна застосувати лише до одного файлу) або "тега гілки".
Гілка та теги - це два різних об’єкти в Git, і вони завжди застосовуються до всіх репо.

Вам більше не доведеться (разом із SVN) чітко структурувати ваше сховище за допомогою:

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

Ця структура походить від того, що CVS є системою редагування, а не системою версій (див. Контроль над джерелами проти контролю за редакцією ? ).
Це означає, що гілки емулюються за допомогою тегів для CVS, копій каталогів для SVN.

Ваше запитання визначає, якщо ви звикли оформити тег і почати працювати над ним .
Що вам не слід;)
Тег повинен представляти незмінний вміст, який використовується лише для доступу до нього з гарантією отримання кожного і того ж вмісту кожного разу.

У Git історія ревізій - це ряд комісій, що утворюють графік.
Гілка - це один шлях цього графіка

x--x--x--x--x # one branch
    \ 
     --y----y # another branch
       1.1
        ^
        |
        # a tag pointing to a commit
  • Якщо ви оформили тег, вам потрібно буде створити відділення, щоб почати працювати з ним.
  • Якщо ви зареєструєте філію, ви безпосередньо побачите останню фіксацію ("HEAD") цієї гілки.

Дивіться відповідь Якуба Нарбського щодо всіх технічних питань, але, відверто кажучи, на даний момент вам не потрібні (поки що) всі деталі;)

Основний момент: тег є простим покажчиком на коміт, ви ніколи не зможете змінювати його вміст. Вам потрібна філія.


У вашому випадку кожен розробник працює над певною функцією:

  • повинні створити власну філію у відповідному сховищі
  • відстежуйте гілки з сховищ своїх колег (той, що працює над тією ж функцією)
  • тягнути / натискати, щоб поділитися своєю роботою з однолітками.

Замість того, щоб безпосередньо відслідковувати гілки ваших колег, ви могли відстежувати лише гілку одного «офіційного» центрального сховища, до якого кожен підштовхує свою роботу, щоб інтегрувати та ділитись усіма роботами для цієї конкретної функції.


1
дякую, що пояснили, як працюють гілки та теги :) Я б не змогла повністю зрозуміти це без вашого прикладу.
ufk

3
@VonC: Я думаю, ви маєте на увазі "SVN" у своїй відповіді, а не "CVS". CVS не має структури каталогів; SVN робить. Насправді, тегнення в git нагадує мені набагато більше тегів у RCS / CVS, ніж тегтування у SVN (де tag == вироджена гілка).
Кріс Кліленд

1
@ChrisCleeland хороший момент. Я спробував відокремити трохи більше CVS та SVN балів у (відредагованій) відповіді.
VonC

37

Гілки виготовляються з дерева і ростуть зі стовбура дерева. Теги виготовлені з паперу (похідне від дерева) і висять, як різдвяні прикраси з різних місць на дереві.

Ваш проект - це дерево, і ваша функція, яка буде додана до проекту, буде рости на гілці. Відповідь - галузь.


3
любов до аналогії
doz87

16

Найкращим способом пояснення виглядає те, що теги діють як лише гілки, що читаються. Ви можете використовувати гілку як тег, але ви можете ненавмисно оновити її новими комісіями. Теги гарантовано вказують на одне і те ж зобов’язання, поки вони існують.


11
Теги гарантовано вказують на одне і те ж зобов'язання, поки вони існують. Не зовсім правда. Ви можете фактично перемістити тег за допомогою git tag -f.
jub0bs

14

Теги можуть бути як підписаними, так і без підписання ; гілки ніколи не підписуються.

Підписані теги ніколи не можуть переміщуватися, оскільки вони криптографічно пов'язані (з підписом) до певного комітету. Непідписані теги не пов'язані, і їх можна переміщувати (але переміщення тегів - це не нормальний випадок використання).

Відділення можуть не тільки переходити до іншого комітету, але, як очікується, це робитимуть. Ви повинні використовувати відділення для свого проекту місцевого розвитку. Не зовсім має сенс привчати роботу до сховища Git "на тег".


12

Мені подобається думати про гілки як про те, куди ти йдеш , теги як там, де ти був .

Тег виглядає як закладка певного важливого моменту в минулому, наприклад, випуску версії.

Тоді як гілка - це певний шлях, в який йде проект, і, таким чином, маркер гілки просувається з вами. Коли ви закінчите, ви з’єднуєте / видаляєте гілку (тобто маркер). Звичайно, в цей момент ви можете вибрати тег, який виконує.


10

Git Притча пояснює , як типовий DVCS отримує створений і чому їх творці зробили те , що вони зробили. Також ви можете поглянути на Git for Computer Scientist ; він пояснює, що робить кожен тип об’єктів у Git, включаючи гілки та теги.


6

Тег використовується для позначення версії, більш конкретно, вона посилається на момент часу на гілці. Гілка зазвичай використовується для додавання функцій до проекту.



4

проста відповідь:

гілка: поточний вказівник гілки переміщується з кожним переходом на сховище

але

тег: фіксація, що точки тегів не змінюється, насправді тег є знімком цього коміту.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.