Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix general git some suggestions #145

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
149 changes: 135 additions & 14 deletions docs/general/02-git.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ description: ''

## مقدمه

**VCS** یا **کنترلِ نسخه**، سیستمی است که تغییرات را در فایل یا دسته‌ای از فایل‌ها ذخیره می‌کند
**VCS** یا **سیستم کنترلِ نسخه**، سیستمی است که تغییرات را در فایل یا دسته‌ای از فایل‌ها ذخیره می‌کند
و به شما این امکان را می‌دهد که در آینده به نسخه و نگارش خاصی برگردید.

اگر شما یک گرافیست یا طراح وب هستید و می‌خواهید نسخه‌های متفاوت از عکس‌ها و قالب‌های خود داشته باشید، استفاده از یک **Version Control System** یا **سیستمِ کنترلِ نسخه** انتخاب درستی است.
Expand Down Expand Up @@ -150,33 +150,85 @@ git log --oneline

### بازگرداندن تغییرات

همانگونه که پیشتر گفته شد یکی از مزایای استفاده از ابزارهای کنترل نسخه امکان بازگشت به عقب و اصلاح اشتباهات است، در این قسمت به راه‌حل‌های موجود می‌پردازیم.
همانگونه که پیشتر گفته شد یکی از مزایای استفاده از ابزارهای کنترل نسخه امکان بازگشت به عقب و اصلاح اشتباهات است، در این قسمت به راه‌حل‌های موجود در گیت می‌پردازیم.

#### amend
#### لغو تغییرات کامیت نشده

یکی از برگشت‌های معمول زمانی صورت می‌گیرد که زودتر از آن‌چه که باید تغییرات را کامیت کرده‌اید
یا بعد از کامیت کردن متوجه مشکلی در فایل‌های کامیت شده یا تگ کامیت می‌شوید.
در این حالت با استفاده از گزینۀ `amend--` می‌توانید فایل‌های استیج شده را به کامیت قبلی اضافه کنید و توضیحات کامیت را نیز ویرایش کنید:
اگر فایل‌ها را تغییر داده‌اید ولی هنوز آنها را commit نکرده‌اید و می‌خواهید آنها را لغو کنید، می‌توانید از این دستور استفاده کنید:

```shell
git commit -m "new description" --amend
git restore <file>
```

یا برای لغو تغییرات در تمام فایل‌ها:

```shell
git restore .
```

#### restore
#### لغو تغییرات استیج شده

برداشتن داده از حالت استیج شده یکی دیگر از امکانات مورد نیاز می‌باشد:
اگر تغییرات را به staging area اضافه کرده‌اید (با استفاده از git add) ولی هنوز آنها را commit نکرده‌اید و می‌خواهید آنها را از استیج خارج کنید، می‌توانید از این دستور استفاده کنید:

```bash
git restore --staged <some-file-name.ext>
```shell
git restore --staged <file>
```

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

```shell
git restore --staged <file>
```

#### برگرداندن کامیت

اگر می‌خواهید یک commit که قبلاً انجام شده است را لغو کنید، می‌توانید از این دستور استفاده کنید:

```shell
git restore <some-file-name.ext>
git revert <commit-hash>
```

این دستور یک commit جدید ایجاد می‌کند که تغییرات انجام شده توسط commit مشخص شده را لغو می‌کند.

#### ریست کردن به کامیت گذشته

اگر می‌خواهید اشاره‌گر شاخه خود را به کامیت گذشته برگردانید و تمام کامیت‌های بعد از آن را حذف کنید، می‌توانید از این دستور استفاده کنید:

```shell
git reset --hard <commit-hash>
```

هشدار: این کار تمام تغییرات و کامیت‌های بعد از کامیت مشخص شده را حذف می‌کند.

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

```shell
git reset --soft <commit-hash>
```

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

```shell
git reset --mixed <commit-hash>
```

#### برگردوندن نسخه قبلی از یک فایل خاص

اگر می‌خواهید نسخه قبلی از یک فایل خاص را بازگردانید، می‌توانید از این دستور استفاده کنید:

```shell
git checkout <commit-hash> -- <file>
```

#### اصلاح آخرین کامیت

اگر می‌خواهید آخرین کامیت خود را اصلاح کنید (به عنوان مثال برای اضافه کردن تغییرات جدید یا تغییر پیام کامیت)، می‌توانید از این دستور استفاده کنید:

```shell
git commit -m "new description" --amend
```

این دستور به شما اجازه می‌دهد تا تغییرات استیج شده جدید را به کامیت قبلی اضافه کنید و پیام کامیت را ویرایش کنید. توجه داشته باشید که این کار یک کامیت جدید ایجاد می‌کند و هش کامیت قبلی را تغییر می‌دهد.
برای آشنایی بیشتر با این مفهوم می‌توانید از لینک زیر استفاده کنید:

- [Git Basics - Undoing Things](https://git-scm.com/book/en/v2/Git-Basics-Undoing-Things)
Expand Down Expand Up @@ -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)
Expand Down