Chapters ▾ 2nd Edition

2.6 مقدمات گیت (git basics chapter) - تگ کردن (Tagging)

تگ کردن (Tagging)

مانند اکثر VCS ها، گیت توانایی برچسب گذاری نقاط خاص در تاریخچه یک مخزن را به عنوان مهم دارد. به طور معمول، مردم از این قابلیت برای مشخص کردن نقاط انتشار (v1.0، v2.0 و غیره) استفاده می کنند. در این بخش، شما یاد خواهید گرفت که چگونه برچسب های موجود را لیست کنید، چگونه برچسب ها را ایجاد و حذف کنید، و انواع مختلف برچسب ها چیست.

لیست کردن تگ ها (Listing Your Tags)

فهرست کردن تگ های موجود در گیت ساده است. فقط تایپ کنید git tag (با اختیاری -l یا --list):

$ git tag
v1.0
v2.0

این دستور برچسب ها را به ترتیب الفبا لیست می کند؛ ترتیب نمایش آنها اهمیت واقعی ندارد.

همچنین می توانید برچسب هایی را که با یک الگوی خاص مطابقت دارند، جستجو کنید. به عنوان مثال، منبع گیت شامل بیش از ۵۰۰ تگ است. اگر شما فقط علاقه مند به نگاه کردن به سری 1.8.5 هستید، می توانید این را اجرا کنید:

$ git tag -l "v1.8.5*"
v1.8.5
v1.8.5-rc0
v1.8.5-rc1
v1.8.5-rc2
v1.8.5-rc3
v1.8.5.1
v1.8.5.2
v1.8.5.3
v1.8.5.4
v1.8.5.5
یادداشت
Listing tag wildcards requires -l or --list option

اگر شما فقط کل لیست برچسب ها را می خواهید، اجرای دستور git tag به طور ضمنی فرض می کند که شما یک لیست می خواهید و یک لیست را ارائه می دهد؛ استفاده از -l یا --list در این مورد اختیاری است.

با این حال، اگر شما در حال ارائه یک الگوی کارد جوینده برای مطابقت با نام های برچسب هستید، استفاده از -l یا --list اجباری است.

ساخت تگ (Creating Tags)

گیت از دو نوع تگ پشتیبانی می کند: lightweight و annotated.

یک تگ سبک وزن بسیار شبیه به یک شاخه است که تغییر نمی کند — فقط یک اشاره کننده به یک commit خاص است.

با این حال، برچسب های تشریح شده به عنوان اشیاء کامل در پایگاه داده گیت ذخیره می شوند. آنها چک جمع شده اند؛ شامل نام، ایمیل و تاریخ برچسب دار هستند؛ یک پیام برچسب دار دارند؛ و می توانند با GNU Privacy Guard (GPG) امضا و تأیید شوند. به طور کلی توصیه می شود که شما برچسب های تفسیر شده ایجاد کنید تا بتوانید تمام این اطلاعات را داشته باشید؛ اما اگر شما یک برچسب موقت می خواهید یا به دلایلی نمی خواهید اطلاعات دیگر را نگه دارید، برچسب های سبک وزن نیز در دسترس هستند.

تگ‌های حاشیه‌گذاری‌شده (Annotated Tags)

ایجاد یک برچسب با یادداشت در گیت ساده است. ساده ترین راه این است که -a را مشخص کنید وقتی دستور tag را اجرا می کنید:

$ git tag -a v1.4 -m "my version 1.4"
$ git tag
v0.1
v1.3
v1.4

-m یک پیام برچسب گذاری را مشخص می کند که با برچسب ذخیره می شود. اگر شما یک پیام برای یک تگ با اشاره مشخص نکنید، Git ویرایشگر شما را راه اندازی می کند تا شما بتوانید آن را تایپ کنید.

شما می توانید داده های تگ را همراه با commit که با استفاده از دستور `git show ` تگ شده است ببینید:

$ git show v1.4
tag v1.4
Tagger: Ben Straub <ben@straub.cc>
Date:   Sat May 3 20:19:12 2014 -0700

my version 1.4

commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Mon Mar 17 21:52:11 2008 -0700

    Change version number

این اطلاعات برچسب دار را نشان می دهد، تاریخ برچسب گذاری commit، و پیام تبصری قبل از نمایش اطلاعات commit.

تگ‌های سبک (Lightweight Tags)

راه دیگری برای برچسب گذاری commit ها با یک برچسب سبک وزن است. این اساساً چک سوم تاییدیه ای است که در یک فایل ذخیره شده است — هیچ اطلاعات دیگری حفظ نمی شود. برای ایجاد یک تگ سبک، هیچ یک از گزینه های -a، -s یا -m را ارائه ندهید، فقط یک نام تگ را ارائه دهید:

$ git tag v1.4-lw
$ git tag
v0.1
v1.3
v1.4
v1.4-lw
v1.5

این بار، اگر شما git show را روی برچسب اجرا کنید، اطلاعات برچسب اضافی را نمی بینید. دستور فقط کامیت رو نشون میده:

$ git show v1.4-lw
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Mon Mar 17 21:52:11 2008 -0700

    Change version number

برچسب‌گذاری بعدی (Tagging Later)

شما همچنین می توانید بعد از اینکه از آنها گذشته اید، آنها را برچسب بزنید. فرض کنید که سابقه ی commit شما اینگونه باشد:

$ git log --pretty=oneline
15027957951b64cf874c3557a0f3547bd83b3ff6 Merge branch 'experiment'
a6b4c97498bd301d84096da251c98a07c7723e65 Create write support
0d52aaab4479697da7686c15f77a3d64d9165190 One more thing
6d52a271eda8725415634dd79daabbc4d9b6008e Merge branch 'experiment'
0b7434d86859cc7b8c3d5e1dddfed66ff742fcbc Add commit function
4682c3261057305bdd616e23b64b0857d832627b Add todo file
166ae0c4d3f420721acbb115cc33848dfcc2121a Create write support
9fceb02d0ae598e95dc970b74767f19372d61af8 Update rakefile
964f16d36dfccde844893cac5b347e7b3d44abbc Commit the todo
8a5cbc430f1a9c3d00faaeffd07798508422908a Update readme

حالا فرض کنید فراموش کرده اید که پروژه را در نسخه 1.2 برچسب بزنید، که در "Update rakefile" commit بود. می تونی بعد از واقعه اضافهش کنی برای برچسب زدن به این کامیت، شما چک سوم کامیت (یا بخشی از آن) را در انتهای دستور مشخص می کنید:

$ git tag -a v1.2 9fceb02

شما می توانید ببینید که شما تاگ commit:

$ git tag
v0.1
v1.2
v1.3
v1.4
v1.4-lw
v1.5

$ git show v1.2
tag v1.2
Tagger: Scott Chacon <schacon@gee-mail.com>
Date:   Mon Feb 9 15:32:16 2009 -0800

version 1.2
commit 9fceb02d0ae598e95dc970b74767f19372d61af8
Author: Magnus Chacon <mchacon@gee-mail.com>
Date:   Sun Apr 27 20:43:35 2008 -0700

    Update rakefile
...

اشتراک گذاری تگ ها (Sharing Tags)

به طور پیش فرض، دستور git push برچسب ها را به سرورهای از راه دور منتقل نمی کند. شما باید به طور صریح تگ ها را به یک سرور مشترک پس از ایجاد آنها ارسال کنید. این فرآیند درست مثل اشتراک گذاری شاخه های از راه دور است — شما می توانید git push origin <tagname> را اجرا کنید.

$ git push origin v1.5
Counting objects: 14, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (12/12), done.
Writing objects: 100% (14/14), 2.05 KiB | 0 bytes/s, done.
Total 14 (delta 3), reused 0 (delta 0)
To git@github.com:schacon/simplegit.git
 * [new tag]         v1.5 -> v1.5

اگر تعداد زیادی tag دارید که می‌خواهید همزمان ارسال کنید، می‌توانید از گزینه --tags در دستور git push استفاده کنید. این کار تمام tagهایی را که هنوز در سرور راه‌دور وجود ندارند، منتقل می‌کند.

$ git push origin --tags
Counting objects: 1, done.
Writing objects: 100% (1/1), 160 bytes | 0 bytes/s, done.
Total 1 (delta 0), reused 0 (delta 0)
To git@github.com:schacon/simplegit.git
 * [new tag]         v1.4 -> v1.4
 * [new tag]         v1.4-lw -> v1.4-lw

حالا، وقتی کسی از مخزن شما کلان یا استخراج می کند، همه ی برچسب های شما را هم می گیرد.

یادداشت
git push pushes both types of tags

دستور git push <remote> --tags هر دو نوع lightweight و annotated tag را ارسال می‌کند. در حال حاضر گزینه‌ای برای ارسال فقط lightweight tags وجود ندارد، اما اگر از git push <remote> --follow-tags استفاده کنید، تنها annotated tags به سرور راه‌دور ارسال خواهند شد.

حذف تگ ها (Deleting Tags)

برای حذف یک برچسب در مخزن محلی خود، می توانید از git tag -d <tagname> استفاده کنید. به عنوان مثال، می توانیم برچسب سبک وزن بالا را به صورت زیر حذف کنیم:

$ git tag -d v1.4-lw
Deleted tag 'v1.4-lw' (was e7d5add)

توجه داشته باشید که این کار برچسب را از هر سرور از راه دور حذف نمی کند. دو نوع رایج برای حذف یک برچسب از یک سرور از راه دور وجود دارد.

اولین تغییر `git push <remote> :refs/tags/<tagname> ` است:

$ git push origin :refs/tags/v1.4-lw
To /git@github.com:schacon/simplegit.git
 - [deleted]         v1.4-lw

روش تفسیر این مطلب این است که آن را به عنوان مقدار صفر قبل از فشار دادن دو نقطه به نام تگ از راه دور بخوانیم، و به طور موثر آن را حذف کنیم.

راه دوم (و بصری تر) برای حذف یک برچسب از راه دور این است:

$ git push origin --delete <tagname>

چک کردن تگ ها (Checking out Tags)

اگر می خواهید نسخه های فایل هایی که یک برچسب به آنها اشاره دارد را مشاهده کنید، می توانید یک چکآوت `git از آن برچسب را انجام دهید، اگرچه این مخزن شما را در حالت “detached HEAD” قرار می دهد، که دارای برخی از عوارض جانبی بد است:

$ git checkout v2.0.0
Note: switching to 'v2.0.0'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -c with the switch command. Example:

  git switch -c <new-branch-name>

Or undo this operation with:

  git switch -

Turn off this advice by setting config variable advice.detachedHead to false

HEAD is now at 99ada87... Merge pull request #89 from schacon/appendix-final

$ git checkout v2.0-beta-0.1
Previous HEAD position was 99ada87... Merge pull request #89 from schacon/appendix-final
HEAD is now at df3f601... Add atlas.json and cover image

در حالت detached HEAD، اگر تغییراتی ایجاد کنید و سپس یک commit بسازید، tag بدون تغییر می‌ماند، اما commit جدید به هیچ شاخه‌ای تعلق نخواهد داشت و تنها از طریق hash دقیق commit قابل دسترسی است. بنابراین، اگر نیاز به اعمال تغییرات دارید — برای مثال اصلاح یک باگ در نسخه‌ای قدیمی — معمولاً بهتر است یک branch ایجاد کنید:

$ git checkout -b version2 v2.0.0
Switched to a new branch 'version2'

اگر این کار را انجام دهید و یک commit را انجام دهید، شاخه version2 شما کمی متفاوت از برچسب v2.0.0 خواهد بود، زیرا با تغییرات جدید شما پیش خواهد رفت، بنابراین مراقب باشید.

scroll-to-top