
در گیت، 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 کار می کنند:
- فصل ~ و فصل N
- فصل^ و فصل ^ ن
- [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 را لغو کنیم