منو سایت

راهنمای کامل (همراه با مثال)

 تاریخ انتشار :
/
  وبلاگ
راهنمای کامل (همراه با مثال)

در گیت، HEAD وضعیت فعلی صنعتی است که در آن فعالیت می کنید HEAD یک اشاره گر است که شما را در همه جا دنبال می کند.

اگر از هر شاخه git خارج شدید و git show HEAD را اجرا کردید، آخرین commit را نشان می دهد.

$ git show HEAD

commit 8994913e0be924ac5330bf85a35ecb08983731ce (HEAD -> main)
Merge: 59beccd 8ee00b3
Author: artturijalli
Date:   Tue Dec 6 13:19:13 2022 +0200

    Merge branch 'feature'

به نوعی، شما رئیس Git هستید. به بالای شاخه فعلی شما اشاره می کند و در حالی که شما تعهدات جدید می دهید، با شاخه حرکت می کند.

این HEAD همچنین می تواند به جای یک شاخه به یک commit خاص اشاره کند. وقتی این اتفاق می افتد، شما در یک مکان جداگانه هستید HEAD وضعیت.

این راهنما به شما می آموزد که HEAD در Git چیست و با چه نوع نمادهای مختلف HEAD (HEAD~ HEAD^) ممکن است مواجه شوید و چگونه کار می کنند.

بیایید به آن بپریم!

HEAD در Git چیست؟

راهنمای کامل (همراه با مثال)

در گیت، HEAD یک اشاره نمادین به جایی است که اکنون هستید. HEAD شما را در همه جا در Git دنبال می کند.

اگر در شعبه ثبت نام کرده اید، HEAD به وضعیت شعبه ای که در آن هستید اشاره دارد. به عبارت دیگر، HEAD شما را به آخرین commit در شعبه می برد. اگر یک commit جدید برای شعبه ایجاد کنید، HEAD و مرجع شاخه با هم حرکت می کنند تا به commit جدید اشاره کنند.

اکثر آموزش ها (از جمله این آموزش) این را می گویند HEAD به آخرین commit در یک شاخه اشاره می کند. اما در واقعیت، HEAD به جای یک commit خاص به شاخه فعلی اشاره دارد.

اگر این شما را گیج می کند، به این شکل فکر کنید: وضعیت شاخه فعلی همان چیزی است که توسط آخرین commit ایجاد شد. این HEADکه ارجاع به شاخه فعلی است، یک اشاره گر به آخرین commit است، اگرچه از نظر فنی به شاخه اشاره می کند، نه commit.

یک مثال

با دویدن می توانید بررسی کنید سرتان به کجا اشاره می کند cat .git/HEAD.

این فهرست محتویات HEAD فایل، یعنی کجا HEAD در حال حاضر اشاره به.

مثلا من یک نمونه پروژه دارم و در شعبه ارشد هستم. این چیزی است که cat .git/HEAD دستور من نشان می دهد:

راهنمای کامل (همراه با مثال)

این نشان می دهد که HEAD واقعا به main شاخه.

HEAD را در Git جدا کنید

قبلا یاد گرفتی HEAD به شعبه ای که در حال حاضر در آن هستید اشاره می کند.

اما می توان انجامش داد HEAD به تعهد خاصی در گذشته اشاره کنید. به طور خاص، اگر به تعهد خاصی پرداخت کنید، کنار می گذارید HEAD از شاخه و آن را به درگیر شدن هدایت می کند. این به عنوان حالت اصلی جداگانه در Git شناخته می شود.

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

$ git checkout accf83fb43aabd0f55780657d57e07ffbeeeb1e1

Note: switching to 'accf83fb43aabd0f55780657d57e07ffbeeeb1e1'.

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 switching back to a branch.

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 accf83f Change the file contents

از پیام نسبتا طولانی بالا می توانید آن را ببینید HEAD اکنون به جای شاخه اصلی به commit اشاره می کند.

بیایید این را بررسی کنیم cat .git/HEAD:

راهنمای کامل (همراه با مثال)

همانطور که می بینید، در حال حاضر HEAD به جای شاخه به یک commit اشاره می کند. شما نمی توانید در این حالت محدود کار زیادی انجام دهید – قرار دادن و درگیر شدن امکان پذیر نیست زیرا HEAD به یک شاخه اشاره نمی کند، بلکه به یک commit اشاره می کند.

HEAD همیشه شما در Git هستید

در Git، شما HEAD هستید. همه جا شما را دنبال می کند. شما نمی توانید HEAD خود را در Git از دست بدهید.

حتی اگر در حالت HEAD جدا شده باشید، HEAD خود را از دست نداده اید. در عوض، HEAD شما را دنبال کرده است و اکنون به جای یک شاخه، به یک commit اشاره می کند.

اکنون که درک بهتری از HEAD در Git دارید، بیایید به برخی از نمادهایی که ممکن است با آنها برخورد کرده باشید نگاهی بیندازیم.

نمادهای HEAD مختلفی که در Git می بینید

آیا تا به حال به این فکر کرده اید که این نام ها چه چیزی را دوست دارند؟ HEAD~، HEAD^^^، [email protected]{2}?

این بخش به شما می آموزد که منابع HEAD زیر به چه معنا هستند و چگونه در Git کار می کنند:

  1. فصل ~ و فصل N
  2. فصل^ و فصل ^ ن
  3. [email protected]{H}

1. HEAD ~ چیست؟

HEAD~ میانبری است که به commit انجام شده قبل از آخرین commit اشاره دارد. به یک معنا، HEAD~ وضعیت شعبه یک تعهد پیش است HEAD مشغول کردن.

با اجرای زیر می توانید commit را قبل از آخرین commit ببینید:

$ git show HEAD~

استفاده كردن HEAD~ نشانه گذاری زمانی مفید است که شما نیاز به تعیین commit دارید اما نمی خواهید شناسه های commit را جستجو کنید.

به عنوان مثال، می توانید تغییرات بین دومین و سومین کامیت اخیر را با استفاده از موارد زیر بررسی کنید:

$ git diff HEAD~ HEAD~~

همچنین می توانید یک عدد بعد از ~ برای نشان دادن تعداد مشخصی از commit های قبل مشخص کنید HEAD مشغول کردن.

$ git show HEAD~N

مثلا، HEAD~2 به کامیتی که دو کامیت قبل است اشاره خواهد کرد HEAD درگیر شدن (یعنی HEAD~~) و HEAD~3 به کامیتی که سه کامیت قبل است اشاره خواهد کرد HEAD درگیر شدن (یعنی HEAD~~~).

در اینجا تصویری از نحوه عملکرد نماد HEAD~ آورده شده است:

راهنمای کامل (همراه با مثال)

2. HEAD ^ چیست؟

HEAD^ میانبر دیگری است که به یک commit خاص در Git اشاره می کند. بسیار شبیه است HEAD~. این HEAD^ بنابراین به تعهد انجام شده قبلا اشاره می کند HEAD ارتکاب، در همان شاخه.

بر اساس این توصیف، به نظر می رسد که HEAD^ و HEAD~ دقیقا به همین صورت کار می کند

شباهت بین HEAD^ و HEAD~ این است که می‌توانید برای ارجاع به کامیت‌های قبلی، کرت‌ها یا تایلدهای متوالی را وارد کنید.

مثلا:

  • HEAD^^^ سومین تعهد اخیر است.
  • HEAD~~~ سومین تعهد اخیر است.

اما یک تفاوت آشکار نیز بین آن وجود دارد HEAD^ و HEAD~ در Git.

می توانید تماس بگیرید HEAD^ به دنبال آن یک عدد، مانند HEAD^2 اما با آن یکی نیست HEAD^^! (با علامت HEAD~، HEAD~~ مثل این هست که HEAD~2).

HEAD^1 به والد اول اشاره خواهد کرد HEAD من متعهد می شوم HEAD^2 به والد دوم اشاره خواهد کرد HEAD ارتکاب (در صورت وجود) و غیره

به عنوان مثال، اگر شعبه شما با شاخه دیگری ادغام نشده باشد، HEAD^2 وجود ندارد.

رکورد عددی با HEAD^ اگر یک شاخه را با شاخه فعلی ادغام کرده باشید، اعمال می شود. این تصویر استفاده از HEAD^ کامل. جدیدترین نامزدی، Dتعهد به ادغام است main و عملکرد branch.

راهنمای کامل (همراه با مثال)

بنابراین همانطور که می بینید، HEAD^1 اشاره به جدیدترین تعهد انجام شده در main شاخه. این HEAD^2 اشاره به جدیدترین تعهد انجام شده در feature شعبه قبل از ادغام اگر نبود feature شعبه با شاخه اصلی ادغام شد، HEAD^2 وجود نخواهد داشت.

3. چیست [email protected]{H}؟

[email protected]{N} اشاره ای به یک حالت خاص است HEAD دایرکتوری در Git reflog.

اگر نمی‌دانستید، git reflog یک گزارش مرجع است که تمام تغییرات ایجاد شده در آن را ذخیره می‌کند HEAD یک دایرکتوری در یک مخزن محلی Git.

هر ورودی reflog دارای یک عدد مربوطه است که با آن شروع می شود 0 برای آخرین رکورد و افزایش با 1 برای هر ورودی قبلی [email protected]{N} اشاره به حالت HEAD اشاره گر به Nورودی reflog

Git reflog یک ابزار ارزشمند برای مدیریت و ردیابی عملیات Git است که در یک مخزن محلی انجام می شود. این به شما امکان می دهد گزارشی از تمام تغییرات ایجاد شده در آن را مشاهده کنید HEAD اشاره گر که می تواند برای شناسایی زمانی که تعهدات خاصی انجام شده است مفید باشد. مهمتر از آن، بازیابی خطاها یا تغییرات ناخواسته در مخزن را امکان پذیر می کند.

یکی از کاربردهای رایج ریبلاگ، بازیابی از خطاها، مانند بازگرداندن ریست سخت افزاری است. با reflog می توانید وضعیت را پیدا کنید HEAD اشاره‌ای به زمان قبل از اینکه مرتکب اشتباه در بازگرداندن مخزن به آن وضعیت شوید.

خلاصه

امروز یاد گرفتید که چیست HEAD در Git.

برای بردن به خانه، HEAD اشاره ای به وضعیت فعلی ذخیره سازی محلی است. به آخرین commit در شعبه اشاره می کند که در حال حاضر بررسی شده است. این HEAD می توان به عنوان یک اشاره گر در نظر گرفت که موقعیت فعلی مخزن را نشان می دهد.

راه عالی برای دیدن HEAD این است که اساسا شما هستید! هر کاری که در Git انجام می دهید، HEAD را دنبال می کند. اگر قرار ملاقات جدیدی ایجاد کنید، HEAD (و شاخه) حرکت می کند. اگر در گذشته به تعهدی پرداخته اید، HEAD را دنبال می کند. این HEAD همیشه به جایی که در پروژه هستید اشاره می کند.

می توانید با افزودن tildes بعد به commit های قبلی در شاخه مراجعه کنید HEAD. مثلا، HEAD~~ به دو نامزدی قبل از آخرین مورد اشاره دارد.

با تشکر برای خواندن. کد نویسی مبارک!

همچنین بخوانید

چگونه بازنشانی Git را لغو کنیم