Git
Chapters ▾ 2nd Edition

2.6 پایه های گیت - برجسب گذاری

برجسب گذاری

همچون دیگر سامانه های کنترل نسخه، گیت هم می تواند یک نقطه ی خاص از تاریخچه ی پروژه را به عنواه نقطه ی مهم و با اهمیت برچسب گذاری کند. معمولا افراد از این قابلیت برای نشانه گذاری نسخه های قابل ارائه یا همان release کردن پروژه بهره می برند.( نسخه v1.0، و به همین ترتیب). در این بخش یاد فهرست گرفتن از برچسب های موجود، شیوه ساخت برچسب جدید و این که گونه های متفاوت برچسب ها هر کدام چه هستند را یاد خواهید گرفت.

فهرست برچسب های موجود

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

$ git tag
v0.1
v1.3

این دستور، برچسب های موجود را به ترتیب حرف الفبا نشان می دهد; درواقع ترتیب نمایش آنها هیچ اهمیت ندارد.

همچنین می توان برچسب ها را جست و جو کنید و از قواعد الگوها نیز بهره مند شود. برای نمونه مخزن اصلی گیت، بیش از 500 برچسب دارد. مثلا اگر میخواید تنها به دنبال برجسب های سری 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
Note
Listing tag wildcards requires -l or --list option

If you want just the entire list of tags, running the command git tag implicitly assumes you want a listing and provides one; the use of -l or --list in this case is optional.

If, however, you’re supplying a wildcard pattern to match tag names, the use of -l or --list is mandatory.

ساخت برچسب ها

گیت دو گونه برچسب دارد: lightweight یا سبک و annotated یا مفصل.

یگ برچسب lightweight بسیار شبیه یک شاخه ی بدون تغییر است. — فقط اشاره گری به یک ثبت ویژ] و مشخص است.

برچسب های Annotated , however, به عنوان مجموعه ای از اشیاء کامل در پایگاه داده گیت ذخیره می شوند. این برچسب ها کنترل checksum می شوند; شامل نام کاربر، ایمیل و تاریخ برجسب گذاری هستند; پیام مربوط به برچسب را دارند; و می توان آنها را با GPG (GNU Privacy Guard) علامت گذاری و تایید نمود.

بیشتر پیشنهاد می شود که برچسب های annotated ایجاد کنید تا به همه این داده ها دسترسی داشته باشد; اما اگر تنها یک برچسب موفت و گذرا نیاز دارید و یا به هر روی نباید داده ها ذخیره شوند می توانید از برچسب های lightweight بهره بگیرید.

برچسبهای Annotated

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

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

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

داده های برچسب را میتوانید در همان ثبت برچسب گذاری شده با دستور 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

    changed the version number

این دستور داده های کاربر برچسب گذار، تاریخ برچسب گذاری و پیام مربوط به برچسب را پیش ا ز داده های ثبت مربوطه نشان می دهد.

برچسب های Lightweight

راه دیگری برای برچسب گذاری ثبت ها برچسب lightweight است. این برچسب تنها checksum مربوط به ثبت است که در یک فایل ذخیره می شود — اطلاعات دیگری نگه داشته نمیشود. برای ساخت یک برچشب lightweight، هیچکدام از گزینه های -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

    changed the version number

برچسب گذاری با تاخیر

همچینین می توانید بعد از چند ثبت،ثبت های پیشین را برچسب گذاری کتید. فرض کنید تاریخچه ی برچسب های شما شبیه این باشد:

$ git log --pretty=oneline
15027957951b64cf874c3557a0f3547bd83b3ff6 Merge branch 'experiment'
a6b4c97498bd301d84096da251c98a07c7723e65 beginning write support
0d52aaab4479697da7686c15f77a3d64d9165190 one more thing
6d52a271eda8725415634dd79daabbc4d9b6008e Merge branch 'experiment'
0b7434d86859cc7b8c3d5e1dddfed66ff742fcbc added a commit function
4682c3261057305bdd616e23b64b0857d832627b added a todo file
166ae0c4d3f420721acbb115cc33848dfcc2121a started write support
9fceb02d0ae598e95dc970b74767f19372d61af8 updated rakefile
964f16d36dfccde844893cac5b347e7b3d44abbc commit the todo
8a5cbc430f1a9c3d00faaeffd07798508422908a updated readme

اینک فرض کنید که در ثبت “updated rakefile`` فراموش کرده اید پروژ] را با v1.2 برچسب گذاری نمایید. Now, suppose you forgot to tag the project at v1.2, which was at the ``updated rakefile” commit. پس از ثبت می توانید این کار را انجام دهید. برای برچسب گذاری ثبت های پیشین، checksum مربوط به ثبت را (یا بخشی از آن را ) در پایان دستور وارد نمایید.

$ git tag -a v1.2 9fceb02

می بینید که ثبت مورد نظر برچسب گذاری شده است:

$ 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

    updated rakefile
...

اشتراک گذری برجسب ها

دستور 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

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

$ 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

اینک اگر کسی دیگر از مخزن ما نمونه برداری کرد یا تنها ثبت ها را فراخوانی و بارگزاری کرد، تمام برجسب ها را نیز دریافت خواهد نمود.

Checking out Tags

اگر نسخه های فایلهایی که برچسب به آنها اشاره می کند را می خواهید ببینید، می توانید یک git checkout اجرا کنید، آگاه باشید که این کار مخزن شما را در وضعیت detached HEAD قرار میدهد, که امکان تاثیر جانبی ناپسندی دارد.:

$ git checkout 2.0.0
Note: checking out '2.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 -b with the checkout command again. Example:

  git checkout -b <new-branch>

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

$ git checkout 2.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 اگر تغییراتی ایجاد کنید و آنها را ثبت کنید، برچسب تغییر نخواهد کرد، ولی ثبت جدید در هیچ شاخه ای جای نمیگیرد و از دسترس خارج میشود، مگر با کد کامل hash مربوط به آن ثبت. بنابراین اگر نیاز به ایجاد تغییرات دارید — مثلا میخواهید یک باگ را در نسخه های پیشین برطرف نمایید — شماه باید یک شاخه ی جدید بسازید.

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

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