سرفصل‌های آموزشی
آموزش گیت
آشنایی با روش‌های مختلف ری‌سِت کردن تغییرات در Git

آشنایی با روش‌های مختلف ری‌سِت کردن تغییرات در Git

در ادامهٔ آموزش قبل، به منظور تست قابلیت‌های بیشتری از گیت، فایل index.html را به صورت زیر آپدیت می‌کنیم:

<!DOCTYPE html>
<html>

<head>
    <title>Sokan Academy Git Tutorial</title>
</head>

<body>
    <h1>This is a Git tutorial</h1>
    <p>In this course, we`re learning the basics the Git</p>
    <p>A new paragraphp</p>
</body>

</html>

اگر به خروجی لاگ نگاه کنیم نیز خواهیم داشت:

/var/www/git-tutorial$ git log --oneline
23d2256 (HEAD -> master) a new line added
fd728ca Yet another commit

فرض کنیم که اکنون می‌خواهیم به کامیتی با شناسهٔ fd728ca بازگردیم که برای این منظور خواهیم داشت:

/var/www/git-tutorial$ git checkout fd728ca
Note: checking out 'fd728ca'.

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-name>

HEAD is now at fd728ca Yet another commit

اکنون فرض کنیم که پشیمان شده و مجدد می‌خواهیم آخرین تغییرات را بازگردانی کنیم که در این صورت زیر می‌توان از کامند زیر استفاده کرد:

/var/www/git-tutorial$ git checkout master
Previous HEAD position was fd728ca Yet another commit
Switched to branch 'master'

می‌بینیم که آخرین تغییرات بازگردانی شده‌اند. علاوه بر دستور checkout کامند دیگری داریم به نام revert که به منظور بازگشت به گذشته مورد استفاده قرار می‌گیرد. برای درک بهتر سازوکار این کامند، فایل جدیدی تحت عنوان app.js حاوی محتویات زیر می‌سازیم:

console.log('something ...');

سپس این فایل را کامیت کرده و لاگ می‌گیریم:

/var/www/git-tutorial$ git log --oneline
feb2252 (HEAD -> master) a js file added
23d2256 a new line added
fd728ca Yet another commit

فرض می‌کنیم که قصد داریم شرایط را به زمانی که این فایل جاوااسکریپتی را اضافه نکرده بودیم بازگردانیم که برای این منظور می‌توان از کامند revert به صورت زیر استفاده کرد:

/var/www/git-tutorial$ git revert feb2252

و به محض آن که دکمهٔ اینتر را فشار دهیم، ادیتور پیش‌فرض سیستم‌عامل (که در این آموزش nano است.) باز خواهد شد:

Revert "a js file added"

This reverts commit feb22521a412bbcd2e9dba26897522727a7ded2f.

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# On branch master
# Changes to be committed:
#       deleted:    app.js
#

هشداری به کاربر داده می‌شود مبنی بر این که آیا مطمئن است قصد انجام این کار را دارد یا خیر که اگر از این بابت مطمئن بودیم، صرفاً نیاز است تا دکمه‌های Ctrl + X را فشرده تا تغییرات اِعمال گردند.

    به خاطر داشته باشید
لازم به یادآوری است که بسته به نوع سیستم‌عامل و ادیتوری که باز شده است،‌ ممکن است این شورت‌کات‌ها متفاوت باشند.

در ادامهٔ کار، اگر مجدد لاگ بگیریم خواهیم داشت:

/var/www/git-tutorial$ git log --oneline
935d66e (HEAD -> master) Revert "a js file added"
feb2252 a js file added
23d2256 a new line added
fd728ca Yet another commit

می‌بینیم که کامیت مذکور با شناسهٔ feb2252 کماکان در لیست کامیت‌ها قرار دارد اما لاگ جدیدی با شناسهٔ 935d66e افزوده شده که حاکی از حذف تغییرات صورت‌گرفته از طریق آن کامیت دارد و چنانچه به پوشهٔ پروژه نگاه کنیم، خواهیم دید که فایل app.js حذف شده است. در واقع،‌ با این کار تغییرات مذکور را به اصطلاح Undo کرده‌ایم.

دستور دیگری که در این ارتباط می‌تواند مورد استفاده قرار گیرد، reset است که برای درک بهتر این موضوع، تغییر کوچکی داخل فایل index.html قرار داده و آن را کامیت می‌کنیم:

<!DOCTYPE html>
<html>

<head>
    <title>Sokan Academy Git Tutorial</title>
</head>

<body>
    <h1>This is a Git tutorial</h1>
    <p>In this course, we`re learning the basics the Git</p>
    <p>A new paragraphp</p>
    <p>This is a change</p>
</body>

</html>

همان‌طور که ملاحظه می‌گردد، یک پاراگراف جدید افزوده‌ایم و اگر پس از کامیت آخرین تغییرات لاگ بگیریم، خواهیم داشت:

/var/www/git-tutorial$ git log --oneline
6382718 (HEAD -> master) a minor change happened
935d66e Revert "a js file added"
feb2252 a js file added
23d2256 a new line added
fd728ca Yet another commit

می‌بینیم که پیام آخرین کامیت با شناسهٔ 6382718 حاکی از آن است که یک تغییر کوچک رخ داده است؛ حال تصور کنیم که می‌خواهیم با کامیتی به پیام a new line added برگردیم که برای این منظور از کامند زیر استفاده خواهیم کرد:

/var/www/git-tutorial$ git reset 23d2256
Unstaged changes after reset:
M       index.html

اگر مجدد لاگ بگیریم نیز خواهیم دید:

/var/www/git-tutorial$ git log --oneline
23d2256 (HEAD -> master) a new line added
fd728ca Yet another commit

می‌بینیم که دیگر کامیت‌ها از ریشه حذف شده‌اند و هرگز دیگر به آن‌ها دسترسی نخواهیم داشت اما در عین حال می‌بینیم که کلیهٔ‌ تغییراتی که از آن کامیت به بعد صورت دادیم جملگی وجود دارند!

    هشدار 
با توجه به این که اثرات اجرای این کامند غیرقابل‌برگشت است، در استفاده از آن می‌باید احتیاط کرد.

برای آن که تغییرات جدید شامل نشوند،‌ به صورت زیر می‌توان از فلگ hard-- استفاده کرد:

/var/www/git-tutorial$ git reset 23d2256 --hard
HEAD is now at 23d2256 a new line added

اکنون اگر به فایل index.html نگاهی بیندازیم، خواهیم دید:

<!DOCTYPE html>
<html>

<head>
    <title>Sokan Academy Git Tutorial</title>
</head>

<body>
    <h1>This is a Git tutorial</h1>
    <p>In this course, we`re learning the basics the Git</p>
    <p>A new paragraphp</p>
</body>

</html>

می‌بینیم که دقیقاً به همان نقطه‌ای بازگشتیم که مد نظر داشتیم. در ادامه، با استفاده از دستور زیر فایل دیگری تحت عنوان tmp.html می‌سازیم:

/var/www/git-tutorial$ touch tmp.html

سپس با استفاده از دستور زیر آن را وارد فاز اِستیج می‌کنیم:

/var/www/git-tutorial$ git add tmp.html

و اگر وضعیت گیت را به صورت زیر چک کنیم:

/var/www/git-tutorial$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        new file:   tmp.html

می‌بینیم که این فایل آمادهٔ کامیت شدن است اما فرض کنیم که قصد داریم تا این فایل را از پروسهٔ کامیت حذف کنیم که برای این منظور،‌ می‌توان از دستور git reset tmp.html استفاده کرد و اگر مجدد وضعیت را چک کنیم نیز خواهیم داشت:

/var/www/git-tutorial$ git status
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

        tmp.html

nothing added to commit but untracked files present (use "git add" to track)

از این پس دیگر هرگز کامیت‌های بعدی شامل این فایل نخواهند بود. حال فرض کنیم که بیش از یک فایل به پروژه افزوده شده و یا دستخوش تغییر شده است و به جای آن که بخواهیم یک به یک آن‌ها را وارد مرحلهٔ اِستیج کنیم، می‌توانیم با یک دستور تمامی آن‌ها را آمادهٔ کامیت شدن نماییم. به طور مثال، دو فایل جدید تحت عناوین tmp1.html و tmp2.html ساخته سپس وضعیت را چک می‌کنیم:

/var/www/git-tutorial$ git status
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

        tmp1.html
        tmp2.html

nothing added to commit but untracked files present (use "git add" to track)

می‌بینیم که دو فایل داخل پروژهٔ خود داریم که آماده‌اند تا وارد فاز اِستیج شوند و برای آن که هر دو را به یک باره بیفزاییم، می‌توانیم از کامند زیر استفاده کنیم:

/var/www/git-tutorial$ git add .

اگر مجدد وضعیت را چک کنیم، خواهیم داشت:

/var/www/git-tutorial$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        new file:   tmp1.html
        new file:   tmp2.html

می‌بینیم که افزودن یک . پس از کامند add بدان معنا است که تمام فایل‌های تغییریافته شامل خواهند شد (همچنین از آپشن جایگزین git add -A نیز می‌توان استفاده کرد با این توضیح که این آپشن می‌باید حتماً با حرف بزرگ نوشته شود.)

online-support-icon