راهنمای پیشرفته Git برای مبتدیان – به زبان ساده
اگر با گردش کاری Git برای مبتدیان آشنا هستید و برخی دستورهای مقدماتی مانند add ،commit ،push و pull را میشناسید در این صورت این مقاله برای شما مناسب است. این نوشته به طور عمده روی بهبود استفاده روزمره از Git برای مبتدیان و اصلاح برخی خطاهای رایج متمرکز شده است و گامی به سوی تبدیل شدن به یک کاربر حرفهای Git برای مبتدیان محسوب میشود.
دستور add
اگر بخواهید برخی فایلها را با پسوند خاص در محیط staging خود اضافه کنید، میتوانید همه فایلها را یک به یک اضافه کنید. اما روش دیگر و شاید بهتر آن است که از <پسوند فایل>.* برای شامل کردن همه فایلهای دارای آن پسوند استفاده کنید.
در دستور زیر ما همه فایلهای پایتون را به محیط خود اضافه میکنیم:
git add *.py
اگر میخواهید فایلهای دارای پسوند خاص را اضافه کنید و همچنین نام دایرکتوری را نیز ذکر کنید در این صورت میتواند از دستور زیر بهره بگیرید: دستور زیر همه فایلهای پایتون را از دایرکتوریهای فرعی دایرکتوری models/ اضافه میکند:
git add models/\*.py
دستور clean
اگر برخی فایلها یا پوشههای جدید را به شاخه (branch) خود اضافه کرده باشید و پس از مدتی درک کنید که به آن فایلها یا پوشهها نیاز ندارید، در این صورت باید درخت کاری خود را تمیز کنید. ممکن است فایلهای ردگیری نشدهای در git وجود داشته باشند. فایلهای ردگیرینشده فایلهایی هستند که با استفاده از دستور git add به محیط آن اضافه نشدهاند.
برای این که درخت کاری تمیز بماند، باید دستور زیر را اجرا کنید. این دستور همه فایلها و دایرکتوریهایی که از سوی git ردگیری نمیشوند را حذف میکند:
git clean -df
اگر میخواهید پیش از حذف ببینید که کدام فایلهای ردگیری نشده حذف خواهند شد، در این صورت میتوانید دستور زیر را اجرا کنید:
git clean –dn
دستور rm
اگر بخواهیم برخی فایلها را حذف کنیم، فایلهای ردگیریشده را میتوان با استفاده از این دستور حذف کرد:
git rm <file-path>
اگر فایل شما در محیط staging باشد، در این صورت باید فلگ force را نیز اضافه کنید:
git rm <file-path> -f
اگر بخواهید فایلها را از ریپازیتوری git حذف کنید؛ اما روی سیستم شما همچنان باقی بمانند، در این صورت میتوانید دستور زیر را اجرا کنید:
git rm --cached <file-path>
دستور branch
اگر یک غلط املایی در نام شاخه خود داشته باشید یا بخواهید نام آن را تغییر دهید، در این صورت میتوانید از دستور زیر برای تغییر دادن نام شاخه استفاده کنید:
git branch -m <old-branch-name> <new-branch-name>
اگر میخواهید نام شاخه کنونی را تغییر دهید، در این صورت میتوانید دستور زیر را اجرا کنید:
git branch -m <new-branch-name>
اگر شاخه را قبلاً با نام قدیمی push کردهاید، در این صورت چند گام دیگر هم باید بردارید. باید شاخه قدیمی را از سرور ریموت حذف کرده و شاخه جدید را push کنید:
git push <remote-name> --delete <old-branch-name> git push <remote-name> <new-branch-name>
اگر میخواهید کد شاخه محلی را push کنید؛ اما نام شاخه محلی با نام شاخه ریپازیتوری ریموت تطبیق نمییابد، در این صورت میتوانید دستور زیر را اجرا کنید:
git push <remote-name> <local-branch-name>:<remote-branch-name>
دستور log
اگر میخواهید سوابق commit خود را ببینید، میتوانید از دستور git log استفاده کنید. این دستور اطلاعات زیادی نشان میدهد؛ اما کافی است id مربوط به commit و پیام را ببینید. در این صورت دستور زیر را اجرا کنید:
git log –oneline
دستور فوق خروجی شبیه زیر را به نمایش میگذارد:
هفت کاراکتر اول تصویر فوق، خروجی خلاصه id کامیت هستند و سپس پیام کامیت ارائه شده است. id کامیت بدین دلیل خلاصه شده است که id کامل آن به صورت چهل کاراکتر هگزادسیمال است که یک هش 16 بیتی SHA-1 را شامل میشود. معنی عبارت Head -> master این است که اینک در شاخه مَستر قرار داریم.
اگر میخواهید پیام کامیت یک توسعهدهنده خاص را ببینید، در این صورت باید دستور زیر را اجرا کنید. تصور ما این است که نام توسعهدهنده John Doe است.
git log --author="John Doe"
دستور stash
اگر روی شاخهای کار کرده و برخی تغییرات را در آن ایجاد نمودهاید و اینک میخواهید که خروجی یا کل آن شاخه را پیش از ایجاد تغییرات ببینید، در این صورت میتوانید دستور stash را اجرا کنید. بدین ترتیب درخت کاری را پاکسازی میکنید.
git stash
اگر میخواهید تغییرات را به حالت قبل بازگردانید، در این صورت باید دستور زیر را اجرا کنید:
git stash pop
اگر نمیخواهید آن تغییرات را به حالت قبل بازگردانید، باید دستور زیر را اجرا کنید:
git stash drop
در صورتی که متوجه شده باشید که برخی فایلها را در شاخه نادرستی تغییر دادهاید، میتوانید تغییرات خود را stash کنید و با رفتن به شاخه مورد نظر دستور git stash pop را آنجا اجرا کنید. بدن ترتیب تغییرات در شاخه مطلوب شما صورت میپذیرند.
دستور checkout
در مواردی که بخواهید شاخهای را که روی آن کار میکنید را عوض کنید، میتوانید دستور زیر را اجرا کنید:
git checkout <branch-name>
اگر قبلاً برخی فایلها را در شاخه کنونی تغییر داده باشید، ابتدا باید این تغییرات را stash یا commit بکنید. اگر این کارها را نکنید، این تغییرات در شاخهای که به آن میروید نیز اعمال میشوند که ممکن است حالت مطلوب شما نباشد.
اگر نام شاخه شما به صورت development باشد و بخواهید از development یک شاخه بسازید و مستقیماً به این شاخه جدید سوئیچ کنید میتوانید دستور زیر را اجرا نمایید:
(development)$ git checkout -b <your-new-branch-name>
همچنین میتوانید با استفاده از id کامیت نیز به آن شاخه بروید. در صورتی که پروژهتان زیاد بزرگ نباشد، میتوانید از id کوتاه کامیت با اطمینان استفاده کنید:
git checkout <commit-id>
بدین ترتیب در حالت detached head در گیت قرار میگیرید. Head صرفاً یک ارجاع به کامیت جاری (آخرین کامیت) روی شاخه کنونی محسوب میشود. به طور کلی Head در گیت میتواند به یک شاخه یا کامیت اشاره کند. زمانی که Head به یک شاخه اشاره بکند، گیت مشکلی نخواهد داشت. اما زمانی که Head به یک کامیت اشاره بکند؛ اما به شاخه آن اشاره نکند، گیت به حالت detached head میرود.
اگر میخواهید یک خصوصیت جدید را در این حالت detached head اضافه کنید، در این صورت باید یک شاخه از این حالت بسازید و خصوصیت مورد نظر خود را آنجا ایجاد کنید.
git checkout -b <your-new-branch-name>
دستور commit
اگر پیام کامیت را به تازگی اضافه کردهاید و متوجه شدهاید که یک غلط املایی در آن وجود دارد یا صرفاً میخواهید پیام کامیت شما گویاتر و قابلدرکتر باشد در این صورت میتوانید از دستور گیت زیر استفاده کنید:
git commit --amend -m "your-new-commit-message"
اگر برخی فایلها را اضافه کردید یا یک باگ را اصلاح کردهاید؛ اما نمیخواهید پیام کامیت دیگری را اضافه کنید، در این صورت میتوانید از دستور گیت زیر با فلگ --no-edit استفاده کنید:
git commit --amend -m --no-edit
در اینجا یک نکته بسیار مهم را باید به خاطر بسپارید و آن این است که متمم زدن به کامیت آخر موجب بازنویسی سابقه کامیت میشود. این بدان معنی است که id کامیت زمانی که متمم میزنید، تغییر خواهد یافت.
اگر قبلاً کد خود را در ریپازیتوری ریموت پوش کردهاید و سپس متوجه شدهاید که باید پیام کامیت را amend کنید، در این صورت پس از amend کردن باید یک force push بکنید. اگر نام ریموت شما origin باشد، میتوانید از دستور زیر استفاده کنید:
git push origin <branch-name> -f
دستور reset
اگر میخواهید آخرین کامیت خود را لغو کنید، در این صورت میتوانید دستور git reset را برای لغو کامیت آخر اجرا کنید. این دستور سه فلگ دارد که باید آشنا باشید:
- soft--
- mixed--
- hard--
با فرض این که میخواهید تغییرات صورت گرفته تا added two.txt که دارای id کامیت 96b037c است را ریست کنید، میتوانید از دستور git reset با فلگ soft-- استفاده کنید:
git reset --soft 96b037c
دستور فوق باعث میشود که همه کامیتها پس از id کامیت، یتیم (orphan) شوند؛ اما فایلها حذف نمیشوند. این فایلها در ناحیه staging قرار دارند.
کامیت orphan شده به این معنی است که هیچ مسیر مستقیمی برای ارجاع و دسترسی به آنها وجود ندارد. این کامیتهای یتیم را میتوان به طور معمول با استفاده از git reflog یافته و بازیابی نمود. گیت پس از این که به طور داخلی garbage collector را اجرا کند، این کامیتهای یتیم را حذف میکند. به طور پیشفرض گیت هر 30 روز یک بار garbage collector را اجرا میکند.
بنابراین اگر دستور git status را اجرا کنید، خروجی زیر را مشاهده خواهید کرد:
اگر git log –oneline را اجرا کنید، میبینید که کامیت های قبلی حذف شدهاند:
اگر دستور ریست را با فلگ mixed-- اجرا کنید، در این صورت کامیت ها یتیم میشوند و فایلها دیگر در ناحیه staging قرار ندارند؛ بلکه تنها در سیستم فایل مشاهده میشوند. اگر هیچ فلگی در زمان ریست تعیین نکنید در این صورت گیت به صورت پیشفرض از فلگ mixed-- استفاده میکند.
اگر دستور git status را اجرا کنید، در این صورت خروجی زیر را مشاهده میکنید:
اگر میخواهید فایلها را به طور دائمی حذف کنید، در این صورت میتوانید دستور ریست را با فلگ hard-- اجرا کنید.
رویه مناسبی که میتوانید استفاده کنید، این است که ابتدا دستور ریست را با فلگ –soft اجرا کنید و فایلهای تغییر یافته را ببینید. اگر مطمئن هستید که نمیخواهید این تغییرات را اجرا کنید در این صورت میتوانید دستور را با فلگ hard- اجرا کنید.
شما هرگز نباید وقتی snapshot-ی پس از <commit-id> به ریپازیتوری عمومی پوش میشود از git reset <commit-id> استفاده کنید. حذف یک کامیت که اعضای دیگر تیم همچنان مشغول کار روی آن هستند، موجب بروز مشکلات جدی در فرایند کار تیمی میشود.
دستور revert
اگر روی یک ریپازیتوری عمومی کار میکنید و میخواهید یک کامیت را به حالت قبل بازگردانید، در این صورت میتوانید دستور زیر را اجرا کنید:
git revert <commit-id> --no-commit
پس از اجرا کردن دستور فوق میتوانید فایلهایی که تأثیر پذیرفتهاند را با استفاده از دستور git status ببینید. در این حالت باید از دستور "git commit -m "commit-message استفاده کنید.
git revert موجب یتیم شدن یک کامیت نمیشود. بلکه صرفاً تغییراتی که روی id کامیت لغو شدهاند را به حالت قبل باز میگرداند.
فرض کنید میخواهید کامیت آخر را revert کنید. در این صورت کامیت به شکل زیر در میآید:
پیش از کامیت آخر فایل six.txt اضافه نشده بود، از این رو حذف شده است و five.txt به حالت قبلیاش بازگشته است. اکنون پس از کامیت کردن، سابقه کامیت به شکل زیر در میآید:
اگر میخواهید کامیت های درون یک بازه را revert کنید باید از دستور زیر استفاده کنید:
git revert <oldest-commit-id>..<recent-commit-id> --no-commit
اگر میخواهید چندین کامیت را که درون یک بازه نیستند revert کنید، در این صورت باید id تک تک آنها را ارائه کنید:
git revert <commit-id-1> <commit-id-2> --no-commit
دستور cherry-pick
اگر روی یک شاخه کار میکنید و نیاز دارید که از یک کامیت در شاخه دیگر در شاخه کنونی استفاده کنید، در این صورت میتوانید از دستور cherry-pick برای دریافت آن کامیت در شاخه کنونی استفاده کنید. این دستور هنگامی که در شاخه نادرستی کامیت کرده باشید و بخواهید در شاخه دیگری کامیت کنید نیز مناسب خواهد بود.
ابتدا باید به شاخهای که کامیت کردهاید بروید. Id کامیت را کپی کرده و به شاخه کاری خود بازگردید. سپس دستور زیر را برای بازگرداندن کامیت به شاخه کنونی وارد کنید.
دقت کنید که git cherry-pick مانند کپی کردن چیزی از یک پوشه و چسباندن آن در پوشه دیگر است. بنابراین کامیت را از جایی که cherry-pick شده است حذف نمیکند و id کامیت در شاخه مقصد نیز متفاوت نخواهد بود.
git cherry-pick <commit-id>
اینها دستورهایی بود که کاربران متوسط رو به پیشرفته به آنها نیاز دارند؛ اما این راهنما به هیچ وجه یک راهنمای پیشرفته محسوب نمیشود.
اگر این مطلب برایتان مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای برنامهنویسی
- آموزش تاریخچه گیت (Git) و مقدمات آن
- مجموعه آموزشهای پروژهمحور برنامهنویسی
- چگونه از گیت (Git) به طرز موثرتری استفاده کنیم؟ — به زبان ساده
- نصب گیت (Git) روی اوبونتو — به زبان ساده
- مجموعه آموزشهای علوم کامپیوتر
==
با عرض سلام و تشکر
گمان می کنم در قسمت «دستور clean» جای دو دستور git add و git clean باید جابجا شود.
سلام و وقت بخیر
با تشکر از دقت نظر شما، به نکته صحیحی اشاره کردید و مورد مربوطه اصلاح شد.