روش بازگردانی پروژه به مرحله قبل بر روی گیت

img
img
img
img
shape
shape
blog-details
05
فروردین
روش بازگردانی پروژه به مرحله قبل بر روی گیت
نویسنده : محمدرضا لیایی
دسته بندی : آموزش گیت کنترلر
زمان مطالعه : 10 دقیقه

در این جلسه قصد داریم تا تمرکز خودمون را بر روی بازگردانی پروژه به مرحله قبل از stage و commit معطوف کنیم. شاید برای شما به عنوان یه برنامه نویس خیلی پیش آمده باشه که چندین سطر کد را به اشتباه نوشته باشید و بخواهید آن را باز گردانید. گیت برای اینگونه موارد تمهیداتی را اندیشیده است. در ادامه این آموزش می خواهیم تمام تمرکز خود را بر روی این دستورات بگذاریم و موارد بسیاری مهم و کاربردی را مطرح کنیم.

در جلسات قبل پروژه تمرینی بسیار ساده ای رو ایجاد کردیم. برای آموزش این جلسه دوباره به این پروژه نیاز داریم. پس بهتر است برای ادامه آموزش به آن پروژه مراجعه کنید و یا اگر صرفا قصد دارید با دستورات جدید گیت آشنا شوید می توانید بدون مراجعه به فایل های پروژه این آموزش را دنبال کنید.

در ابتدا با وارد کردن دستور git status خروجی نرم افزار git را می گیریم.

$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   index.html

no changes added to commit (use "git add" and/or "git commit -a")

همانطور که مشاهده می کنید گیت بر روی فایل index.html تغییراتی را مشاهده کرده است که از جلسه های گذشته داشتیم. می توانیم با استفاده از دستور git diff تغییرات اعمال شده در این فایل را مشاهده کنیم. 

$ git diff
diff --git a/index.html b/index.html
index 5fa8976..7f5043c 100644
--- a/index.html
+++ b/index.html
@@ -8,6 +8,6 @@
     <title>salam</title>
 </head>
 <body>
-
+    <h1>asascript</h1>
 </body>
 </html>
\ No newline at end of file

در جلسات قبل ما بر روی تگ h1 صفحه html تغییراتی را ایجاد کردیم. حال می خواهیم این تغییرات را به مرحله قبل باز گردانیم. با استفاده از دستور زیر می توانیم این کار را انجام دهیم.

دستور checkout

با استفاده از این دستور می توانید کلیه تغییرات ایجاد شده بر روی یک فایل و یا کل پروژه را به قبل از modified بازگردانی کنید. جهت بازگردانی تنها یک فایل از دستور زیر استفاده می کنیم. در اینجا فایل index.html را به حالت قبل باز می گردانیم.

$ git checkout -- index.html

بعد از تغییرات دوباره git status می گیریم. همانطور که در پائین مشاهده می کنید درخت گیت کاملا خالی شده است و تگ h1 از index.html پاک شده است.

$ git status
On branch master
nothing to commit, working tree clean

ممکن است شما بخواهید تمامی تغییرات که در درون stage هستند را به حالت قبل باز گردانید برای انجام این کار تغییراتی را در index.html و style.css ایجاد می کنیم. خروجی دستور git status بعد از تغییرات به صورت زیر است.

$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   index.html
        modified:   style.css

no changes added to commit (use "git add" and/or "git commit -a")

حالا با استفاده از دستور زیر تمامی موارد را به حالت قبل باز می گردانیم.

$ git checkout -- .

و دوباره خروجی git status را می گیریم.

$ git status
On branch master
nothing to commit, working tree clean

درخت کاری کاملا پاک شده است و تغییرات دوباره به حالت اول باز گردانده شده اند.

بازیابی تغییرات از stage

ممکن است شما فایل ها را به مرحله stage برده باشید و حالا بخواهید فایل ها را از stage خارج کنید. در این شرایط باید چه کاری انجام دهیم ؟ برای این گونه موارد کافی است که فایل های stage شده را به مرحله اول بازگردانید. در ادامه آموزش با ما همراه باشید تا مراحل را به حالت قبل بازگردانیم.

در این جا دوباره تغییراتی را بر روی index.html و style.css انجام می دهیم. خروجی git status بعد از اعمال تغییرات به صورت زیر است.

$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   index.html
        modified:   style.css

no changes added to commit (use "git add" and/or "git commit -a")

و به سادگی با وارد کردن دستور git add . تمامی این تغییرات به مرحله stage برده می شود.

$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   index.html
        modified:   style.css

no changes added to commit (use "git add" and/or "git commit -a")
 

نکته: با وارد شدن تغییرات به stage رنگ قسمت modified به رنگ سبز در می آید. این رنگ در حالت unstage به رنگ قرمز است.

 با وارد کردن دستور . git restore --staged می توانیم stage را به unstage تبدیل کنیم. در خروجی بعد از unstage کردن داریم.

$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   index.html
        modified:   style.css

no changes added to commit (use "git add" and/or "git commit -a")پ

الان می توانیم با استفاده از دستور checkout که در بالا به آن اشاره شد به حالت قبل باز گردیم و تغییرات را بازیابی کنیم.

بازگردانی commit  ها به حالت قبل

در پروژه جلسات قبل مورد First step project را بر روی commit قرار دادیم. با استفاده از دستور git log تمامی commit ها را مشاهده می کنید.

commit 26c3027ab5299833f7963a18fa5e7130c54ff91f (HEAD -> master)
Author: asa.web.script@gmail.com <asa.web.script@gmail.com>
Date:   Mon Mar 22 11:57:16 2021 +0430

    First step project

برای درک بهتر روش بازگردانی پروژه و نزدیک شدن آموزش به یک پروژه واقعی git، به چند commit متفاوت نیاز داریم. با توجه به توضیحات جلسه دوم جهت ایجاد commit دو مورد جدید را به پروژه اضافه کرده ایم. برای ایجاد کامیت می توانید از لینک زیر به جلسه دوم مراجعه کنید.

پیشنهاد آسا اسکریپت:آشنایی با دستورات گیت

 

$ git log
commit 900d1c5970a0d080dc6dc3b14f5b507f0b896720 (HEAD -> master)
Author: asa.web.script@gmail.com <asa.web.script@gmail.com>
Date:   Thu Mar 25 13:38:49 2021 +0430

    new contact-us.html file added to the project

commit c3af9a37f3b8e04511515c7f15112302065a6c40
Author: asa.web.script@gmail.com <asa.web.script@gmail.com>
Date:   Thu Mar 25 13:37:17 2021 +0430

    h1 added to the index.html

commit 26c3027ab5299833f7963a18fa5e7130c54ff91f
Author: asa.web.script@gmail.com <asa.web.script@gmail.com>
Date:   Mon Mar 22 11:57:16 2021 +0430

    First step of project
 

نکته: commit ها براساس زمان ایجاد به ترتیب از ابتدا به انتها، دسته بندی می شوند. و هر چقدر یک commit بالاتر باشد رتبه بالاتری از توسعه پروژه دارد.

 

نکته: در جدول commit ها که در قسمت فوق قابل مشاهده کردید همواره بالاترین commit به نام HEAD master شناخته می شود. برای گیت این مورد بسیار مهم است به گونه ای که برای راحتی کاربر دستوراتی را مختص این commit در نظر گرفته است.

 حالا اگر بخواهیم یک commit را بازگردانیم چه کار باید بکنیم ؟ بدین منظور می بایست ابتدا ای دی commit مورد نظر را کپی کنیم و با استفاده از دستور زیر پروژه را به آن کامیت بازگردانی کنیم.

$ git reset (id)
Example: 26c3027ab5299833f7963a18fa5e7130c54ff91f
$ git reset 26c3027ab5299833f7963a18fa5e7130c54ff91f
 

نکته: با اعمال تغییرات بر روی commit تمامی commit ها و تغییراتی که در کامیت های بالاتر از این انجام داده اید پاک می شود. همواره قبل از reset کردن بهتر است که به این مورد توجه داشته باشید. در ادامه همین جلسه با آپشن های دستور reset آشنا می شویم به کمک آن ها می توانیم مدیریتی بر روی این دستور ها داشته باشیم.

 

نکته: همواره قبل از اعمال هر گونه تغییرات بر روی commit ها id کامیت های قبلی را در جایی مطمئن ذخیره کنید تا در صورت پشیمان شدن از تغییرات بتوانید آن ها را به حالت قبل بازگردانید.

 با گرفتن خروجی git log بعد از reset کردن commit داریم.

$ git reset 26c3027ab5299833f7963a18fa5e7130c54ff91f
Unstaged changes after reset:
M       index.html
M       style.css
$ git log
commit 26c3027ab5299833f7963a18fa5e7130c54ff91f (HEAD -> master)
Author: asa.web.script@gmail.com <asa.web.script@gmail.com>
Date:   Mon Mar 22 11:57:16 2021 +0430

    First step project

حالا اگر بخواهیم دوباره commit های جدید تر را باز گردانیم می بایست دوباره از همان دستور reset استفاده کنیم با این تفاوت که به جای id مورد نظر، می بایست id قسمت قبل را که ذخیره کرده ایم برگردانیم.

$ git reset 900d1c5970a0d080dc6dc3b14f5b507f0b896720

با گرفتن دوباره git log داریم:

$ git log
commit 900d1c5970a0d080dc6dc3b14f5b507f0b896720 (HEAD -> master)
Author: asa.web.script@gmail.com <asa.web.script@gmail.com>
Date:   Thu Mar 25 13:38:49 2021 +0430

    new contact-us.html file added to the project

commit c3af9a37f3b8e04511515c7f15112302065a6c40
Author: asa.web.script@gmail.com <asa.web.script@gmail.com>
Date:   Thu Mar 25 13:37:17 2021 +0430

    h1 added to the index.html

commit 26c3027ab5299833f7963a18fa5e7130c54ff91f
Author: asa.web.script@gmail.com <asa.web.script@gmail.com>
Date:   Mon Mar 22 11:57:16 2021 +0430

    First step of project
 

نکته: با وارد کردن دستور reset، فکر کنم به این مورد برخورد کردید که فایل هایی که در commit پایانی اضافه کردیم باقی ماندند و پاک نشدن ! بر روی دستور reset به صورت پیشفرض در صورتی که option مشابهی را وارد نکنید آپشن mixed وارد می شود. این option دستور reset فایل های اضافه شده را پاک نمی کند.

 برای پاک کردن کلیه موارد اضافه شده در کامیت های جدیدتر می توانید از آپشن Hard استفاده کنید. این option کلیه فایل های جدید ایجاد شده به انضمام کلیه تغییرات را از سیستم گیت به طور کامل پاک می کند. دستور زیر تمامی این کارها را به راحتی انجام می دهد.

$ git reset --hard 900d1c5970a0d080dc6dc3b14f5b507f0b896720
 

نکته: با استفاده از این آپشن کلیه تغییرات پاک خواهند شد و دیگر نمی توانید به آن ها دسترسی داشته باشید. می بایست این موضوع را در نظر بگیرید که تنها وقتی از این دستور استفاده کنید که از تغییرات اطمینان کامل دارید.

 جمع بندی:

در این جلسه تمامی تمرکز خودمان را بر روی بازگردانی تغییرات اعمال شده در کد ها و فایل ها تغییر یافته به حالت قبل گذاشتیم و توانستیم فایل ها و کد ها را از حالت stage و commit به خوبی بازگردانی کنیم. همچنین دستور reset و checkout را نیز به جمع کد هایی که از قبل می دانستیم ملحق کردیم.

لیست قسمت های این دوره:
رایگان 20 دقیقه
رایگان 30 دقیقه
رایگان 35 دقیقه
رایگان 15 دقیقه
رایگان 5 دقیقه