diff --git a/docs/general/02-git.md b/docs/general/02-git.md index cd719edc..1e7a1eda 100644 --- a/docs/general/02-git.md +++ b/docs/general/02-git.md @@ -5,7 +5,7 @@ description: '' ## مقدمه -**VCS** یا **کنترلِ نسخه**، سیستمی است که تغییرات را در فایل یا دسته‌ای از فایل‌ها ذخیره می‌کند +**VCS** یا **سیستم کنترلِ نسخه**، سیستمی است که تغییرات را در فایل یا دسته‌ای از فایل‌ها ذخیره می‌کند و به شما این امکان را می‌دهد که در آینده به نسخه و نگارش خاصی برگردید. اگر شما یک گرافیست یا طراح وب هستید و می‌خواهید نسخه‌های متفاوت از عکس‌ها و قالب‌های خود داشته باشید، استفاده از یک **Version Control System** یا **سیستمِ کنترلِ نسخه** انتخاب درستی است. @@ -150,33 +150,85 @@ git log --oneline ### بازگرداندن تغییرات -همانگونه که پیشتر گفته شد یکی از مزایای استفاده از ابزارهای کنترل نسخه امکان بازگشت به عقب و اصلاح اشتباهات است، در این قسمت به راه‌حل‌های موجود می‌پردازیم. +همانگونه که پیشتر گفته شد یکی از مزایای استفاده از ابزارهای کنترل نسخه امکان بازگشت به عقب و اصلاح اشتباهات است، در این قسمت به راه‌حل‌های موجود در گیت می‌پردازیم. -#### amend +#### لغو تغییرات کامیت نشده -یکی از برگشت‌های معمول زمانی صورت می‌گیرد که زودتر از آن‌چه که باید تغییرات را کامیت کرده‌اید -یا بعد از کامیت کردن متوجه مشکلی در فایل‌های کامیت شده یا تگ کامیت می‌شوید. -در این حالت با استفاده از گزینۀ `amend--` می‌توانید فایل‌های استیج شده را به کامیت قبلی اضافه کنید و توضیحات کامیت را نیز ویرایش کنید: +اگر فایل‌ها را تغییر داده‌اید ولی هنوز آنها را commit نکرده‌اید و می‌خواهید آنها را لغو کنید، می‌توانید از این دستور استفاده کنید: ```shell -git commit -m "new description" --amend +git restore +``` + +یا برای لغو تغییرات در تمام فایل‌ها: + +```shell +git restore . ``` -#### restore +#### لغو تغییرات استیج شده -برداشتن داده از حالت استیج شده یکی دیگر از امکانات مورد نیاز می‌باشد: +اگر تغییرات را به staging area اضافه کرده‌اید (با استفاده از git add) ولی هنوز آنها را commit نکرده‌اید و می‌خواهید آنها را از استیج خارج کنید، می‌توانید از این دستور استفاده کنید: -```bash -git restore --staged +```shell +git restore --staged ``` -بازگرداندن فایل به وضعیتی که در آخرین کامیت داشته است یکی از راه‌های معمول برای درست کردن چیزی است که خراب کرده‌ایم؛ -با این کار تمام تغییراتی که از آخرین کامیت بر روی یک فایل صورت گرفته است برگردانده می‌شوند و فایل به وضعیت سابق خود باز می‌گردد: +یا برای خارج کردن تغییرات در تمام فایل‌ها: + +```shell +git restore --staged +``` + +#### برگرداندن کامیت + +اگر می‌خواهید یک commit که قبلاً انجام شده است را لغو کنید، می‌توانید از این دستور استفاده کنید: ```shell -git restore +git revert ``` +این دستور یک commit جدید ایجاد می‌کند که تغییرات انجام شده توسط commit مشخص شده را لغو می‌کند. + +#### ریست کردن به کامیت گذشته + +اگر می‌خواهید اشاره‌گر شاخه خود را به کامیت گذشته برگردانید و تمام کامیت‌های بعد از آن را حذف کنید، می‌توانید از این دستور استفاده کنید: + +```shell +git reset --hard +``` + +هشدار: این کار تمام تغییرات و کامیت‌های بعد از کامیت مشخص شده را حذف می‌کند. + +اگر می‌خواهید تغییرات را در دایرکتوری کاری خود نگه دارید ولی آنها را از حالت کامیت خارج کنید، می‌توانید از این دستور استفاده کنید: + +```shell +git reset --soft +``` + +اگر می‌خواهید تغییرات را در دایرکتوری کاری و ناحیه استیج خود نگه دارید ولی آنها را از حالت کامیت خارج کنید، می‌توانید از این دستور استفاده کنید: + +```shell +git reset --mixed +``` + +#### برگردوندن نسخه قبلی از یک فایل خاص + +اگر می‌خواهید نسخه قبلی از یک فایل خاص را بازگردانید، می‌توانید از این دستور استفاده کنید: + +```shell +git checkout -- +``` + +#### اصلاح آخرین کامیت + +اگر می‌خواهید آخرین کامیت خود را اصلاح کنید (به عنوان مثال برای اضافه کردن تغییرات جدید یا تغییر پیام کامیت)، می‌توانید از این دستور استفاده کنید: + +```shell +git commit -m "new description" --amend +``` + +این دستور به شما اجازه می‌دهد تا تغییرات استیج شده جدید را به کامیت قبلی اضافه کنید و پیام کامیت را ویرایش کنید. توجه داشته باشید که این کار یک کامیت جدید ایجاد می‌کند و هش کامیت قبلی را تغییر می‌دهد. برای آشنایی بیشتر با این مفهوم می‌توانید از لینک زیر استفاده کنید: - [Git Basics - Undoing Things](https://git-scm.com/book/en/v2/Git-Basics-Undoing-Things) @@ -327,6 +379,75 @@ git checkout second-branch git merge first-branch ``` +#### به روزرسانی برنچ‌ها از روی برنچ اصلی + +در حین پروژه ممکن است که تغییراتی در شاخه اصلی بوجود بیاید و لازم است که این تغییرات در شاخه های دیگر نیز اعمال شود. برای به روز رسانی یک شاخه با آخرین تغییرات از شاخه اصلی دو راه وجود دارد: + +##### merge + +حتما چک کنید روی برنچ فیچر خودتون هستید + +```shell +git checkout your-branch +``` + +آخرین تغییرات ریپازیتوری رو بگیرید + +```shell +git fetch origin +``` + +مرجش کنید + +```shell +git merge origin/main +``` + +کانفلیکتی بین برنچ اصلی و شاخه خودتون بود رو حلش کنید + +تغییرات مرج توی برنچ خودتون پوش کنید + +```shell +git push origin your-branch +``` + +##### rebase + +حتما چک کنید روی برنچ فیچر خودتون هستید + +```shell +git checkout your-branch +``` + +آخرین تغییرات ریپازیتوری رو بگیرید + +```shell +git fetch origin +``` + +rebase انجام بدید + +```shell +git rebase origin/main +``` + +کانفلیکتی بین برنچ اصلی و شاخه خودتون بود رو حلش کنید + +بعد + +```shell +git add . +git rebase --continue +``` + +فورس پوش کردن که history هم تغییر پیدا کنه + +```shell +git push origin your-branch --force +``` + +فرق روش دوم با روش اول اینه که هیستوری برنچ دوباره می نویسه و در بالای آخرین کامیت برنچ main قرارش میده و در این صورت کامیت اضافه ای برای merge ایجاد نمیشه + برای آشنایی بیشتر با این مفهوم می‌توانید از لینک‌های زیر استفاده کنید: - [Git Branching - Branches in a Nutshell](https://git-scm.com/book/en/v2/Git-Branching-Branches-in-a-Nutshell)