چند دستور کاربردی گیت

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

در این جلسه کوتاه قصد داریم تا چند دستور جزئی از دستورهای باقی مانده از گیت را به طور کامل مورد بررسی قرار دهیم. پس سریع به سراغ اصل مطلب می رویم.

دستور stash

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

با پروژه جلسه قبل آموزش را پیش می بریم.

ابتدا در پوشه پروژه راست کلیک کرده و git bash here را انتخاب می کنیم. با انتخاب کردن این گزینه command prompt گیت باز می شود. یک بار بر روی شاخه master ویک بار نیز بر روی شاخه development دستور status را اجرا می کنیم و مطمئن می شویم که شاخه های پروژه پاک هستند.

با توجه به توضیح های جلسه های گذشته، ابتدا می بایست تغییراتی را در پروژه ایجاد کنیم و سپس اقدام به commit کردن آن کنیم. بدین منظور وارد شاخه development شده و سپس در فایل contactus.html بعد از تگ p موجود در تگ body تگی را اضافه می کنیم. در کل فایل contactus.html به صورت زیر در می آید.

Contactus.html
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <header>
        <h1>contactus</h1>
    </header>
    <p>Lorem Ipsum</p>
    <h6>hello asa</h6>
</body>
</html>

در اینجا h6 با عبارت hello asa پر کرده ایم.

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

$ git status
On branch development
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:   contactus.html

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

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

 برای وارد کردن اطلاعات به داخل stash به سادگی دستور زیر را وارد می کنیم.

$ git stash
 

نکته: می بایست فرآیند stash در شاخه ای انجام پذیرد که در درون آن تغییرات را انجام داده ایم. مثلا ما در اینجا تغییرات را در درون شاخه development انجام داده ایم و می بایست حتما در این شاخه عملیات stash را انجام دهیم.

 با وارد کردن این دستور در خروجی داریم:

$ git stash
Saved working directory and index state WIP on development: 1747f0a html added to the development branch

مثل commit ها stash ها نیز دارای یک کد مخصوص به خود هستند و در هنگامی که عبارتی جهت ذخیره سازی stash وارد نشود ایجاد می گردد و در ابتدای commit قرار می گیرد. در اینجا این stash کد 1747f0a را به خود اختصاص داده است که در خروجی به خوبی واضح است. 

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

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

نکته: بعد از خالی کردن شاخه و به stash بردن کلیه تغییرات مشاهده می کنیم که تمامی تغییراتی را که انجام داده ایم دوباره به حالت قبل باز گردیده است و به راحتی با commit کردن stash ها می توانیم آن را باز گردانیم.

 می توانیم با آپشن list از دستور stash تمامی stash ها را مشاهده کنیم.

$ git stash list
$ git stash list
stash@{0}: WIP on development: 1747f0a html added to the development branch

خروجی لیست موارد جالبی را نشان می دهد. لیستی از stash ها را داریم که جلوی هر مورد کد یکتا هر stash را نوشته است به همراه آخرین commit که در آن شاخه داریم. اگر به یاد داشته باشید  html added to the development branch را در جلسه قبل به عنوان آخرین commit وارد کردیم.

برای ادامه کار می بایست یک stash دیگری نیز اضافه کنیم. بدین منظور یک تغییر کوچک در فایل aboutus.html ایجاد می کنیم. 

Aboutus.html
<!doctype html>
<html lang="en">
<head>
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <header>
        <h1>aboutus</h1>
    </header>
    <p>changes on development branch</p>
</body>
</html>

در قطعه کد بالا تغییرات با پاک کردن meta tag utf8 انجام شده است. 

حالا می توانیم دوباره با استفاده از دستور stash آن را در مخزن ذخیره کنیم.

$ git stash
Saved working directory and index state WIP on development: 1747f0a html added to the development branch

و دوباره git stash list می گیریم.

$ git stash list
stash@{0}: WIP on development: 1747f0a html added to the development branch
stash@{1}: WIP on development: 1747f0a html added to the development branch

در خروجی بالا همانطور که در stash ها مشاهده می کنید یک متن تکراری از آخرین commit مدام ذکر شده است. به stash ها می توانیم متن دلخواهی را نیز اضافه کنیم. برای این کار یک تغییر در کد ها ایجاد کرده و سپس دوباره stash دیگری را به این روش ذخیره می کنیم.

Aboutus.html
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <header>
        <h1>aboutus</h1>
    </header>
    <p>changes on development branch</p>
    <p>stash checker</p>
</body>
</html>

تگ p در اینجا با عبارت stash checker در تگ body اضافه شده است.

$ git stash save "p stash checker added"
Saved working directory and index state On development: p stash checker added

دوباره stash list می گیریم.

$ git stash list
stash@{0}: On development: p stash checker added
stash@{1}: WIP on development: 1747f0a html added to the development branch
stash@{2}: WIP on development: 1747f0a html added to the development branch

مورد اول نشان دهنده آخرین stash است که ذخیره شده است.

 

نکته: Stash یک مخزن global پروژه های گیت ما هستند. اگر شما به شاخه master رفته و یکبار git stash list بگیرید مشاهده می کنید که stash های ذخیره شده در شاخه development در آنجا نیز در دسترس هستند و به سادگی می توانید آن ها را در این شاخه اعمال کرده و آن را commit کنید.

 حالا می خواهیم این تغییراتی که در درون stash قرار گرفته است را دوباره به حالت unstage بر گردانیم تا آن ها را commit کنیم. بدین منظور در شاخه development دستور زیر را وارد می کنیم.

$ git stash apply stash@{1}

که در خروجی داریم:

$ git stash apply stash@{1}
On branch development
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:   aboutus.html

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

حالا اگر دستور git status بگیریم مشاهده می کنیم که تغییرات در درون unstage شاخه development قرار گرفته است و حالا می توانیم به راحتی آن را commit کنیم.

 

نکته: برای وارد کردن موارد ذخیره شده در stash به حالت unstage دو آپشن برای دستور stash وجود دارد. با استفاده از آپشن apply می توانیم stash را به unstage بازگردانیم ولی stash ما خالی نمی شود و می بایست به صورت دستی با استفاده از دستورdrop که گفته خواهد شد آن را پاک کنیم. ولی در صورتی که از pop استفاده کنیم به صورت خودکار مخزن stash از مورد unstash شده پاک خواهد شد.

 حالا می توانیم مورد درون unstage را به راحتی commit کنیم.

$ git commit –a –m “meta character removed from header aboutus.html”

از آنجائی که ما از stash شماره یک استفاده کرده بودیم و از دستور apply استفاده نمودیم بهتر است stash کامیت شده را پاک کنیم. بدین منظور از دستور زیر استفاده می کنیم.

$ git stash drop stash@{1}
Dropped stash@{1} (61e33fa6d2d18f3dc6bb3367841f7f2610a7481c)
 

نکته: با استفاده از آپشن drop به سادگی می توانیم هر مورد از stash ها را که بخواهیم پاک کنیم. اگر از دستور apply استفاده کرده اید بهتر است که با استفاده از این آپشن حتما stash را از آن مورد خاص پاک کنید.

 ودوباره git stash list می گیریم  و در خروجی داریم:

$ git stash list
stash@{0}: On development: p stash checker added
stash@{1}: WIP on development: 1747f0a html added to the development branch

تا اینجا به طور کامل با stash آشنا شدیم در قسمت بعد می خواهیم با آپشن amend به صورت کوتاه و کاربردی آشنا شویم.

آپشن amend:

این آپشن یکی از آپشن های دستور git commit است. شما به عنوان یکی از استفاده کنندگان از سیستم گیت می توانید با این دستور آخرین commit وارد شده به سیستم را اصلاح کنید و یا اینکه با استفاده از آن می توانید موارد جدید اضافه شده به staged را در آخرین commit از شاخه ذخیره کنید.

برای مشاهده کاربردی این آپشن یکی از تغییرات منظور شده در stash را خارج کرده و می خواهیم در شاخه development آن را commit کنیم. بدین منظور ابتدا با استفاده از دستور git stash pop استش را به unstage می آوریم و سپس دستور زیر را برای انجام فرآیند کامیت وارد می کنیم. (stash شماره صفر تبدیل می شود.)

$ git commit -a -m "stash checker paragraph added to a!!!!!!!!!"

که در خروجی داریم:

$ git commit -a -m "stash checker paragraph added to a!!!!!!!!!"
git commit -a -m "stash checker paragraph added to agit diffgit diffgit diffgit diff!"
[development be72798] stash checker paragraph added to agit diffgit diffgit diffgit diff!
 1 file changed, 1 insertion(+)

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

$ git commit --amend -m "new ammend test for paragraph"

حالا اگر git log بگیریم مشاهده می کنیم که عبارت توصیفی commit تغییر پیدا کرده است. 

جمع بندی:

در این جلسه دو مورد از موارد کاربردی git را مورد بحث و بررسی قرار دادیم. مورد اول درباره مخزن نگهداری stash بود. گفتیم که با استفاده از این مخزن می توانیم موارد unstage شده را ذخیره کنیم و در هر شاخه ای که به آن نیاز داشتیم مورد استفاده قرار دهیم. در مورد دوم، آپشن  amend را مورد بررسی قرار داده و گفتیم که با استفاده از این آپشن دستور commit به سادگی می توانیم خطاهای اتفاق افتاده در درون توضیحات commit را اصلاح کنیم.

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